问题描述:
同样角色的服务器中有一台服务器CPU持续跑满。配置和另外的服务器完全一样,就是克隆过来的系统,跑的东西完全一样,查看连接数还没以前被克隆那台服务器的连接数高,但CPU已跑满,而其他的服务器基本为30%的使用率 。 如下图所示:
解决过程:
1、登录服务器使用top、vmstat、mpstat分析CPU、软中断、上下文切换的情况,找出问题点。
上面几个图可以看出8核都是100%跑满的,且主要消耗在内核态。软中断、上下文切换都比较正常。
2、使用perf top查看发现主要消耗很多的都在tcp_poll和sock_poll,如下图:
这个tcp_poll说明tcp在等待
3、然后使用strace去抓取进程调用,发现不断的再报EMFILE错误,如下:
4、析这8个mosquitto进程发现他们的socket文件数都差不多在1025附近。这就说明该进程的最大Open files的值应该为1024左右,
查询/proc/pid/limits确认此情况
5、发现用户的软件启动脚本里有个错误:unlimited -n 102400。用户的原意应该想配置最大打开文件数为102400的,但是系统中
并没有unlimited命令,所以这里配置失败了。
修改Max open file的方法:
(1)修改/etc/sysctl.conf,增加
增加fs.file-max=65535
保存后执行sysctl –p使其生效
(2)修改/etc/security/limits.conf,增加如下内容:
* soft nofile 65535
* hard nofile 65535
(3)关闭应用,重新启动应用