1、事發
剛好在外幹活,開發着急上線,就遠端進行上線,過程中發現tomcat出現大量異常日志。
2、報錯日志
java.lang.OutOfMemoryError: unable to create new native thread
3、原因:得知市場部門正在推廣app
4、直接去看接口并發以及資料庫監控,發現接口并發連接配接數峰值在2500左右,全站應用日志都在報錯,就猜到了又是資料庫出現了瓶頸,結果發現是一台從庫cpu100%導緻所有查詢都吭住了。明明兩台從庫可是請求大多數都在了第二台從庫上,告知市場部情況并要求暫時停止推廣,開發修改代碼将部分應用手工指定連接配接到第一台從庫上,問題得到解決。
最開始以為是并發過大導緻的應用記憶體溢出,就做了一些關于程序的線程數量查詢,以下是記錄:
pstree -p <code>ps -ef | grep story-wap|grep -v grep | awk '{print $2}'</code> | wc -l
檢視story-wap程序的線程數量(如果story-wap過濾不出來會統計系統所有的線程數量)
pstree -p <code>ps -ef | grep story-app|grep -v grep | awk '{print $2}'</code> | wc -l
pstree -p <code>ps -ef | grep story-back|grep -v grep | awk '{print $2}'</code> | wc -l
Linux下檢視某個程序的線程數量
有些時候需要确實程序内部目前運作着多少線程,那麼以下幾個方法值得一用。
1.根據程序号進行查詢:
2.根據程序名字進行查詢:
這裡利用了管道和指令替換,
關于指令替換,我也是今天才了解,就是說用<code>括起來的指令會優先執行,然後以其輸出作為其他指令的參數,<br/>上述就是用 ps -e | grep server | awk '{print $1}' 的輸出(程序号),作為 pstree -p 的參數<br/>管道和指令替換的差別是:<br/>管道:管道符号"|"左邊指令的輸出作為右邊指令的輸入<br/>指令替換:将指令替換符"</code>"中指令的輸出作為其他指令相應位置的參數
參考
<a href="http://www.cnblogs.com/myshare/p/5177135.html">http://www.cnblogs.com/myshare/p/5177135.html</a>
kill -9 <code>ps -ef |grep story-app|grep -v grep|awk '{print $2}'</code>
kill -9 <code>ps -ef |grep story-back|grep -v grep|awk '{print $2}'</code>
kill -9 <code>ps -ef |grep story-wap|grep -v grep|awk '{print $2}'</code>
本文轉自 天樂 51CTO部落格,原文連結:http://blog.51cto.com/tianlegg/2054112,如需轉載請自行聯系原作者