我使用的是EC2 t2.small实例(2GB RAM)并且无法在服务器外锁定而无法进入服务器。
错误讯息为ssh_exchange_identification: read: Connection reset by peer
知道应用程序,我认为它泄漏了内存,并且由于这个原因导致SSHD被忽略。
有没有办法允许SSH连接到RAM已满的Linux机箱?
我可以有人为SSHD保留足够的内存用于新连接吗?
答案 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和其他后台过程数据可能就足够了。