我使用的是 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
答案1
解决方案
正如错误消息中所述,您的计算机内存不足。这可能由多种原因造成,但基本上,某些东西占用了您的所有内存,甚至没有剩余内存用于执行基本的命令。
我建议您重新启动 droplet(只需转到客户端控制面板并选择“重新启动”),ssh
然后运行top
或htop
。密切关注内存使用情况,看看哪个进程占用了所有内存。然后,尝试
- 终止/删除有问题的程序/进程
警告:请首先,研究一下该进程是否是必需的系统进程!如果系统进程导致内存问题,不要直接终止它,而要对其进行研究并找到处理它的具体方法。 - 更改该程序/进程的配置,以便它不会占用所有内存。
防止问题再次发生的建议
- 一件好事是添加交换内存,因为如果内存不足,它会分配更多内存。
- 无论何时安装程序,请确保正确配置它们,以免它们以非预期的方式运行(例如占用内存)
- 每次添加软件包或配置任何新程序后,请使用
htop
或top
查看当前程序占用了多少内存。如果您发现几乎占用了所有内存,请尝试清除一些内存,方法是检查并删除不必要的程序/进程。 - 如果有任何自动启动的程序(当然,除了系统进程!)你不认识或不想让其自动启动,请将其删除!但在终止/删除进程之前,请务必研究该进程是什么,因为它可能对于启动过程或系统功能等至关重要。
答案2
要在不重启的情况下摆脱这种情况,您可以触发OOM 杀手手动操作如下:
echo 1 > /proc/sys/kernel/sysrq
echo f > /proc/sysrq-trigger
echo 0 > /proc/sys/kernel/sysrq
参考
答案3
在完成接受的答案时,还有一件事需要考虑:您的系统可能会耗尽文件句柄甚至套接字缓冲区并且仍然拥有大量内存,同时给出相同的错误。如果共享主机施加了此类限制,则尤其如此。在 OpenVZ 系统上,查看
# 猫/proc/user_beancounters
这将在最右边的列中显示第一个超支。如果这是真的,要么转移到更大的托管包,要么找出最可能的罪魁祸首:mysql 或 mariadb 数据库,如果 PHP 应用程序存在缺陷,则可能会每秒泄漏数百个文件句柄。
如果您的网络服务器已将 ssh 开放到互联网并接受用户名/密码登录,也可能会发生这种情况:即使您正在运行 fail2ban,您仍可能会吸引分布式字典破解尝试,这也会消耗大量资源。
答案4
请按照以下步骤操作:
- sudo apt 安装 htop
- sudo htop
- 点击 F6 排序并选择 PERCENT_MEM -> Enter
- 选择您不需要但占用大部分内存的程序(可以使用向上和向下箭头)
- F9 和 SIGKILL