跟踪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