【人間995】【Linux性能優化】CPU使用率達到100%,怎麼辦?

嗶前嗶言

  • 始終踐行費曼學習法
  • 理解系統知識原理
  • 掌握性能分析工具
  • 多實踐,多思考,多提問
  • 僅記錄我的的學習記錄,歡迎指點糾正

一、什麼是CPU使用率

1.一、CPU

CPU使用率:單位時間內CPU使用狀況的統計,值以%表示
節拍率:每秒鐘的時間中斷次數。內核節拍率(HZ,可配置),用戶空間節拍率(USER_HZ ,固定不可變)php

  • Linux使用CPU
       Linux 多任務操做系統,將每一個CPU時間劃分紅很短的時間片,再經過調度器輪流分配給各個任務使用
  • 維護CPU時間
       先定義節拍率,觸發時間中斷,並使用全局變量Jiffies記錄開機以來的節拍數,發生一次中斷,Jiffies加1

公式:nginx

  •    CPU使用率,就是除了空閒時間外的其餘時間佔總CPU時間的百分比
  • 性能工具計算CPU使用率,取間隔一段時間的2次值,計算平均CPU使用率
    【注,不一樣工具的時間間隔可能會不一致,需設置成一致】

        

1.二、系統CPU和任務統計信息

查詢/proc/stat  docker

  • 第一行表示全部CPU的累加
  • 其餘列表示不一樣場景下CPU的累加節拍數,單位:USER_HZ10ms

image2020-3-21_17-47-16.png

二、怎麼查看CPU使用率

2.一、top命令

  • 顯示了系統整體的CPU和內存使用狀況,以及各個進程的資源使用狀況
  • CPU使用率相關指標:
    user【us】:用戶態的CPU時間,包括guest時間
    nice【ni】:低優先級用戶態CPU時間,nice可取值範圍-20到19,數值越大,優先級反而越低
    system【sys】:內核態CPU時間
    idle【id】:空閒時間。不包括等待I/O時間
    iowait【wa】:等待I/O的CPU時間
    irq【hi】:處理硬中斷CPU時間
    softirq【si】:處理硬中斷的CPU時間
    steal 【st】:處於虛擬機中,被其餘虛擬機佔用CPU時間
    guest【guest】:運行虛擬機CPU時間
    guest nice【gnice】:低優先級運行虛擬機時間

image2020-3-21_17-47-16.png

2.二、pidstat命令

  • 每一個進程CPU使用的詳細狀況
  • 須要關注的內容
    %usr:用戶態CPU使用率
    %system  :內核態CPU使用率
    %guest:運行虛擬機CPU使用率
    %wait:等待CPU使用率
    %CPU:總CPU使用率
    Average:平均值

image2020-3-21_18-10-51.png

沒有看到%wait,顯示區域過小,在文件最下面apache

三、CPU使用率太高怎麼辦?

3.一、perf工具

   可分析系統的各類事件和內核性能,還能夠分析指定應用程序的性能問題性能優化

3.1.一、perf top 採樣

須要關注的內容併發

  • Samples:採樣數
  • event:事件類型
  • Event count:事件總數量
  • Overhead:指該符號的性能事件在全部採用中的比例
  • Shared:指該函數或指令所在的動態共享對象,如:內核、進程名、動態連接庫名等
  • Object:動態共享對象的類型curl

    • [.]表示用戶空間的可執行程序、或者動態連接庫
    • [k]表示內核空間
  • Symbol:表示符號名,即函數名,當函數未命名時用16進制地址表示
3.1.二、perf record

離線保存系統的性能信息,按Ctrl+C終止採樣函數

3.1.三、perf report

解析perf record保存的採樣信息php-fpm

四、案例實踐

4.一、環境準備

  • 機器配置:2CPU,8GB內存
  • 預先安裝docker,sysstat,perf,ab等工具

4.二、操做分析

在第一臺虛擬機上執行下面的命令來運行Nginx和PHP的服務工具

# docker run --name nginx -p 10000:80 -itd feisky/nginx
# docker run --name phpfpm -itd --network container:nginx feisky/php-fpm

第二個終端使用curl訪問http://[VM1的IP]:10000,確認Nginx已經正常啓動。你應該能夠看到It works!的響應。

測試虛擬機的ip地址192.168.153.132

image2020-3-23_16-36-52.png

接着,咱們來測試一下,這個Nginx服務的性能。在第二個終端運行下面的ab命令

# 併發10個請求測試Nginx性能,總共測試100個請求
ab -c 10 -n 100 http://192.168.153.132:10000/

image2020-3-23_16-42-59.png

在第二個終端,將測試的請求總數增長到 10000

# 併發10個請求測試Nginx性能,總共測試10000個請求
ab -c 10 -n 10000 http://192.168.153.132:10000/

這裏能夠看到,系統中有幾個 php-fpm 進程的 CPU 使用率加起來接近 200%;而每一個 CPU 的用戶使用率(us)也已經超過了 98%,接近飽和。

這樣,咱們就能夠確認,正是用戶空間的 php-fpm 進程,致使 CPU 使用率驟升。

接下來,咱們使用perf分析是哪一個函數致使

# -g開啓調用關係分析,-p指定php-fpm的進程號45943
$ perf top -g -p 45943

image2020-3-23_16-49-52.png

拷貝出 Nginx 應用的源碼,看看是否是調用了這兩個函數

image2020-3-23_16-59-25.png

# 中止原來的應用
$ docker rm -f nginx phpfpm
# 運行優化後的應用
$ docker run --name nginx -p 10000:80 -itd feisky/nginx:cpu-fix
$ docker run --name phpfpm -itd --network container:nginx feisky/php-fpm:cpu-fix

image2020-3-23_17-2-16.png
image2020-3-23_17-3-58.png

附錄

一、工具

  • 安裝docker時,啓動docker service一直失敗。

         使用dockerd命令,可查看具體錯誤緣由

  • perf安裝:sudo yum install perf
  • ab(apache bench) HTTP服務性能測試工具

二、引用

  • 《極客時間》Linux性能優化實踐
相關文章
相關標籤/搜索