服务器挂机; 没有反应,但也没有断开

问候专家,

系统:标准的gentoo安装比没有更多的后缀

当新邮件服务器停止响应时,我昨晚正在进行一个由IMAP驱动的大量电子邮件迁移(一堆Perl脚本)。 但是,我的SSH连接仍然有效,不会丢失。 新的连接挂起(authentication之前),但不要超时。

这是否意味着它最终会恢复? 或者需要我重新启动服务器?

内核的运行可能是熵的。 如果未configuration为使用/ dev / urandom作为随机源,并且服务器无法为/ dev / random生成足够的“真实”随机性,那么至less在Cyrus IMAP服务器上可能会发生这种情况。 你的症状与我多年前遇到的症状相符。

要检查是否是你的情况,让

watch -n1 'cat /proc/sys/kernel/random/entropy_avail' 

要么

 while true; do cat /proc/sys/kernel/random/entropy_avail >>/somepath/available_entropy.txt; sleep 1; done 

运行并查看可用熵在IMAP挂起期间是否不断降至0或接近0。 如果发生这种情况,IMAP服务器软件正在等待新的随机性。

获得更多熵的一种方法是安装rngd ,在Gentoo的情况下,这意味着出现rng工具 ,然后启动rngd (随机数收集守护进程)。 如果真正的随机性过低,​​它会将/ dev / urandom的半随机性铲到/ dev / random。

强制性警告:在超安全的环境中,这不是你想要的。

重新启动是必需的。 等待它,结果什么也没有发生。

经过进一步调查,发现正在使用的Perl IMAP库中存在内存泄漏。 最初,我已经设置了Perl脚本来将所有电子邮件帐户加载到一个数组中(通过命令行上从arg 1引用的文本文件),然后循环遍历每个账户的运行代码。 对于循环的每次迭代,login到源邮件服务器和目标邮件服务器的脚本运行迁移代码,然后注销这两个邮件服务器。 这最终会吃掉所有可用的RAM,然后是所有可用的SWAP,直到最终init终止进程。

我以为我会加快速度:我使用screen来运行这些进程中的9个,每个进程使用不同的帐户。 在启动了其中的9个进程之后,系统迅速放慢速度,然后停止响应。 我猜测init 最终会杀死所有的Perl进程,但是这个避难所需要多长时间? 因此,需要重新启动。

我修改了我的Perl迁移脚本来做一个帐户,然后退出。 然后,我设置一个bash循环来循环所有来自同一个文本文件的帐户:

 # cat run_migration4.sh #!/bin/bash FILE=$1 # read $FILE using the file descriptors exec 3<&0 exec 0<$FILE while read line do # use $line variable to process line echo line: $line ./migration4.pl $line done exec 0<&3 

这工作得非常好。 我能够在一个屏幕会话中运行其中的九个,他们都占用了很less的RAM,没有接近服务器的4G限制。 服务器负载平均值从来没有超过2或3.所有完成没有问题。