-bash:fork:无法分配内存

时间:2017-04-27 08:04:35

标签: linux bash memory ubuntu-16.04

当我在bash shell中运行任何命令时,它返回:

$ free -m
-bash: fork: Cannot allocate memory

然后我尝试使用ps命令调试内存泄漏。它返回:

$ 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

如何调试?核心问题是什么?

4 个答案:

答案 0 :(得分:2)

我的Ubuntu 14.04桌面也遇到了这个问题。

 free -m

即使这些基本命令显示无法分配内存错误。 经过调查,发现系统正在使用所有内存进行缓存,并且没有释放内存。 这称为“缓存膨胀”,通过清除缓存来解决。

答案 1 :(得分:1)

在我的情况下,操作系统用尽了PID而不是内存,但是错误消息是相同的。

最大PID数的默认值为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

答案 2 :(得分:0)

您可能首先要查看系统内存使用情况,看看是否剩余足够的可用内存。

如果没有,这是我的情况,请通过键入ulimit -a检查您的ulimit,看看您是否达到了最大打开文件的限制(主要是由占用大量文件描述符的某些进程引起的) 。在这种情况下,调整ulimit将解决您的问题。

答案 3 :(得分:0)

我有同样的问题。在我的案例中,在使用“ proc / meminfo ”了解了内存的详细信息之后,我通过“ TOP ”发现了使用大量CPU和内存的PID。之后,我用“ ps -o etime = -p“ PID” 检查了它们运行了多长时间。 ”。然后我用“ kill -9 PID ”杀死PID。