如何在内存不足时保持SSH打开

时间:2015-02-24 14:56:21

标签: linux ssh amazon-ec2

我使用的是EC2 t2.small实例(2GB RAM)并且无法在服务器外锁定而无法进入服务器。
错误讯息为ssh_exchange_identification: read: Connection reset by peer
知道应用程序,我认为它泄漏了内存,并且由于这个原因导致SSHD被忽略。

有没有办法允许SSH连接到RAM已满的Linux机箱?
我可以有人为SSHD保留足够的内存用于新连接吗?

4 个答案:

答案 0 :(得分:5)

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

禁用任何进程的OOM杀手:

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

为ssh所有进程禁用OOM Killer:

 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杀手here的更多信息。

答案 1 :(得分:0)

虽然您无法为sshd预分配内存,但您可以设置应用程序的内存限制,使其无法占用所有内存。请参阅man ulimit如何操作。

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

答案 2 :(得分:0)

当用户空间进程使系统耗尽虚拟内存时,内核中没有进程被杀死。由于内存资源不足( malloc(3) sbrk(2)上失败,通常内存不足会在某些过程中转换为尝试增长而无法执行此操作)

通常情况下,所有程序或多或少都设计为能够应对这些错误,但通常情况下(因为内存对于它们运行至关重要),它们会以某种方式终止。这也发生在 sshd(8)上。

解决此问题的昂贵方法是将物理内容添加到您的系统,但如果您不想这样做,那么还有另一种方法,更便宜,但有点令人生畏:是为您的系统添加交换空间。请记住,虚拟内存由真实的,物理内存和虚拟的非实际二级存储内存组成。添加交换到您的系统,至少测试这是否是问题。

答案 3 :(得分:0)

另一种可能的解决方案是分配一些ZRAM。

如果您不使用SWAP文件(由于磁盘限制)并且具有非常有限的RAM,那将会有所帮助。

ZRAM的计算成本较高,因为每次从RAM写入/读取内存项时都需要对其进行压缩/解压缩。

但是完全可以通过RAM压缩来添加300到500MB的RAM。 托管您的GUI和其他后台过程数据可能就足够了。