-bash: fork: 无法分配内存
-bash: fork: Cannot allocate memory
当我 运行 bash shell 中的任何命令时,它 returns:
$ free -m
-bash: fork: Cannot allocate memory
然后我尝试使用 ps
命令调试内存泄漏。它returns:
$ ps --sort -rss -eo rss,pid,command | head
RSS PID COMMAND
518116 1310 /usr/bin/influxd -pidfile /var/run/influxdb/influxd.pid -config /etc/influxdb/influxdb.conf
281700 1912 /opt/td-agent/embedded/bin/ruby /usr/sbin/td-agent --log /var/log/td-agent/td-agent.log --daemon /var/run/td-agent/td-agent.pid
68260 23896 /home/alphauser/Envs/vogo-alpha/bin/python ./manage.py runserver 0.0.0.0:8008
43720 20201 python ./manage.py runserver 0.0.0.0:8008
36928 2223 rsyslogd
27432 1909 /opt/td-agent/embedded/bin/ruby /usr/sbin/td-agent --log /var/log/td-agent/td-agent.log --daemon /var/run/td-agent/td-agent.pid
25296 15009 /usr/bin/telegraf -pidfile /var/run/telegraf/telegraf.pid -config /etc/telegraf/telegraf.conf -config-directory /etc/telegraf/telegraf.d
24428 32529 /usr/sbin/grafana-server --pidfile=/var/run/grafana-server.pid --config=/etc/grafana/grafana.ini cfg:default.paths.data=/var/lib/grafana cfg:default.paths.logs=/var/log/grafana cfg:default.paths.plugins=/var/lib/grafana/plugins
20792 2314 /var/lib/waagent/Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9025/bin/mdsd -A -C -c /var/lib/waagent/Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9025/./xmlCfg.xml -p 29131 -R -r lad_mdsd -e /var/log/azure/Microsoft.OSTCExtensions.LinuxDiagnostic/2.3.9025/mdsd.err -w /var/log/azure/Microsoft.OSTCExtensions.LinuxDiagnostic/2.3.9025/mdsd.warn -o /var/log/azure/Microsoft.OSTCExtensions.LinuxDiagnostic/2.3.9025/mdsd.info
如何调试?核心问题是什么?
您可能首先要检查您的系统内存使用情况,看看是否有足够的可用内存。
如果没有,这是我的情况,请输入 ulimit -a
检查您的 ulimit 以查看您是否已达到最大打开文件的限制(主要是由某些占用大量文件的进程引起的)描述符)。在这种情况下,调整 ulimit 将解决您的问题。
我的 Ubuntu 14.04 桌面也遇到了这个问题。
free -m
即使是这些基本命令也显示无法分配内存错误。
在调查中,发现系统正在使用所有内存进行缓存并且没有释放内存。
这称为缓存膨胀并通过清除缓存解决了这个问题。
我遇到了同样的问题。在我的案例中,在了解了带有“proc/meminfo”的内存细节后,我发现他们使用了很多 CPU 的 PID 和带有“TOP”。之后,我用“ps -o etime= -p "PID"[ 检查了他们有多长时间 运行 =16=]
”。然后我用“kill -9 PID”杀死 PID。
在我的例子中,OS 运行PID 而不是内存不足,但错误消息是相同的。
max PID number默认值为32768,查看数值,运行
cat /proc/sys/kernel/pid_max
要更改最大 pid 编号,运行
echo 100000 > /proc/sys/kernel/pid_max
在我的场景中,根本原因是一个 java 进程产生了 18k+ 个线程(在 linux 内核中,线程本质上是一个进程),找出每个进程的线程数, 运行
ps -eo nlwp,pid,args --sort nlwp
当我 运行 bash shell 中的任何命令时,它 returns:
$ free -m
-bash: fork: Cannot allocate memory
然后我尝试使用 ps
命令调试内存泄漏。它returns:
$ ps --sort -rss -eo rss,pid,command | head
RSS PID COMMAND
518116 1310 /usr/bin/influxd -pidfile /var/run/influxdb/influxd.pid -config /etc/influxdb/influxdb.conf
281700 1912 /opt/td-agent/embedded/bin/ruby /usr/sbin/td-agent --log /var/log/td-agent/td-agent.log --daemon /var/run/td-agent/td-agent.pid
68260 23896 /home/alphauser/Envs/vogo-alpha/bin/python ./manage.py runserver 0.0.0.0:8008
43720 20201 python ./manage.py runserver 0.0.0.0:8008
36928 2223 rsyslogd
27432 1909 /opt/td-agent/embedded/bin/ruby /usr/sbin/td-agent --log /var/log/td-agent/td-agent.log --daemon /var/run/td-agent/td-agent.pid
25296 15009 /usr/bin/telegraf -pidfile /var/run/telegraf/telegraf.pid -config /etc/telegraf/telegraf.conf -config-directory /etc/telegraf/telegraf.d
24428 32529 /usr/sbin/grafana-server --pidfile=/var/run/grafana-server.pid --config=/etc/grafana/grafana.ini cfg:default.paths.data=/var/lib/grafana cfg:default.paths.logs=/var/log/grafana cfg:default.paths.plugins=/var/lib/grafana/plugins
20792 2314 /var/lib/waagent/Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9025/bin/mdsd -A -C -c /var/lib/waagent/Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9025/./xmlCfg.xml -p 29131 -R -r lad_mdsd -e /var/log/azure/Microsoft.OSTCExtensions.LinuxDiagnostic/2.3.9025/mdsd.err -w /var/log/azure/Microsoft.OSTCExtensions.LinuxDiagnostic/2.3.9025/mdsd.warn -o /var/log/azure/Microsoft.OSTCExtensions.LinuxDiagnostic/2.3.9025/mdsd.info
如何调试?核心问题是什么?
您可能首先要检查您的系统内存使用情况,看看是否有足够的可用内存。
如果没有,这是我的情况,请输入 ulimit -a
检查您的 ulimit 以查看您是否已达到最大打开文件的限制(主要是由某些占用大量文件的进程引起的)描述符)。在这种情况下,调整 ulimit 将解决您的问题。
我的 Ubuntu 14.04 桌面也遇到了这个问题。
free -m
即使是这些基本命令也显示无法分配内存错误。 在调查中,发现系统正在使用所有内存进行缓存并且没有释放内存。 这称为缓存膨胀并通过清除缓存解决了这个问题。
我遇到了同样的问题。在我的案例中,在了解了带有“proc/meminfo”的内存细节后,我发现他们使用了很多 CPU 的 PID 和带有“TOP”。之后,我用“ps -o etime= -p "PID"[ 检查了他们有多长时间 运行 =16=] ”。然后我用“kill -9 PID”杀死 PID。
在我的例子中,OS 运行PID 而不是内存不足,但错误消息是相同的。
max PID number默认值为32768,查看数值,运行
cat /proc/sys/kernel/pid_max
要更改最大 pid 编号,运行
echo 100000 > /proc/sys/kernel/pid_max
在我的场景中,根本原因是一个 java 进程产生了 18k+ 个线程(在 linux 内核中,线程本质上是一个进程),找出每个进程的线程数, 运行
ps -eo nlwp,pid,args --sort nlwp