各位专家,
系统:标准 gentoo 安装,与 postfix 差不多。
昨晚,我正在进行一个大型 IMAP 驱动的电子邮件迁移(一堆 Perl 脚本),这时新邮件服务器停止响应。但是,我的 SSH 连接仍然有效,不会断开。新连接挂起(在身份验证之前),但不会超时。
这是否意味着它最终会恢复?还是我需要重新启动服务器?
答案1
也许内核确实耗尽了熵。至少在 Cyrus IMAP 服务器上可能会发生这种情况,如果它未配置为使用/dev/urandom作为随机源,如果服务器无法生成足够的“真实”随机性来/dev/随机。你的症状和我几年前遇到的症状相似。
要检查您是否属于这种情况,请
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 服务器软件正在等待新的随机性。
获得更多熵的一种方法是安装随机数生成器,对于 Gentoo 来说,这意味着出现 rng-tools然后启动随机数生成器(随机数收集守护进程)。如果实际随机性太低,它会将半随机性从 /dev/urandom 铲到 /dev/random。
强制警告:在超安全的环境中这不是您想要的。
答案2
需要重新启动。等待之后没有任何反应。
经过进一步调查,发现所使用的 Perl IMAP 库存在内存泄漏。最初,我设置了 Perl 脚本将所有电子邮件帐户加载到一个数组中(从命令行上参数 1 引用的文本文件),然后循环遍历它们并为每个帐户运行迁移代码。对于循环的每次迭代,脚本都会登录到源邮件服务器和目标邮件服务器,运行迁移代码,然后从两个邮件服务器注销。这最终耗尽了所有可用的 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
效果非常好。我能够在一个屏幕会话中运行其中的九个,它们都占用了少量的 RAM,远没有达到服务器的 4G 限制。服务器负载平均值从未超过 2 或 3。一切都顺利完成。