我们运行一个小型服务器(Ubuntu 14.04)仅用于计算目的。有时,用户会设法消耗足够的内存来冻结系统。上次,罪魁祸首是一个产生 30 个内存消耗子进程的进程。结果是我无法登录机器来修复它 - ssh 和本地登录都超时。 OOM Killer 似乎没有做任何事情。egrep -i 'killed process' /var/log/*
什么也没返回。
在这种情况下有没有办法保持/获得命令行访问权限?
答案1
有一种方法可以限制系统资源的使用。
检查ulimit
命令及其用法。它有一个conf 文件limits.conf
,您可以在其中指定哪些组可以拥有多少资源。例如,如果您在conf文件中指定:
@developers soft nproc 20
@developers hard nproc 30
那么该developers
组只能有 30 个进程,当达到 20 个时,他们会收到警告。您还可以全局限制进程数量ulimit -u 10
- 在这种情况下,用户可以运行 10 个进程。
用于ulimit -a
显示当前限制。要限制内存,请尝试使用ulimit -v
.
user@localhost:~$ 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) 256646
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) 32768
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) 32768
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
答案2
正如马兹在他的回答中提到的那样,您可以采取措施尝试防止这种情况发生。但为了让盒子从任何情况下恢复,即使是你意想不到的情况,你需要一个看门狗。
在 Linux 中,看门狗是一个定期发送“ping”的进程,如果未收到“ping”,系统将重置。当我说“ping”时,我并不是指网络 ICMP 回显请求,而是指“嘿,我还活着”消息。 ping 可以发送到物理看门狗,该看门狗可能会执行诸如重新启动主机以执行重置之类的操作,但它也可以是 Linux 内核中的操作。后者是您最可能想要的,因为硬件看门狗设备通常只在企业级设备中找到。
无论如何,要开始,您首先需要在内核中启用软件看门狗。这可能是最大的障碍。我不知道ubuntu是否启用了看门狗。看看你有/dev/watchdog
没有空。如果没有,请尝试modprobe softdog
。如果两者都不起作用,而您仍然想继续这样做,则需要使用该SOFT_WATCHDOG
选项重新编译内核。
现在,假设您启用了看门狗,您需要安装看门狗包裹。
安装后,将一个脚本放入/etc/watchdog.d
您想要用来执行健康检查的脚本(也可以test-binary
在 中使用watchdog.conf
),并使其可执行。如果你想确保 ssh 正常运行,你可以这样做:
#!/bin/bash
case "$1" in
test)
ssh testuser@localhost /bin/true
;;
repair)
service ssh restart
;;
*)
false
;;
esac
(要完全按照上面的操作,您需要创建testuser
并设置公钥身份验证,但这超出了本答案的范围)
看门狗将调用脚本来test
进行健康检查,repair
如果失败将尝试。如果修复也失败,系统将被重置。
请参阅看门狗文档了解更多详情。