AIX:Resource temporarily unavailable解决

环境:

服务端:

AIX5.3

程序内容:

socket 监听, fork子进程

客户端:

WIN7 HOME

程序内容:

Java socket

问题: 当客户端连续发起10000个请求时,服务端出现错误:fork error: Resource temporarily unavailable.

原因,打开文件数超过当前用户设定上线.查看当前用户的资源使用限制:

ulimit -a

[/home/test] ulimit -a
time(seconds) unlimited
file(blocks) unlimited
data(kbytes) 131072
stack(kbytes) 32768
memory(kbytes) 32768
coredump(blocks) 2097151
nofiles(descriptors) 2000
[/home/mssk/test]

解决:

方法1. 适当增大nofiles数量,不是不是最佳方案,有可能还是超限制

方法2. 对并发数进行限制,保证不超过某个固定值

### vfork 资源暂时不可用问题解决方案 当遇到 `vfork` 返回 "Resource temporarily unavailable" 错误时,通常是因为进程 ID (PID) 数量达到了系统的限制。根据观察到的现象,在 Linux 系统中 `/sys/fs/cgroup/pids/user.slice/user-0.slice/pids.max` 文件显示的最大 PID 数量为 12288[^2]。 #### 解决方案概述 为了增加可用的 PIDs 数量,可以考虑以下几个方面: 1. **调整 cgroups 中 pids 的最大值** 修改 systemd 配置文件来提高允许创建的最大子进程数。具体操作是在 `/etc/systemd/logind.conf` 文件中设置更高的 `UserTasksMax` 值。例如,将其改为更大的数值如 65535 或者取消注释并设为无限大 (`infinity`) 来移除此限制: ```ini UserTasksMax=65535 ``` 2. **重启服务使更改生效** 编辑完成后保存文件,并通过命令 `sudo systemctl daemon-reload && sudo systemctl restart systemd-logind.service` 让新的配置立即起作用。 3. **检查其他可能的影响因素** 尽管当前情况表明 dispatchers 并不是造成连接被拒绝的原因[^1],但仍需确认是否有足够的内存和其他资源供新进程使用。此外,还需排查是否存在过多僵尸进程占用 PID 空间的情况。 4. **优化应用程序逻辑** 对于频繁调用 `vfork()` 的程序来说,应该评估其设计合理性,尝试减少不必要的 fork 操作次数;如果确实需要大量并发处理,则建议采用线程池或其他更高效的方式替代传统多进程模型。 ```bash # 查询当前用户的 pid 限制 cat /sys/fs/cgroup/pids/user.slice/user-$UID.slice/pids.current cat /sys/fs/cgroup/pids/user.slice/user-$UID.slice/pids.max # 设置临时增大 limit(仅限 root 用户) echo $(( $(ulimit -u)*2 )) | sudo tee /proc/sys/kernel/threads-max ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值