1、背景:
由於現網業務量增長過快,需要擴容應用程序服務器,分擔來自前端的訪問壓力。
2、故障:
部署好業務啟動程序后,發現程序運行一小會后不產生新的日志和數據。
3、查問題過程:
1、首先查看程序運行有無報錯
正常
2、查看服務器的負載,會不會是新增服務器的性能影響了程序正常運行
查看io,正常
top查看,正常
內存使用,正常
3、查看應用服務器和前端nginx 的連接
大量的CLOSE-WAIT
連接狀態一看就有問題,CLOSE_WAIT是服務端被動關閉連接的意思(連接狀態詳解)。
4、解決過程:
網上查解決方法一致都是說程序本身的問題導致,如果你的問題是程序造成的,那么按網上的方法改善代碼即可解決。
但是我的新增服務器上的程序都是和原先運行正常的服務器上copy過來的,原服務器運行正常,所以說明不是程序的問題。
從新增服務器本身考慮“被動關閉連接”,會不會是我服務器內核參數配置的連接數太低了。
網上搜的修改連接數的帖子:https://www.jianshu.com/p/fa35d91b727b
經過一番修改,重新啟動程序觀察,問題依舊,實在是找不到和原有服務器配置上的區別了。
本着所有的問題都是有原因的原則,繼續觀察端口狀態的變化:
觀察到一個現象,es狀態暴增后突然變為close_wait,應該就是服務器配置限制了連接數,還是要從服務端查看。
經過我的不斷努力查找,終於找到問題的原因
root用戶和普通用戶的ulimit -a查看到的配置是不同的
查看我程序運行賬號tomcat 的ulimit(ulimit -a 用來顯示當前的各種用戶進程限制。)
ulimit -a 時發現max user processes為1024,代表tomcat用戶的線程數才1024
修改ulimit -u 65535 //此方法是臨時修改
修改永久生效
上面的修改為臨時修改,設置永久生效的方式是編輯/etc/security/limits.conf
* soft nproc 655350 * hard nproc 655350 * soft nofile 655350 * hard nofile 655350
注:sentos6系統中修改/etc/security/limits.conf ,退出shell后重新登陸,依然不行。
報:ulimit: max user processes: cannot modify limit: 不允許的操作 ulimit: open files: cannot modify limit: 不允許的操作
后經Google是/etc/security/limits.d/90-nproc.conf的限制。
解決辦法:https://blog.csdn.net/u014595668/article/details/89279756
修改:
# vim /etc/security/limits.d/90-nproc.conf # Default limit for number of user's processes to prevent # accidental fork bombs. # See rhbz #432903 for reasoning. * soft nproc unlimited root soft nproc unlimited
到這里問題終於解決。