为什么我经常收到“无法分配内存”错误?

我正在使用Ubuntu 12.10和Gnome-Classic。 我经常收到这个错误,几乎所有的程序,无论大小。 当我尝试打开它们时,它们无法启动,而是我收到一条错误消息,指出Could not launch 'Program' - Failed to fork child process (Cannot allocate memory) 。 直到最近几周才出现这个问题。

无法分配内存

我无法辨别导致此错误的程序之间的任何共性。 这似乎更属于时间问题。 我的电脑运行了一段时间后,从一天到几天,我似乎无法启动任何新程序。

我知道防止此错误的唯一方法是重新启动计算机。

为什么我会收到此错误,我该怎么做才能阻止它发生?


我运行了GRUB菜单中提供的memtest,它没有报告任何错误,因此我认为这不是硬件故障。

我也运行了sudo apt-get check ,没有发现任何错误。

这是一些请求的命令行输出:

 $ free -m total used free shared buffers cached Mem: 3945 3753 191 0 181 475 -/+ buffers/cache: 3096 848 Swap: 3813 60 3753 $ swapon -s Filename Type Size Used Priority /dev/sda6 partition 3905532 61648 -1 $ ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 31421 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 31421 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited 

这是ps --sort -rss -eo rss,pid,command | head 错误开始出现后头:

 $ ps --sort -rss -eo rss,pid,command | head RSS PID COMMAND 1963400 2953 gnome-panel 155496 4029 banshee /usr/lib/banshee/Banshee.exe --redirect-log --play-enqueued 104944 15765 /opt/google/chrome/chrome --type=renderer --lang=en-US --force-fieldtrials=ForceCompositingMode/disable/GlobalSdch/global_enable_sdch/InfiniteCache/No/OmniboxDisallowInlineHQP/Standard/OmniboxHUPCreateShorterMatch/Standard/OmniboxHUPCullRedirects/Standard/OmniboxSearchSuggestTrialStarted2012Q4/2/OneClickSignIn/Standard/Prerender/PrerenderEnabled/SBInterstitial/V2/SpdyCwnd/cwndMin10/SpeculativePrefetching/Disabled/Test0PercentDefault/group_01/UMA-Dynamic-Binary-Uniformity-Trial/default/UMA-Session-Randomized-Uniformity-Trial-5-Percent/default/UMA-Uniformity-Trial-1-Percent/group_09/UMA-Uniformity-Trial-10-Percent/group_08/UMA-Uniformity-Trial-20-Percent/group_03/UMA-Uniformity-Trial-5-Percent/group_06/UMA-Uniformity-Trial-50-Percent/group_01/WarmSocketImpact/last_accessed_socket/ --enable-crash-reporter=ECE9000094D279FD3B14B35A74BF72CC,Ubuntu 12.10 --renderer-print-preview --disable-accelerated-2d-canvas --disable-accelerated-video-decode --channel=15654.5.89177240 78164 15654 /opt/google/chrome/chrome 74912 19890 /usr/bin/python /usr/share/oneconf/oneconf-service 65476 12419 /usr/bin/perl /usr/bin/shutter 61096 19626 /usr/bin/python3.2 /usr/sbin/aptd 57832 15708 /opt/google/chrome/chrome --type=renderer --lang=en-US --force-fieldtrials=ForceCompositingMode/disable/GlobalSdch/global_enable_sdch/InfiniteCache/No/OmniboxDisallowInlineHQP/Standard/OmniboxHUPCreateShorterMatch/Standard/OmniboxHUPCullRedirects/Standard/OmniboxSearchSuggestTrialStarted2012Q4/2/OneClickSignIn/Standard/Prerender/PrerenderEnabled/SBInterstitial/V2/SpdyCwnd/cwndMin10/SpeculativePrefetching/Disabled/Test0PercentDefault/group_01/UMA-Dynamic-Binary-Uniformity-Trial/default/UMA-Session-Randomized-Uniformity-Trial-5-Percent/default/UMA-Uniformity-Trial-1-Percent/group_09/UMA-Uniformity-Trial-10-Percent/group_08/UMA-Uniformity-Trial-20-Percent/group_03/UMA-Uniformity-Trial-5-Percent/group_06/UMA-Uniformity-Trial-50-Percent/group_01/WarmSocketImpact/last_accessed_socket/ --enable-crash-reporter=ECE9000094D279FD3B14B35A74BF72CC,Ubuntu 12.10 --extension-process --renderer-print-preview --disable-accelerated-2d-canvas --disable-accelerated-video-decode --channel=15654.2.1555888673 42108 3030 /var/lib/dropbox/.dropbox-dist/dropbox 

根据评论和答案中的建议,似乎问题可能出在Gnome Panel或其applet上。 这是我运行的小程序:

面板小程序

小程序是Indicator Applet 12.10.1 System Monitor 3.5.92System Monitor 3.5.92和“通知区域”。 和“日期和时间”,我都无法访问其中的版本号。

这是一些更多请求的命令行输出:

 $ df -h Filesystem Size Used Avail Use% Mounted on /dev/sda5 19G 12G 6.4G 64% / udev 2.0G 4.0K 2.0G 1% /dev tmpfs 790M 1.1M 789M 1% /run none 5.0M 0 5.0M 0% /run/lock none 2.0G 84K 2.0G 1% /run/shm none 100M 0 100M 0% /run/user /dev/sda7 384G 306G 59G 84% /home mythbuntu@192.168.0.4:/home/mythbuntu 437G 360G 55G 87% /home/dave/Mythbuntu $ sudo du -csh /var/log 15M /var/log 15M total 

有些进程正在泄漏内存。 要了解这可能是哪个过程,请运行

 ps --sort -rss -eo rss,pid,command | head 

我建议你通过使用GRUB启动菜单中提供的内置实用程序测试RAM来启动故障排除过程,并消除“坏RAM”作为问题的根源。

记忆测试 记忆测试

的Memtest86 + 的Memtest86 +

接下来,使用sudo apt-get检查从终端检查系统是否存在损坏的依赖关系,如果发现错误,请将命令重新运行为sudo apt-get check -f以尝试更正它们。

如果您愿意,请尝试以下步骤并在此处报告任何结果。

利兰


嗨戴夫,

好吧 – 我们已经排除了硬件作为问题的根源。

接下来,让我们检查一下计算机上的内存使用情况和进程设置; 从终端提示符运行这些命令:

显示空闲和已用内存的数量

免费-m

显示交换使用摘要

swapon -s

显示用户进程资源限制

ulimit -a

以下屏幕截图来自10.04LTS的全新安装。 从第一个和第二个黄色圆圈项目中注意到的细节位于“已使用”列中,该列显示可供操作系统使用的存储器和交换空间,即它们并非全部用完。

底部带黄色圆圈的项目对用户进程的数量没有限制,例如gFTP或其他应用程序,操作系统将允许用户运行。

如果您愿意,请尝试以下步骤并在此处报告任何结果。

利兰

内存使用和进程资源限制


嗨戴夫,

结果从ps –sort -rss -eo rss,pid,command |返回 你已发布使用大约1.8GB的内存显示gnome-panel进程,看起来有点不寻常 – 这似乎是桌面环境使用的大量内存。

您可以通过运行下面屏幕截图中带圆圈的命令来查看gnome-panel进程正在使用的内存细分,并查看它的全部内容 – 这可能会显示出突出的内容。

为了比较,我的虚拟机上的gnome-panel进程使用了​​48MB的RAM – 但是,这些屏幕截图中的10.04机器是我用于测试而不是我自己的桌面的虚拟机。

来自gnome-panel进程的pmap

鉴于此,我将提出下一步是将问题隔离到Gnome桌面环境中的“某事”。

要测试这一点,请尝试安装您可以在Ubuntu软件中心找到的KDE等离子工作区。

kde等离子桌面环境

一旦安装完毕,重新启动计算机并使用KDE会话而不是Gnome登录,尽可能地运行应用程序(桌面完全不同),以查看“无法分配内存”错误是否在此重复。

简单来说,您将能够像在Gnome环境中一样在KDE环境中运行相同的CLI“测试”,并能够在检查计算机两者之间的行为时比较结果。

在KDE中,您将要查找的控制台应用程序是xterm ,您可以从主菜单上的“搜索”对话框中找到该应用程序。

等离子桌面的xterm pid和pmap

我将在这里投入一点信心,并说我认为我们集中在正确的轨道上来隔离问题。

利兰

在过去几天尝试打开和关闭之后,我有信心现在说问题是时间和日期小程序的天气指示器部分的内存泄漏。 当天气显示时,内存使用量会随着时间的推移而增加。 当天气未显示时,内存不会增加。

我想这是一个应该报告的天气指示器的错误,但是在Launchpad上报告错误对我来说太复杂了。

如果你在使用带有Digital Ocean的 Ruby on Rails时遇到这个问题,可能是因为你的内存太少了。 尝试将RAM从512MB增加到1GB ,这对我来说是固定的。