场景:
常驻内存脚本执行逻辑微信分账接口调用前会加载cert文件,运行一段时间后发现加载文件失败导致调用微信接口失败。
排查过程:
1.问题表象时调用微信接口失败,先查cert文件是否存在。排查后,文件存在。
2.猜测是文件打开太多到达西安痛导致加载失败。马上执行
ulimit -u
cat /proc/sys/fs/file-max
数量设置了10w。查看当前系统文件打开数
lsof -Ki|wc -l
才2k多,陷入死局。
3.后面听说使用了supervisor做进程守护,找到supervisord的进程
ps aux|grep supervisord
cat /proc/xx/limits
发现supervisor的最大文件描述符数量太小(Max open files为1024),被supervisor管理的子进程会继承父进程的文件描述数量限制,导致加载文件失败。修改minfds=10240,问题暂时解决。
4.刨根问题,为啥常驻消费脚本的文件打开数量能大于1024.
ps aux|grep xxxx
lsof -p pid
发现很多CLOSE_WAIT
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
lsof -p pid|awk '{print $10}'|grep 'CLOSE_WAIT'|sort|uniq -c |sort -nr|more
代码单例curl请求微信接口,还是老老实实每次new吧。