跟踪fork: Resource temporarily unavailable的原因

本文通过使用systemtap追踪`fork`函数,详细分析了当出现`Resource temporarily unavailable`错误时的内核执行流程。通过创建大量进程触发问题,发现错误发生在`cgroup_can_fork`调用`pids_can_fork`时,由于`pids.max`限制(默认值12288)。解决方法涉及调整`/etc/systemd/logind.conf`中的`UserTasksMax`值并重启。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

跟踪fork: Resource temporarily unavailable的原因

1) 利用systemtap跟踪fork函数的内核执行流:

linux-d4xo-2:~/temp/stap_test # cat fork_monitor.stp
probe kernel.statement(“copy_process@…/kernel/fork.c:*”)
{
printf("%s\n", pp());
}

开启此监控程序:

stap fork_monitor.stp -o fork_monitor.log

2)另开一个shell,创建大量进程

for ((i=1; i<=13000; i++))
do
sleep 300 &
done

当大于12000以后很快就可以看到以下输出。此时强制重启系统。

-bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: No child processes
-bash: fork: retry: No child processes
-bash: fork: retry: No child processes
-bash: fork: retry: No child processes

3) 重启后vim打开fork_monitor.log,可以找到到出错时的执行流程。

对比源代码,可以看到从1557行跳转到了1662行,然后顺序执行到1701返回error。
因此是cgroup_can_fork行数返回了非零值。

kernel.statement(“copy_process@…/kernel/fork.c

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值