运行任何命令都会在Ubuntu Server上返回“无法分配内存”


16

我正在使用Ubuntu 14.04。最近,当我使用具有sudo特权的用户通过SSH登录时,我运行的每个命令都会导致“无法分配内存”错误。这是我在控制台上尝试过的一些方法

myuser@mymachine:~$ whoami
-bash: fork: Cannot allocate memory
myuser@mymachine:~$ uname -a
-bash: fork: Cannot allocate memory

即使我尝试sudo reboot now也遇到上述错误,所以我不知道还能尝试解锁我的实例什么。主机是DigitalOcean(如果重要)。

编辑:根据此处给出的答案/建议,输出为“免费”

myuser@mymachine:~$ free
-bash: fork: Cannot allocate memory

Answers:


12

如错误消息中所述,您的计算机内存不足。这可能有多种原因,但是从根本上讲,某些事情正在耗尽您的所有内存,甚至根本没有使用任何命令的情况。

我建议您重新启动Droplet(只需转到客户端控制面板并选择“ Reboot”),ssh然后再运行tophtop。密切注意内存使用情况,查看什么进程正在耗尽所有内存。从那里尝试

  1. 杀死/删除有问题的程序/过程

    警告请首先研究过程是否是必要的系统过程!如果系统进程导致了内存问题,请不要仅仅杀死它,对其进行研究并找到处理它的特定方法。
  2. 更改该程序/进程的配置,以免占用整个内存。

有关防止该问题再次发生的建议

  • 好的事情是添加交换内存,因为如果您用完了,它会分配更多的内存。
  • 每当您安装程序时,请确保正确配置它们,以免它们以非预期的方式执行(例如消耗内存)
  • 每次添加软件包或配置完所有新内容后,请使用htoptop查看当前程序正在消耗多少内存。如果您发现几乎全部都在使用,请尝试通过删除不必要的程序/进程来清除其中的某些内容。
  • 如果有任何您无法识别或不想自动启动的东西(当然,除了系统进程之外),请删除它!但是,在终止/删除进程之前,请始终对进程进行研究,因为它对于启动过程或系统功能等至关重要。

7

要在不重新启动的情况下摆脱这种状况,您可以手动触发OOM杀手,如下所示:

echo 1 > /proc/sys/kernel/sysrq
echo f > /proc/sysrq-trigger
echo 0 > /proc/sys/kernel/sysrq

参考


您是否有支持这些命令的文档?为什么不只是sudo sysctl -w vm.oom_kill_allocating_task=1或永久地/etc/sysctl.conf
Pablo Bianchi

1
听起来那不会有所不同,如果这种情况在静态发生,则系统不会达到实际的OOM状态,因为没有进程尝试分配内存,也无法启动其他进程。与半无关,但是在这种状态下您将无法使用sudo或sysctl。
Luke F

这对我有用。不知道如何,不在乎。sudo reboot在运行此程序之前,我什至无法运行。谢谢!
boulder_ruby19

0

完成所接受的答案后,还需要考虑另一件事:您的系统可能用完了文件句柄甚至套接字缓冲区,并且在给出相同错误的同时仍具有大量内存。如果共享主机施加了这种性质的限制,则尤其如此。在OpenVZ系统上,观看以下内容

#cat / proc / user_beancounters

这将在最右边的列中为您提供第一个超限。如果真是这样,请移至更大的主机包或寻找最可能的罪魁祸首:mysql或mariadb数据库,在存在缺陷的PHP应用程序的情况下,泄漏文件每秒可能处理数百个。

如果您的Web服务器已打开ssh并接受用户名/密码登录,也可能会发生这种情况:即使您正在运行fail2ban,您也可能会尝试分布式分布式字典中断,这也会消耗大量资源。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.