java 微服務 服務器 CPU過高 解決經歷

最近在公司壓測,遇到微服務服務器CPU過高的問題。結合之前的經驗積累,我用下面的方式做了定位。


java 微服務 服務器 CPU過高 解決經歷


1-在壓測時間內,做內存的dump,因為這個問題沒有內存洩漏,所以基本還是取內存線程的jstack為主。依次執行如下linux命令:

<code>top    == 獲取佔用cpu高的進程id
jstack [進程id] > /opt/log/test.log ==將當前的進程jstack信息存儲到文件
-------------

top -p [進程id] -H ==獲取進程內佔用cpu高的幾個線程id
printf "%x\\n" [線程id] ==將線程id轉換為16進制
grep -C 10 '[線程id16進制]' test.log == 定位到線程
/<code>

2-通過test.log,可以分析進程內,各線程的狀態,是waiting、timed_waiting還是runnable等。

我這次就發現,我們的waiting、timed_waiting線程數量特別多,結合我們的機器僅僅是兩核cpu,所以在單鏈路優化得差不多的時候,就提出使用四核cpu來壓測,讓更過的cpu來處理這些線程,結果發現吞吐量提升兩倍。

3-通過步驟1中最後三步操作,可以找出典型的線程是什麼原因在消耗cpu,如可能是在競爭鎖等。

這次的經歷中,我們找到logback寫日誌會有鎖等待的問題。查了下資料,說升級到1.2版本會更好,我們也做了升級。還有人說採用logback的異步appender來寫日誌,這個我在本地試了一下,效果不是很好,暫時沒有采用。


java 微服務 服務器 CPU過高 解決經歷


分享到:


相關文章: