<optgroup id="6y7f6"><small id="6y7f6"></small></optgroup>

<code id="6y7f6"></code>

  • <p id="6y7f6"><tbody id="6y7f6"><ins id="6y7f6"></ins></tbody></p>
    <code id="6y7f6"><form id="6y7f6"></form></code>

      linux 性能自我學習 ———— cpu 高怎么辦 [三]

      前言

      linux 性能分析自我學習。

      正文

      一般我們說cpu,一般是什么高呢? 一般是指cpu 使用率高。

      那么什么是cpu 使用率呢?

      cpu 使用率 = 1- 空閑時間/總cpu 時間

      平均cpu 使用率 = 1 -(new空閑時間 - old 空閑時間)/ (new總cpu時間 - old總cpu時間)

      我們可以使用top 查看:

      那么來看下這些參數的意義:

      1. user (通常為us), 用戶態的時間。(不包含nice的時間,但是包含guest的時間)

      2. nice (ni) 表示低優先級用戶態cpu 時間,也就是進程的nice 值被調整為1-19 之間的cpu 時間。 nice 值可取-20-19,數值越大,優先級越低。

      3. system (sys), 表示內核態cpu 時間。

      4. idle, 代表空閑時間。 注意,它不包含等待 i/o 的時間。

      5. iowait (通常為wa), 表示等待i/o的cpu 時間。

      6. irq(通常為hi),表示處理硬中斷的cpu 時間

      7. softtirq(si), 表示處理軟中斷的cpu時間

      8. steal(st),表示該系統運行在虛擬機中的時候,被其他虛擬機占用的cpu時間。

      9. guest(通??s寫為guest), 代表虛擬化運行其他操作系統的時間,也就是運行虛擬機的cpu時間

      10. guest_nice(通??s寫為gnice),表示低優先級運行虛擬機的時間。

      然后下面是進程占用cpu的時間,但是其中間并沒有分為用戶態使用率和內核態使用率

      那么就需要使用pidstat:

      那么我們怎么定位cpu 高到底是怎么造成的呢?

      一般使用perf 這個工具。

      如果使用perf top 看下,那么是怎么樣的呢?

      第一行包含3個數據, 分別是采樣數, 事件類型event, 事件總數量。

      第二行:

      overhead, 是該符號的性能事件在所有采樣中的比例,用百分號來表示

      shared, 是該函數或指令所在的動態共享對象(dynamic shared object), 如內核,進程名,動態鏈接庫名, 內核模塊名等。

      object, 是動態共享對象的類型,比如. 表示用戶空間的可執行程序或者鏈接庫,而k 表示內核空間

      symbol, 是符號名,也是函數名。當函數未知時候,用十六進制地址表示。

      還可以直接使用perf record 和 perf report。

      perf record 將信息收集起來。

      然后perf report 就打開記錄進行分析。

      一般我們定位到具體的pid的時候,那么會使用:

      perf -g -p xxx
      

      這個-g 表示了,調用關系。

      然后一般我們的web 服務會進行壓測。

      一般使用ab。

      ab -c 10 -n 10000 http://10.254.0.5:10000
      

      這樣去壓測,如果壓測吞吐很低,那么就應該分析性能問題。

      實驗

      實驗:cpu 很高,但是找不到cpu高的應用。

      運行nginx:

      docker run --name nginx -p 10000:80 -itd feisky/nginx:sp
      

      運行php代碼:

      docker run --name phpfdm -itd --network container:nginx feisky/php-fpm:sp
      

      curl 一下:

       curl http://192.168.62.136:10000
      

      發現成功. 壓測一下:

      ab -c 100 -n 1000 http://192.168.62.136:10000/
      

      ab 安裝:

      yum -y install httpd-tools
      

      結果為:

      每秒60多,有點小低了。

      ab -c 5 -t 600 http://192.168.62.136:10000/
      

      通過top 看一下cpu情況:

      發現top 很高,但是進程cpu不高,這怎么說?

      難道還有進程不占用cpu?

      通過pidstat 查看一下:

      cpu 也不高啊。

      通過task 這一行看下,發現就緒隊列有6個:

      詭異的事情出現了,這一排居然沒有發現6個就緒進程。

      那么可能原因是什么呢?

      1. 進程在不停的崩潰重啟,比如因為段錯誤等。 這時候,進程在推出后又被監控系統自動重啟了。

      2. 這些進程是短時進程,也就是在其他應用內部通過exec 調用的外部命令。這些命令一般都只運行很短時間就會結束,你很難用top這種間隔比較長的工具發現。

      用ps tree 查看一下:

      yum -y install psmisc
      

      這里可以看到php-fpm 中啟動了stress,那么是不是stress的問題呢?

      這個時候可以看代碼,其實一般看錯誤日志就知道了。

      這種排查方式比較慢,直接用perf比較好。

      的確看到了stree,但是cpu 使用高還是kernel,內核方法。

      perf record -g
      

      等一段時間看下情況:

      perf report
      

      那么有沒有其他短時進程監控能馬上能查看到的呢? execsnoop.

      centos 怎么安裝呢?

      下載:

      https://github.com/brendangregg/perf-tools
      

      一般我會下載zip,然后解壓。

      然后運行:

      ./perf-tools/perf-tools-master/bin/execsnoop 
      

      不可中斷進程和僵尸進程。

      posted @ 2023-06-01 20:04  敖毛毛  閱讀(42)  評論(0編輯  收藏  舉報
      欧洲黄色网页链接入口,免费A级毛片无码无遮挡久久影院,a免费黄色网址,国产一级黄色的网站
      <optgroup id="6y7f6"><small id="6y7f6"></small></optgroup>

      <code id="6y7f6"></code>

    1. <p id="6y7f6"><tbody id="6y7f6"><ins id="6y7f6"></ins></tbody></p>
      <code id="6y7f6"><form id="6y7f6"></form></code>