今天中午 VPN 服务器差点 OOM 了,经 杨博远 提醒,及时登录上去傻掉了出问题的进程,才化险为夷。

原因是这样的:申请 VPN 的时候要执行一个 make-ipsec-secrets.sh,它的第一句是 cp /etc/ipsec.secrets.head /etc/ipsec.secrets,由于前面这个文件不存在了(IPSec 服务尚未恢复),ipsec.secrets 文件就没有被清空(保持原样)。make-ipsec-secrets.sh 脚本的后续过程是以追加方式写入的,这样就越追加越多,每申请一次 VPN,就会把所有人的配置 copy 一次追加到末尾。这个文件本来只有 15299 字节,但经过几天的上百次申请后,已经有 40k+ 行,1905459 字节。

StrongSwan 要把配置读入内存,reload 40K+ 个用户名和密码组合需要比较长的时间,因此有 4 个 pluto(StrongSwan 的工作进程)在忙,每个都占了 50% 的虚拟内存。

教训:脚本里需要确保文件被清空时,可以用 echo >$filename