执行报错”fork failed: Resource temporarily unavailable”¶
在使用 pssh - 并行SSH 时,会 ssh服务 并发访问大量服务器,如果同时使用了 SSH加速 的 ssh多路传输multiplexing加速 方法,就会在系统中保持大量SSH连接进程。此时,可能会出现以下报错:
Traceback (most recent call last):
File "/home/admin/venv2/bin/pssh", line 118, in <module>
do_pssh(hosts, cmdline, opts)
File "/home/admin/venv2/bin/pssh", line 89, in do_pssh
statuses = manager.run()
File "/home/admin/venv2/lib/python2.7/site-packages/psshlib/manager.py", line 68, in run
self.update_tasks(writer)
File "/home/admin/venv2/lib/python2.7/site-packages/psshlib/manager.py", line 133, in update_tasks
self._start_tasks_once(writer)
File "/home/admin/venv2/lib/python2.7/site-packages/psshlib/manager.py", line 146, in _start_tasks_once
task.start(self.taskcount, self.iomap, writer, self.askpass_socket)
File "/home/admin/venv2/lib/python2.7/site-packages/psshlib/task.py", line 99, in start
close_fds=False, preexec_fn=os.setsid, env=environ)
File "/usr/lib64/python2.7/subprocess.py", line 711, in __init__
errread, errwrite)
File "/usr/lib64/python2.7/subprocess.py", line 1224, in _execute_child
self.pid = os.fork()
OSError: [Errno 11] Resource temporarily unavailable
检查ssh进程,可以看到:
ps aux | grep ssh
输出:
admin 101317 0.0 0.0 78828 992 ? Ss 08:46 0:00 ssh: /home/admin/.ssh/demo1-22-admin [mux]
admin 101321 0.0 0.0 78828 3164 ? Ss 08:46 0:00 ssh: /home/admin/.ssh/demo3-22-admin [mux]
admin 101324 0.0 0.0 78828 996 ? Ss 08:46 0:00 ssh: /home/admin/.ssh/demo4-22-admin [mux]
admin 101330 0.0 0.0 78828 3176 ? Ss 08:46 0:00 ssh: /home/admin/.ssh/demo7-22-admin [mux]
...
大量包含 [mux]
的 multiplexing(多路传输)
SSH连接存在,导致执行pssh时无法 os.fork()
出新的ssh连接进程
解决¶
有多种原因可能会导致进程无法 fork
,所以也有不同的解决方法:
可能有大量的服务或进程在运行,需要检查确认进程数量,线程或内存消耗是否符合使用案例的预期,确保不超过限制。单纯提高限制并不能解决进程、线程或内存泄漏导致的资源浪费和不可预期的后果。
当系统运行在一个进程数量有限制状态,增加
/etc/security/limits.conf
的nproc
值或者/etc/security/limits.d/90-nproc.conf
配置。这个限制可以针对特定用户或者所有用户:<user> - nproc 2048 <<<----[ Only for "<user>" user ] * - nproc 2048 <<<----[ For all user's ]
当系统运行出现内存超出,需要定位内存泄漏的应用程序,建议采用 Valgrind内存Debug 来排查应用程序的内存使用情况,并且使用 Kernel Cgroup 来限制进程的资源使用