记一次ss进程莫名其妙挂掉排查
情况是这样的,我这边办公环境是已经科学上网了,也就是在路由器里面配置了ss,大概有20台电脑同时在这个路由器下面,办公上网。断网情况是在中午发生的,就是莫名其妙的断网了,根据经验猜是不是ss进程挂了,路由器连不上了,就断网了。登上服务器一看,果然进程没了,启动后并没多想。可能是人多了 一个进程扛不住了?为了不影响大家的工作,先写个脚本来监控吧,如果挂掉了,立即启动,5秒判断一次,脚本很简单。死循环放到后台即可。
1 #!/bin/bash 2 3 while true; 4 do 5 num=$(ps axu | grep "ssserver" | grep -v "grep" | wc -l) 6 time=$(date "+%Y-%m-%d %H:%M:%S") 7 if [ $num -eq 0 ];then 8 /usr/bin/ssserver -c /etc/shadowsocks.json -d start 9 echo "$time restart" >> /tmp/ss.log 10 11 fi 12 13 sleep 5 14 done
然后,又过了两个小时,又断网了一次。。。握草。这次要彻底排查一下问题了,根据脚本记录是在这个时间重启的。
那就先看一下ss的日志,找到对应时间看发生了啥。。日志是 /var/log/shadowsocks.log
果然是有一个错误,/dev/urandom (or equivalent) not found 导致了进程挂掉,由于我的脚本的问题,所以几秒后又启动了。开始谷歌搜这个错误。。。找了一大圈,貌似没啥解决方法,就看到了下面这个东西,感觉可能是这个问题。。。
Too many open files 打开了太多的文件,看到这个 我想到了进程打开的文件句柄数量,那就继续排查
lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more
以打开文件句柄书排序,第一列是句柄数 第二列是进程PID
排行第一的21643进程打开了668个 那就看下这个进程是谁,不出意外就是ssserver 也就是ss的服务端进程
果然如此,是ss的进程,首先这已经是重启了之后的,我就马上开始排查问题的,就已经打开了668个了,linux进程默认打开句柄数量是1024
[root@ss ~]# ulimit -n 1024
很有可能刚才挂掉的时候,已经超过了这个值了,就导致出错了。那么 就先修改下数量,观察几个小时 看是不是真的是这个原因导致的。
修改文件句柄最大限制,我这里是centos7
vi /etc/systemd/system.conf DefaultLimitCORE=infinity DefaultLimitNOFILE=1024000 DefaultLimitNPROC=1024000
重启才能生效。
这样应该就没啥问题了,所以来写一下记录下来,方便你我他,嘿嘿~~~ ,这种事情 不知道会不会有人遇到,要是万一碰到了呢。。。
再见~~