Linux性能之CPU使用率

来源:https://www.cnblogs.com/galvin007/archive/2020/04/08/12657253.html
-Advertisement-
Play Games

CPU使用率 Linux 通過 /proc 虛擬文件系統,向用戶空間提供了系統內部狀態的信息,而 /proc/stat 提供的就是系統的 CPU 和任務統計信息 proc process information pseudo file system 查詢 man proc 關鍵指標常用參數 user ...


CPU使用率

Linux 通過 /proc 虛擬文件系統,向用戶空間提供了系統內部狀態的信息,而 /proc/stat 提供的就是系統的 CPU 和任務統計信息

proc - process information pseudo-file system
查詢 man proc

關鍵指標常用參數

  • user(通常縮寫為 us),代表用戶態 CPU 時間。註意,它不包括下麵的 nice 時間,但包括了 guest 時間。
  • nice(通常縮寫為 ni),代表低優先順序用戶態 CPU 時間,也就是進程的 nice 值被調整為 1-19 之間時的 CPU 時間。這裡註意,nice 可取值範圍是 -20 到 19,數值越大,優先順序反而越低。
  • system(通常縮寫為 sys),代表內核態 CPU 時間。
  • idle(通常縮寫為 id),代表空閑時間。註意,它不包括等待 I/O 的時間(iowait)。
  • iowait(通常縮寫為 wa),代表等待 I/O 的 CPU 時間。
  • irq(通常縮寫為 hi),代表處理硬中斷的 CPU 時間。
  • softirq(通常縮寫為 si),代表處理軟中斷的 CPU 時間。
  • steal(通常縮寫為 st),代表當系統運行在虛擬機中的時候,被其他虛擬機占用的 CPU 時間。
  • guest(通常縮寫為 guest),代表通過虛擬化運行其他操作系統的時間,也就是運行虛擬機的 CPU 時間。
  • guest_nice(通常縮寫為 gnice),代表以低優先順序運行虛擬機的時間

工具使用

top

[root@k8s ~]# top
top - 15:16:08 up 4 days,  3:12,  1 user,  load average: 3.77, 2.88, 2.52
Tasks: 255 total,   1 running, 254 sleeping,   0 stopped,   0 zombie
%Cpu0  : 99.7 us,  0.3 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu1  : 42.3 us,  4.8 sy,  0.0 ni, 50.2 id,  0.7 wa,  0.0 hi,  2.0 si,  0.0 st
KiB Mem :  8173864 total,   753088 free,  3961556 used,  3459220 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  3474088 avail Mem

 PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 3482 root      20   0 2430460   1224    760 S  93.7  0.0 832:50.08 kswapd0
29995 root      20   0 5279240  26508   1760 S  64.2  0.3  25:58.04 tsm
 2928 root      20   0 1485424 171912  36504 S   6.6  2.1 317:33.63 kubelet
18035 root      20   0  164248   2480   1612 R   0.3  0.0   0:00.53 top

// top 預設顯示的是所有 CPU 的平均值,這個時候你只需要按下數字 1 ,就可以切換到每個 CPU 的使用率了。

S 列(也就是 Status 列)表示進程的狀態
進程的狀態主要有以下幾個:

  • R 是 Running 或 Runnable 的縮寫,表示進程在 CPU 的就緒隊列中,正在運行或者正在等待運行。
  • D 是 Disk Sleep 的縮寫,也就是不可中斷狀態睡眠(Uninterruptible Sleep),一般表示進程正在跟硬體交互,並且交互過程不允許被其他進程或中斷打斷。
  • Z 是 Zombie 的縮寫,它表示僵屍進程,也就是進程實際上已經結束了,但是父進程還沒有回收它的資源(比如進程的描述符、PID 等)。
  • S 是 Interruptible Sleep 的縮寫,也就是可中斷狀態睡眠,表示進程因為等待某個事件而被系統掛起。當進程等待的事件發生時,它會被喚醒併進入 R 狀態。
  • I 是 Idle 的縮寫,也就是空閑狀態,用在不可中斷睡眠的內核線程上。前面說了,硬體交互導致的不可中斷進程用 D 表示,但對某些內核線程來說,它們有可能實際上並沒有任何負載,用 Idle 正是為了區分這種情況。要註意,D 狀態的進程會導致平均負載升高, I 狀態的進程卻不會。

pidstat

  • 用戶態 CPU 使用率 (%usr);
  • 內核態 CPU 使用率(%system);
  • 運行虛擬機 CPU 使用率(%guest);
  • 等待 CPU 使用率(%wait);
  • 總的 CPU 使用率(%CPU)。
[root@k8s ~]# pidstat 1 5
Linux 3.10.0-1062.4.1.el7.x86_64 (instance-010oj085) 	04/06/2020 	_x86_64_	(2 CPU)

03:23:11 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
03:23:12 PM     0      1403    0.00    0.97    0.00    0.97     1  kube-controller
03:23:12 PM     0      1638    0.97    0.00    0.00    0.97     1  etcd
03:23:12 PM     0      2492    0.00    1.94    0.00    1.94     1  pidstat
03:23:12 PM     0      2574    0.00    0.97    0.00    0.97     1  hosteye
03:23:12 PM     0      2928    1.94    0.97    0.00    2.91     1  kubelet
03:23:12 PM     0      3233    0.97    0.00    0.00    0.97     1  kube-apiserver
03:23:12 PM     0      3482  100.00    0.00    0.00  100.00     1  kswapd0

perf

perf 是 Linux 2.6.31 以後內置的性能分析工具。它以性能事件採樣為基礎,不僅可以分析系統的各種事件和內核性能,還可以用來分析指定應用程式的性能問題。可以查找熱點函數。

[root@k8s ~]# perf top
Samples: 75K of event 'cycles', 4000 Hz, Event count (approx.): 26597196684 lost: 0/0 drop: 0/0
Overhead  Shared Object                   Symbol
   1.57%  kswapd0                         [.] 0x00000000001c8641     
   1.10%  perf-3482.map                   [.] 0x00007fdbbf621e8c     
   0.68%  tsm64                           [.] 0x000000000002f147    
   0.61%  kswapd0                         [.] 0x00000000001c8647   
   0.60%  perf-3482.map                   [.] 0x00007fdbbf621eb5
  • 輸出結果中,第一行包含三個數據,分別是採樣數(Samples)、事件類型(event)和事件總數量(Event count)。
  • 第一列 Overhead ,是該符號的性能事件在所有採樣中的比例,用百分比來表示。
  • 第二列 Shared ,是該函數或指令所在的動態共用對象(Dynamic Shared Object),如內核、進程名、動態鏈接庫名、內核模塊名等。
  • 第三列 Object ,是動態共用對象的類型。比如 [.] 表示用戶空間的可執行程式、或者動態鏈接庫,而 [k] 則表示內核空間。
  • 最後一列 Symbol 是符號名,也就是函數名。當函數名未知時,用十六進位的地址來表示。

dstat

dstat可以讓你實時地看到所有系統資源,例如,你能夠通過統計IDE控制器當前狀態來比較磁碟利用率,或者直接通過網路帶寬數值來比較磁碟的吞吐率(在相同的時間間隔內)

[root@k8s ~]# dstat
You did not select any stats, using -cdngy by default.
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read  writ| recv  send|  in   out | int   csw
 67   3  29   0   0   1|4910B  470k|   0     0 |   0     0 |3645  4917
 89   3   6   0   0   3|   0   724k| 394k  267k|   0     0 |5252  4447
 90   4   5   0   0   2|   0   140k| 362k  230k|   0     0 |4917  4281
 84   3  12   0   0   2|   0  4096B| 287k  196k|   0     0 |4854  4481
 84   4  11   0   0   1|   0   216k| 360k  235k|   0     0 |5246  5545

預設輸出信息:

  • CPU狀態:CPU的使用率。這項報告更有趣的部分是顯示了用戶,系統和空閑部分,這更好地分析了CPU當前的使用狀況。如果你看到"wait"一欄中,CPU的狀態是一個高使用率值,那說明系統存在一些其它問題。當CPU的狀態處在"waits"時,那是因為它正在等待I/O設備(例如記憶體,磁碟或者網路)的響應而且還沒有收到。

  • 磁碟統計:磁碟的讀寫操作,這一欄顯示磁碟的讀、寫總數。

  • 網路統計:網路設備發送和接受的數據,這一欄顯示的網路收、發數據總數。

  • 分頁統計:系統的分頁活動。分頁指的是一種記憶體管理技術用於查找系統場景,一個較大的分頁表明系統正在使用大量的交換空間,或者說記憶體非常分散,大多數情況下你都希望看到page in(換入)和page out(換出)的值是0 0。

  • 系統統計:這一項顯示的是中斷(int)和上下文切換(csw)。這項統計僅在有比較基線時才有意義。這一欄中較高的統計值通常表示大量的進程造成擁塞,需要對CPU進行關註。你的伺服器一般情況下都會運行運行一些程式,所以這項總是顯示一些數值

pstree

// 指定 pid 查找父進程
[root@k8s ~]# pstree -aps 18035
systemd,1 --switched-root --system --deserialize 22
  `-sshd,2504 -D
      `-sshd,16674
          `-bash,16676
              `-top,18035

總結

  • 用戶 CPU 和 Nice CPU 高,說明用戶態進程占用了較多的 CPU,所以應該著重排查進程的性能問題。
  • 系統 CPU 高,說明內核態占用了較多的 CPU,所以應該著重排查內核線程或者系統調用的性能問題。
  • I/O 等待 CPU 高,說明等待 I/O 的時間比較長,所以應該著重排查系統存儲是不是出現了 I/O 問題。
  • 軟中斷和硬中斷高,說明軟中斷或硬中斷的處理程式占用了較多的 CPU,所以應該著重排查內核中的中斷服務程式。

進程狀態

ps 或者 top ,可以查看進程的狀態,這些狀態包括運行(R)、空閑(I)、不可中斷睡眠(D)、可中斷睡眠(S)、僵屍(Z)以及暫停(T)等。

  • 不可中斷狀態,表示進程正在跟硬體交互,為了保護進程數據和硬體的一致性,系統不允許其他進程或中斷打斷這個進程。進程長時間處於不可中斷狀態,通常表示系統有 I/O 性能問題。
  • 僵屍進程表示進程已經退出,但它的父進程還沒有回收子進程占用的資源。短暫的僵屍狀態我們通常不必理會,但進程長時間處於僵屍狀態,就應該註意了,可能有應用程式沒有正常處理子進程的退出。

常見問題

CPU使用率很高,通過top等命令找不到相應的進程

  • 應用里直接調用了其他二進位程式,這些程式通常運行時間比較短,通過 top 等工具也不容易發現。
  • 應用本身在不停地崩潰重啟,而啟動過程的資源初始化,很可能會占用相當多的 CPU。

對於這類進程,我們可以用 pstree 或者 execsnoop 找到它們的父進程,再從父進程所在的應用入手,排查問題的根源。

學習筆記
來自極客時間:《Linux性能優化實戰》


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在這篇文章中,我將詳細介紹在ASP.NET Core中使用appsettings.json文件的重要性。這篇文章,我將詳細介紹下麵幾個問題:在ASP.NET Core應用程式中,有哪些不同的配置資源可用呢?什麼是ASP.NET Core appsetting.json文件?在ASP.NET Core ...
  • 在進行 Asp.NetCore.MVC 文件上傳時,後臺無法正常讀取文件流保存,出現:Synchronous operations are disallowed. Call WriteAsync or set AllowSynchronousIO to true instead. 查找資料,發現需要 ...
  • 首先以Winform項目開發舉例 1.完整的學習計劃 2.對於學習內容分類 3.良好的學習習慣 4.項目實踐 學習計劃 1.基礎篇 2.提高篇 3.應用篇 內容分類 1.語法 2.控制項 3.業務邏輯 學習習慣 1.時間安排 2.進度安排 3.記錄筆記 4.練習寫代碼 項目實踐 1.實現頁面展示 2. ...
  • [TOC] 都是迭代,為啥我一定要用foreach ​ 問題起源於本人的一個練手的撲克牌程式:洗完牌之後要發給場上的三人。 ​ 只發給單個人的時候用 foreach 迴圈一下就好了,但三個人就有點麻煩了。 ​ 牌組用list保存你可能會想到這樣寫: 對於字典,可以使用 : 可能各位早會這樣弄了,讓各 ...
  • 這篇文章,我將帶領大家學習ASP.NET Core中的launchSettings.json文件。為了學習它,我們打開之前建的空白模板的ASP.NET Core項目。 從上面的圖片中你可以看到,我們項目的屬性中有一個launchSettings.json文件。那麼我們來一起學習這個重要的文件吧。la... ...
  • 在C#中,struct和class都是用戶定義的數據類型,struct和class有許多不同之處,但主要的區別是: Class是引用類型,它保存在堆上並且能夠被垃圾回收;然而stuct是值類型,它保存在棧上或者內嵌在它的包含類型之中。因此,從總體上來說struct比class節省記憶體。 下圖是Cla ...
  • Blazor的哪個特點, 可以讓程式員快速完成任務? 這隨筆講解的是使用代碼上下文來節約代碼, 讓驗證碼機制變得更加簡易. ...
  • Consul是HashiCorp公司推出的開源工具,Consul由Go語言開發,部署起來非常容易,只需要極少的可執行程式和配置文件,具有綠色、輕量級的特點。Consul是`分散式`的、`高可用`的、 `可橫向擴展`的用於實現分散式系統的服務發現與配置。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...