服務器CPU使用率過高排查與解決思路

發現服務器的cpu使用率特別高

排查思路:

-使用top或者mpstat查看cpu的使用情況

mpstat -P ALL 2 1

Linux 2.6.32-358.el6.x86_64 (linux—host) 01/05/2016 _x8664 (24 CPU)

04:41:13 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
04:41:15 PM all 0.56 0.00 0.25 0.00 0.00 0.04 0.00 0.00 99.14
04:41:15 PM 0 3.08 0.00 1.03 0.00 0.00 0.51 0.00 0.00 95.38
04:41:15 PM 1 1.50 0.00 0.50 0.00 0.00 0.00 0.00 0.00 98.00
04:41:15 PM 2 0.50 0.00 0.50 0.00 0.00 0.00 0.00 0.00 99.00
04:41:15 PM 3 1.00 0.00 0.50 0.00 0.00 0.00 0.00 0.00 98.51
04:41:15 PM 4 0.50 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.50
04:41:15 PM 5 0.50 0.00 0.50 0.00 0.00 0.00 0.00 0.00 99.00
04:41:15 PM 6 0.50 0.00 0.50 0.00 0.00 0.00 0.00 0.00 99.00
04:41:15 PM 7 0.50 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.50
04:41:15 PM 8 0.50 0.00 0.50 0.00 0.00 0.00 0.00 0.00 99.00
04:41:15 PM 9 0.50 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.50
04:41:15 PM 10 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
04:41:15 PM 11 0.50 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.50
04:41:15 PM 12 1.50 0.00 0.50 0.00 0.00 0.00 0.00 0.00 98.00
04:41:15 PM 13 1.50 0.00 0.50 0.00 0.00 0.00 0.00 0.00 98.00
04:41:15 PM 14 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
04:41:15 PM 15 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
04:41:15 PM 16 0.50 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.50
04:41:15 PM 17 0.50 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.50
04:41:15 PM 18 0.50 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.50
04:41:15 PM 19 0.50 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.50
04:41:15 PM 20 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
04:41:15 PM 21 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
04:41:15 PM 22 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
04:41:15 PM 23 0.00 0.00 0.50 0.00 0.00 0.00 0.00 0.00 99.50

-top找出佔用高的進程ID

-查看進程佔用線程數量,如java:

ps -eLf|grep java|wc -l

1065

解決CPU使用不均或者使用過高的問題

taskset

taskset是LINUX提供的一個命令(ubuntu系統可能需要自行安裝,schedutils package)。他可以讓某個程序運行在某個(或)某些CPU上。

1)顯示進程運行的CPU

taskset -p 3495

pid 3495's current affinity mask: ffffffff

注:顯示結果的ffffffff實際上是二進制32個低位均爲1的bitmask,每個1對應於1個CPU,表示該進程在32個CPU上運行

2)指定進程運行在某個特定的CPU上

taskset -pc 3 3495

顯示結果:

pid 3495's current affinity list: 0-31
pid 3495's new affinity list: 3

注:3表示CPU將只會運行在第4個CPU上(從0開始計數)

3)進程啓動時指定CPU

taskset -c 1 ./redis-server ../redis.conf

系統CPU負載過高、CPU使用率不高的問題

(1)、問題

    線上Tomcat服務器CPU的負載非常高,但是CPU使用率正常,如圖:

    圖片.png

(2)、問題排查

    1、首先查看是哪些進程的CPU佔用率最高(如下可以看到詳細的路徑)

        ps -aux --sort -pcpu | more

        # 定位有問題的線程可以用如下命令

        ps -mp pid -o THREAD,tid,time | more

    2、查看JAVA進程的每個線程的CPU佔用率

        ps -Lp 5798 cu | more        # 5798是查出來進程PID

    3、追蹤線程,查看負載過高的原因,使用JDK下的一個工具

        jstack 5798                        # 5798是PID

        jstack -J-d64 -m 5798       # -j-d64指定64爲系統

        jstack 查出來的線程ID是16進制,可以把輸出追加到文件,導出用記事本打開,

        再根據系統中的線程ID去搜索查看該ID的線程運行內容,可以和開發一起排查。

(3)、常見的處理辦法

    網站相關進程導致負載高處理辦法:
        1、直接把網站php或http或tomcat等網站服務重啓,很多時候負載就降下來了
        2、也可能是網站代碼漏洞導致的,需要反饋開發一起查找原因和處理
        3、把重複的tomcat kill全部掉重新啓動
    mysql進程導致的負載高處理辦法:
        1、常見的就是mysql慢查詢導致,可以在mysql慢查詢日誌找到相關sql語句,這需要對sql進行優化
        2、還可以進入mysql,用show full processlist\G;查看那個mysql進程執行時間比較久的慢查詢。如果是內部後臺使用的語句,可以先kill掉,優化後再執行。
        3、mysql讀寫太頻繁,如果是讀寫頻繁可以在%wa等待輸入輸出看的出來佔用cpu百分比很大。也可以通過命令iostat查看系統讀寫情況。

    還有可能是網絡原因,系統硬件原因等
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章