2015-02-24 110 views
1

我在EC2 t2.small实例(2GB RAM)上,并且在服务器外部不断被锁定而无法进入ssh。
错误消息是ssh_exchange_identification: read: Connection reset by peer
了解应用程序,我认为它泄漏内存,并SSHD因此被盲目掩盖。如何在内存不足时保持SSHD打开

有没有办法让SSH连接到一个内存已满的Linux机器上?
我可以有人让SSHD为新的连接预留足够的内存吗?

回答

0

虽然您不能预先分配内存给sshd,但您可以设置应用程序的内存限制,使其无法占用所有内存。请参阅man ulimit如何做到这一点。

如果是Java应用程序,请尝试使用-Xmx来设置它可以分配的最大内存量。

4

当服务器运行到内存不足时,它通常会杀死多个由OOM(内存不足)控制Killer的应用程序。在你的情况下,当你的服务器进入内存不足时,它会杀死SSH进程以释放内存。我们可以通过禁用OOM杀手SSH过程避免这种情况:

禁用OOM杀手任何进程:

echo -17 > /proc/`pidof Process`/oom_adj 

禁用OOM杀手ssh的所有过程:

pgrep -f "/usr/sbin/sshd" | while read PID; do echo -17 > /proc/$PID/oom_adj; done 

要自动完成这一点,我们需要设置的crontab 1分钟

*/1 * * * * root pgrep -f "/usr/sbin/sshd" | while read PID; do echo -17 > /proc/$PID/oom_adj; done 

你可以阅读更多关于Linux的OOM kille r here

+0

OP所经历的一个更简单的解释是'sshd'由于内存不足而无法分叉。 – Kenster 2015-02-24 20:25:21

0

当用户空间进程使系统用尽虚拟内存时,内核中不会有进程查杀。通常运行内存转换在某些过程中努力成长,是无法做到这一点,由于缺乏存储资源(的malloc(3)失败的SBRK(2)

通常情况下,所有的程序都或多或少地设计来应对这些类型的错误,但通常(因为记忆对他们来说是必不可少的)他们决定以某种方式终止。这发生在sshd(8)也。

昂贵的办法来解决这个问题是添加基于物理的RAM您的系统,但如果你不想这样做,还有另一种方法,更便宜,但有些令人生畏:是添加交换空间到您的系统。请记住,虚拟内存由真实的物理内存和虚拟,非真实的辅助存储内存组成。将交换添加到您的系统,至少要测试这是否是问题。