CPU性能分析和指標


  一、CPU的構成:

  1.【lscpu

  

   2.【vmstst

  

 

 

   buff 緩沖:降低和磁盤交互的頻率,比如垃圾桶,滿了倒垃圾

   cache 緩存:更快的取數據,比如家里的葯箱,只有常用的葯

二、CPU利用率.【top】{他是一個時間百分比,一般的監控是cpu利用的總和,並不能分析是有效利用還是無效利用,要去服務器上看是不是us和sy高}

  看下面圖:PID這一行的%CPU是邏輯和的利用率,雙核可以達到200%,4核的話可以到400%

  圖中的load是平均時間內1分鍾5分鍾15分鍾內的任務數

  

  在期間 敲 1

   

   1.cpu(s):物理核     cps邏輯核

  2.    us:用戶空間

    sy:系統空間

    ni:進程優先級切換(優先級高的進程會搶占cpu,切換多ni就會高)

    id:空閑,wa:等待IO讀寫(磁盤和網絡)

    wa:IO等待(網絡和磁盤,wa過高說明磁盤網絡出現異常

    hi:硬中斷(硬件引起的,比如磁盤,網絡,鍵盤,hi超出10%說明cpu有很嚴重的問題

    si:軟中斷 (cpu陷入到內核空間執行讀寫數據),他是內核層面的,si很高的話,一定是在做數據讀寫,可能是死循環,可能在寫日志(日志級別低、內核層面的系統調用,此時需要打印內核層面的設備日志

    st:虛擬機,用的不多,不用管

    us和sy是有效利用率【us高也可能是代碼問題,sync和yield會導致高】

    其他都是無效利用率

      dmesg | grep sda 硬盤
      dmesg | more 內核
      dmesg | grep eth 網卡日志
      dmesg | head -20 輸出前 20 行設備日志
      dmesg | tail -20 輸出后 20 行日志
      dmesg | grep -i memory 查看內存日志
      dmesg | grep -i usb 查看 usb 日志
      dmesg -c 清空緩沖日志
      watch "dmesg | tail -20" 實時監控設備日志

      日志中出現關鍵字 oom kill ddos等就是有問題了,就要分析

      比如這個,內存溢出,殺死了進程

      

        這個例子就是寫日志,但是沒有空間寫了,導致si很高

      

  3.【watch -d cat /proc/interrupts】查看硬中斷

  

    左邊的數字是中斷號,最右邊的是硬件名稱,對應綁定的cup

  4.【watch -d cat /proc/softirqs】查看軟中斷

      【ethtool -1 eth0】網卡隊列

三、進程和線程

  1.進程:分配資源

  2.線程:任務調度

    a.cpu線程【執行調度】

      1.cpu的核數表示一次性可以調度的任務數

      2.cpu時間片分配

        a.2核調度2個任務

        b.2核調度20個任務,其中18個任務排隊

        c.任務越多時間片越少,切換越快,(切換一定伴隨cpu中斷)導致cpu消耗很高,當時間片用完cpu會切換到下一個任務【被動切換】,下圖in是中斷,cs是切換

          b和c一起就是cpu的上下文切換,計數器【存儲任務位置】和寄存器【存儲任務數據】

          【pidstat -w -p {PID}】查看上下文切換數據

          

 

           cswch 主動切換 (內存不足,io有問題)  nvcswch 被動切換(時間片用完了)

        c.load

          A.平均時間內,系統同步處理的任務數,對應1分鍾5分鍾15分鍾

          B.從左到右,遞減【負載在增加】反之【負載正在降低】

          C.如果雙核load現在是2 目前是滿載狀態,load大於核數,說明是過載狀態,是可以處理的,是在排隊處理  【vmstst 1 10

          

            (1)  load=r+b

            (2)  r  -->runnable 等待資源    running  等待獲取線程鎖

            (3)  b -->black 拿到了線程鎖, 處於不可中斷的狀態

          D.舉個例子:【stress-ng -c 20 -t 100】 此時查看top

          

    b.應用線程【被調度】:將數據編譯成cpu可以識別的內存指令,提交cpu,cpu去調度,cpu的核數越多,同步調度的任務數就越多

      1.tomcat

      2.nginx

      3.mysql

    c.特殊任務對cpu的消耗

      1.tomcat長連接到期,線程釋放

      2.nginx 驚群,線程批量啟動和休眠

    d.系統調用

      敲top,處於用戶空間,敲下之后需要內核空間申請數據,切換到內核空間,內核空間會給出一個api讓用戶調用,在切換到用戶空間調用api。->一次調用,兩次切換

      【strace -o strace.log -tt -p {線程號、進程號}】系統調用日志

    e.進程優先級

      1.NI:優先級系數,范圍-20到+19 【在top下面敲 r    回車   進程號 回車    NI的系數 回車】

      2.PR:值越高,優先級越低

      3.優先級越高,進程獲取的cpu時間片越多,可以搶占cpu

打java堆棧腳本 bash show-busy-java-threads 上傳到服務器,執行可以看到消耗cpu最高的幾個線程打出來

總結幾個常見的問題:

  1.us高:可能是算法問題,函數sync【刷磁盤】和yield【放棄cpu】可能會導致

  2.sy高:a.日志頻繁讀寫,如日志權限不夠或者路徑不存在(cpu利用率會滿),日志級別問題。

      b.內核故障,如內存問題和網絡問題(打印內存日志【dmesg | more】可以看出)

      c.頻繁的系統調用 【strace -o strace.log -tt -p {線程號、進程號}】系統調用日志

 

  3.利用率過低

    a.壓力不夠

    b.參數配置-連接池

      (1)數據庫連接數

      (2)中間件隊列

      (3)tcp隊列

    c.網絡阻塞

      (1)tcp

      (2)socket

      (3)本地網管

      (4)防火牆

  4.內核使用不均衡

    進程綁定cpu  taskset -pc 0-3 pid 進程綁定邏輯核(進程重啟時效)

  5.無效利用

    ni過高:修改進程優先級

    wa過高:磁盤分析,網卡分析(切片多不多,cpu輪詢數據包的總量)

  6.hi  磁盤、網卡(網卡隊列,網卡中斷綁定)

  7.si 內核中斷,參考sy

 

CPU常用命令

mpstat
mpstat -P {cpu l ALL}
mpstat -I SCPU 1 統計軟中斷
pidstat -w -p 查看進程上下文切換
sar -u 1 5 采集cpu使用率
sar -q 1 5 采集進程隊列和負載狀態
ps aux | sort -k3nr |head -n 10 按照按照消耗CPU前10排序的進程
perf top 定位cpu熱點
watch "dmesg | tail -20" 實時監控設備日志
taskset -pc 0-3 pid 進程綁定邏輯cpu
echo 1 > /sys/devices/system/cpu/cpu1/online 開啟邏輯cpu
strace -o strace.log -tt -p 【pid】打印內核日志
sync【刷磁盤】
yield【放棄cpu】
watch -d cat /proc/softirqs 實時查看軟中斷
watch -d cat /proc/interrupts 統計進程中斷的方式
sysstat
mpstat【cpu】
vmstat【cpu】
iostat【磁盤】
netstat【網絡】
pidstat【進程】

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM