即使交换没有完全使用,当内存不足时,我也不能ssh进入远程服务器

我有一个godaddy服务器已经变得没有反应周期性。 这是很难排除故障,因为当它变得没有响应时,我不能ssh进入它。 我想通过添加一个cron作业来pipe理输出从“top”到每5分钟的日志文件。 下一次,我没有响应后,我打开电源循环,我检查了这些日志,发现内存已经超出了,但交换大部分是未使用的。

我正在努力减less这台机器上两台应用程序服务器的内存使用率(结果是有太多的连接被打开了,每台服务器用完了30米,所以打开服务器后,服务器耗尽了内存) d真的很想知道如何确保我可以ssh进入机器。

如果交换文件没有满,那么我会认为服务器有足够的空间来响应,即使这样做太慢了。 有什么办法可以保留一些内存,这样我总是可以进入机器?

以下是服务器正常运行时的样子:

top - 15:13:21 up 3:12, 2 users, load average: 0.15, 0.30, 0.33 Tasks: 127 total, 1 running, 126 sleeping, 0 stopped, 0 zombie Cpu(s): 2.4%us, 1.8%sy, 0.0%ni, 95.7%id, 0.0%wa, 0.0%hi, 0.2%si, 0.0%st Mem: 2064980k total, 1611252k used, 453728k free, 45852k buffers Swap: 2096472k total, 0k used, 2096472k free, 790212k cached 

以下是服务器停止运行之前logging的最后一个日志:

 top - 14:45:08 up 15:20, 0 users, load average: 0.27, 0.16, 0.10 Tasks: 141 total, 2 running, 139 sleeping, 0 stopped, 0 zombie Cpu(s): 2.7%us, 1.9%sy, 0.0%ni, 95.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 2064980k total, 2007652k used, 57328k free, 60496k buffers Swap: 2096472k total, 100k used, 2096372k free, 689584k cached 

请注意,当服务器耗尽ram时,logging“top”输出的cron作业也会停止运行,所以整个服务器显然会停下来。

我之前也遇到过类似的问题,可能会令人讨厌。 正如你提供了很多信息,我将不得不说明一些事情要检查,也是我的问题原来是什么。

首先,检查你的日志。 最值得注意的是在这种情况下dmesg的输出(这是内核环形缓冲区,它转储日志数据)。 这会定期刷新到/ var / log中的一个文件中,尽pipe这取决于您的操作系统。 例如,Red Hat有一个/ var / log / dmesg文件。 你正在寻找任何看起来不寻常的东西,特别是与OOM杀手过程有关的东西。 当RAM开始充满时,程序结束,试图保持服务器的正常运行。 sshd应该免除这一点,但这是如何设置的发行版具体。 指定OOM豁免的现代forms是给sshd一个评分,告诉内核它对整个服务器是多么的珍贵(如果发生严重的RAM情况,应该把它放在远远低于进程列表的地方)。 你的发行版本应该正确设置。

另一件要检查的是,你的服务器有足够的熵与以下内容:

 cat /proc/sys/kernel/random/entropy_avail 

OK值大约在1000-1500以上。 下面和你跑低。 在我的机器上它只能达到4000-5000(这些都是基于我对服务器的观察)。

我有问题login到熵是如此之低(和一代很慢)的应用程序将挂起等待更多的熵可用的服务器。 有一个臭名昭着的Debian Exim错误突出了这一点。 Exim在Debian上使用了GNU TLS,它只使用了/ dev / random,并为每个连接使用了大量的熵。 看到这里 。 当熵耗尽时,Exim只会挂起。 这也会导致其他依赖熵的程序也开始拒绝连接。

由于每个会话都会生成会话密钥,因此sshd需要一个很好的随机数字来源。 虽然它应该使用/ dev / urandom来收集伪随机数,如果/ dev / random阻塞,我不知道sshd是否会这样做。

这个问题在虚拟系统上可能相当严重,因为很多随机数字源不会被传入虚拟机。 熵的主要来源是磁盘I / O,但这通常不会传递给VM。 硬件随机数可能embedded在物理机芯片组/ CPU中的发生器也不太可能被传入虚拟机。

这是一个很好的写在这个问题上。

我在我的服务器的后台运行rngd ,用/ dev / urandom中的数据来提供/ dev / random:

 rngd -r /dev/urandom -o /dev/random 

这不是一个很好的解决scheme,但是当你寻找更好的随机数源的时候,把它们放在一起是非常有用的。 我正在寻找来自不同来源的数据喂养rngd ,但还没有太多的机会。