我正在努力减少该机器上的两个应用程序服务器的ram使用情况(事实证明,有太多的连接被打开了.每个人用完了30米,所以在打开40之后服务器用完了ram),但是我我真的很想知道如何确保我能够进入机器.
如果交换文件未满,那么我认为服务器有足够的空间来响应,即使它的速度很慢.有什么方法可以保留一点内存,以便我可以随时进入机器吗?
以下是服务器正常运行时的示例:
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
这是在服务器停止运行之前记录的最后一个顶级日志:
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 zombie cpu(s): 2.7%us,1.9%sy,95.3%id,0.0%si,2007652k used,57328k free,60496k buffers Swap: 2096472k total,100k used,2096372k free,689584k cached
请注意,当服务器用完ram时,记录“top”输出的cron作业也会停止运行,因此整个服务器显然会停止运行.
解决方法
首先,检查您的日志.最值得注意的是在这种情况下dmesg的输出(这是内核环缓冲区,它转储日志数据).这会定期刷新到/ var / log中的文件,但这完全取决于您的操作系统.例如,Red Hat有一个/ var / log / dmesg文件.您正在寻找与the OOM killer工艺特别相关的任何不寻常的东西.当RAM开始变满并尝试保持服务器启动和响应时,这将结束程序. sshd应该免除这个,但这是关于如何设置的特定发行版.指定OOM豁免的现代形式是给sshd一个分数,告诉内核它对整个服务器有多珍贵(如果发生关键的RAM情况,它应该把它放在要杀死的进程列表中).你的发行版应该正确设置它.
要检查的另一件事是您的服务器具有足够的熵,具有以下内容:
cat /proc/sys/kernel/random/entropy_avail
OK值大约在1000-1500之间.下面和你的跑步低.它在我的机器上只能达到大约4000-5000(这些都是基于我对服务器的观察).
我有登录服务器的问题,其中熵太低(并且生成很慢),应用程序会等待更多的熵可用.有一个臭名昭着的Debian Exim bug突出了这一点. Exim在Debian上使用GNU TLS,它只使用/ dev / random并为每个连接使用大量的熵.见here.当熵耗尽时,Exim就会挂起.它还会导致其他依赖熵的程序也开始拒绝连接.
由于会话密钥是在每个会话中生成的,因此sshd需要一个很好的随机数源.虽然如果/ dev / random阻塞,它应该使用/ dev / urandom来收集伪随机数,但我不确定sshd是否会这样做.
此问题在虚拟系统上可能非常严重,因为许多随机数源未传递到虚拟机.熵的主要来源是磁盘I / O,但这通常不会传递到VM.可能嵌入在物理机的芯片组/ cpu中的硬件随机数生成器也不太可能被传递到虚拟机.
This是一个很好的写在这件事上.
我在我的服务器后台运行rngd,用/ dev / urandom中的数据提供/ dev / random:
rngd -r /dev/urandom -o /dev/random
这不是一个很好的解决方案,但是当你寻找更好的随机数源时,它是一个有用的黑客.我正在考虑用来自不同来源的数据提供rngd,但还没有太多机会这样做.