Linux性能調優 | 01 平均負載的理解和分析

来源:https://www.cnblogs.com/xiaolincoding/archive/2019/11/05/11801357.html
-Advertisement-
Play Games

01 uptime命令 通常我們發現系統變慢時,我們都會執行top或者uptime命令,來查看當前系統的負載情況,比如像下麵,我執行了uptime,系統返回的了結果。 前幾列的信息,相信大家都很熟悉,它們分別是當前時間、系統運行時間和正在登陸的用戶個數,最後一個就是系統平均負載的情況。 Load A ...


01 uptime命令

通常我們發現系統變慢時,我們都會執行top或者uptime命令,來查看當前系統的負載情況,比如像下麵,我執行了uptime,系統返回的了結果。

[root@lincoding ~]# uptime
 08:31:49 up 27 min,  1 user,  load average: 0.07, 0.04, 0.00

前幾列的信息,相信大家都很熟悉,它們分別是當前時間、系統運行時間和正在登陸的用戶個數,最後一個就是系統平均負載的情況。

08:31:49                        // 當前時間
up 27 min                       // 系統運行時間
1 user                          // 正在登錄用戶數
load average: 0.07, 0.04, 0.00  // 平均負載的情況

Load Average的三個數字,依次則是過去1分鐘、5分鐘、15分鐘的平均負載。可以通過觀察這三個數字的大小,可以簡單判斷系統的負載是下降的趨勢還是上升的趨勢。

  • 如果 load average: 1.00, 5.00, 10.00 三個數字依次增大,則說明在過去的 1 分鐘系統的負載比過去 15 分鐘系統的負載,表明系統的負載是下降的趨勢。
  • 如果 load average: 10.00, 5.00, 1.00 三個數字依次降低,則說明在過去的 1 分鐘系統的負載比過去 15 分鐘系統的負載,表明系統的負載是上升的趨勢。
  • 如果 load average: 0.07, 0.04, 0.0 三個數字基本相同,或者相差不大, 表明系統的負載是平穩的。

所以分析系統的負載情況,必須要看三個不同時間間隔的平均值。


02 平均負載概念

平均負載很多人容易理解成單位時間內的 CPU 使用率,這是不正確的。平均負載確實與 CPU 使用率有關係,但不是直接的關係。

簡單來說,平均負載是指單位時間內,系統處於可運行狀態不可中斷狀態的平均進程數,也就是平均活躍進程數,它和 CPU 使用率並沒有直接關係。

  • 可運行狀態,是指正在使用 CPU 或者正在等待 CPU 的進程,也就是在 ps 命令看到的 R 狀態的進程。
  • 不可中斷狀態,是指正處於內核關鍵流程中的進程,並且這些流程是不可以打斷的,比如最常見的等待硬體設備的 I/O 響應,也就是在 ps 命令看到的 D 狀態的進程。

因此,平均負載其實就是平均活躍進程數,可以更直觀的理解成單位時間內的活躍進程數。

既然平均的是活躍進程數,那麼最理想的,就是每個CPU上剛好運行著一個進程,這樣每個CPU就得到了充分利用。
比如當平均負載為2時,意味著:

  • 在只有 2 個 CPU 的系統上,意味著所有的 CPU 都剛好被完全占用。
  • 在4個CPU的系統上,意味著 CPU 有 50% 的空閑。
  • 在只有 1 個 CPU 的系統中,則意味著有一半的進程競爭不到 CPU。

03 平均負載為多少時合理

在評判你當前的系統平均負載是否合理的時,首先你要知道系統有幾個 CPU,可以通過 lscpu 命令或者從文件 /proc/cpuinfo 中讀取

# lscpu 命令查看 CPU 個數
[root@lincoding ~]# lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                4 # 這裡數字表示 CPU 個數        
....

# 從文件 /proc/cpuinfo 中查看 CPU 個數
[root@lincoding ~]# grep 'model name' /proc/cpuinfo | wc -l
4

有了 CPU 個數,我們就可以判斷出,當平均負載比 CPU 個數還大的時候,系統已經出現了過載。

這裡我再舉個例子,假設我們在一個單 CPU 系統上看到平均負載為 1.73,0.60,7.98

  • 在過去 1 分鐘內,系統有 73% 的超載
  • 在過 15 分鐘內,有 698%的超載,從整體趨勢來看,系統的負載在降低。

平均負載高於 CPU 數量 70% 的時候,就應該分析排查負載高的問題了。一旦負載過高,就可能導致進程響應變慢,進而影響服務的正常功能。


04 平均負載與 CPU 使用率

我們經常容易把平均負載和 CPU 使用率混淆,所以在這裡,我也做一個區分。

再次說明下,平均負載是指單位時間內,處於可運行狀態和不可中斷狀態的進程數。所以,它不僅包括了正在使用 CPU 的進程,還包括等待 CPU等待 I/O 的進程。

而 CPU 使用率,是單位時間內 CPU 繁忙情況的統計,跟平均負載並不一定完全對應。比如:

  • CPU 密集型進程,使用大量 CPU 會導致平均負載升高,此時這兩者是一致的;
  • I/O 密集型進程,等待 I/O 也會導致平均負載升高,但 CPU 使用率不一定很高;
  • 大量等待 CPU 的進程調度也會導致平均負載升高,此時的 CPU 使用率也會比較高。

05 平均負載升高分析命令

我們現在很清楚的知道導致平均負載高的情況,不只是看 CPU 的使用率,也要觀察系統 I/O 等待時間高不高。

當發現平均負載升高時,可以使用 mpstat 命令查看 CPU 的性能。

# -P ALL 表示監控所有CPU,後面數字1表示間隔1秒後輸出一組數據
$ mpstat -P ALL 1
Linux 2.6.32-431.el6.x86_64 (lzc)   11/05/2019  _x86_64_    (2 CPU)

07:51:45 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
07:51:50 PM  all   42.90    0.00   49.39    0.41    0.00    4.56    0.00    0.00    2.74
07:51:50 PM    0   44.38    0.00   48.67    0.41    0.00    2.86    0.00    0.00    3.68
07:51:50 PM    1   41.57    0.00   49.80    0.40    0.00    6.43    0.00    0.00    1.81

從上面發現

  • CPU 的用戶層(%usr)使用率高達45%左右;
  • CPU 的系統層(%sys)使用率高達50%左右;
  • CPU 的 I/0 - 等待(%iowait)占用率為0.41%;
  • CPU 的空閑率(%idle)只有2~3%。

可以推斷出是由於 CPU 使用率導致平均負載升高的情況。

假設只有 CPU 的I/0 等待(%iowait)占用率高,CPU 用戶層和系統層使用率很輕鬆,那麼導致平均負載升高的原因就是 iowait 的升高。

判斷了是因為 CPU 使用率升高還是 iowait 升高導致平均負載升高後,我們還需要定位是哪個進程導致的。可以用 pidstat 來查詢:

# 間隔1秒後輸出一組數據,-u表示CPU指標
$ pidstat -u 1
08:07:55 PM       PID    %usr %system  %guest    %CPU   CPU  Command
08:07:56 PM         4    0.00    1.00    0.00    1.00     0  ksoftirqd/0
08:07:56 PM         9    0.00    1.00    0.00    1.00     1  ksoftirqd/1
08:07:56 PM        11    0.00   16.00    0.00   16.00     0  events/0
08:07:56 PM        12    0.00   20.00    0.00   20.00     1  events/1
08:07:56 PM       616    7.00    6.00    0.00   13.00     1  pppoe
08:07:56 PM      2745    6.00    6.00    0.00   12.00     1  pppoe

可以發現是 events/0events/1 內核進程 CPU 使用率非常高,所以可能這兩個進程導致平均負載升高。


06 小結

平均負載提供了一個快速查看系統整體性能的手段,反映了整體的負載情況。但只看平均負載本身,我們並不能直接發現,到底是哪裡出現了瓶頸。所以,在理解平均負載時,也要註意:

  • 平均負載高有可能是 CPU 密集型進程導致的;
  • 平均負載高並不一定代表 CPU 使用率高,還有可能是 I/O 更繁忙了;
  • 當發現負載高的時候,你可以使用 mpstatpidstat 等工具,輔助分析負載的來源。

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

-Advertisement-
Play Games
更多相關文章
  • 一、原生方式: 1.POST(以ajax請求為案例,教大家用法) 2.GET(url傳參為案例,教大家用法) 二、以對象的形式接收參數(get/post通用): 三、路由實現傳參(get/post通用): 其它用法歡迎留言補充,謝謝! ...
  • 原文由Rector首發於 "碼友網" 之 "《C /.NET/.NET Core應用程式編程中實現定時任務調度的方法或者組件有哪些,Timer,FluentScheduler,TaskScheduler,Gofer.NET,Coravel,Quartz.NET還是Hangfire》" 摘要 C /. ...
  • 1. 什麼是長陰影 前幾年扁平化設計(Flat Design)十分流行,後來在扁平化的基礎上又流行起了長陰影(Long Shadow)。長陰影其實就是擴展了對象的投影,感覺是一種光線照射下的影子,通常採用角度為 45 度的投影,給對象添加了一份立體感。長陰影快速發展為流行的設計趨勢,並經常被應用到扁 ...
  • 前言 進過前面兩章的介紹,今天開始正式的實戰。 進位轉換 很多朋友對於進位轉換可能是在剛學電腦的時候有接觸,後來做高級語言開發可能就慢慢忘記了。我們做工控開發的時候需要經常進行進位轉換,這裡和大家一起複習下。 一個位元組等8位(1byte = 8bit),可以存儲2^8(0 255)共計256個數字 ...
  • Makefile包含 目標文件、依賴文件、可運行命令三部分。 每部分的基本格式例如以下: test: prog.o code.o gcc -o test prog.o code.o 當中,第一行的test是目標文件。 prog.o、code.o是依賴文件; 第二行的gcc -o test prog. ...
  • 當Linux7/Centos7的用戶root密碼常用如下方式找回密碼: 第一步:按e鍵進入內核啟動頁面如下: 第二步:在linux16一行LANG=zh_CN.UTF-8後面加rd.break console=tty0 然後按ctrl+x組合鍵 第三步:按ctro+x後進入系統的緊急救援模式,如下圖 ...
  • 網上關於ObjectARX開發的相關介紹都基於Windows環境。Mac 環境的開發幾乎沒有,下麵介紹Mac環境下ObjectARX的開發。 AutoCAD ObjectARX開發必備條件: 1. 安裝Mac 版AutoCAD 2. 安裝AutoCAD版本對應的ObjectARX 的SDK 本文以A ...
  • Made By Herolh 目錄 { index} [TOC] Centos7開放及查看埠 1、開放埠 2、查看防火牆所有開放的埠 3.、關閉防火牆 如果要開放的埠太多,嫌麻煩,可以關閉防火牆,安全性自行評估 4、查看防火牆狀態 5、查看監聽的埠 6、檢查埠被哪個進程占用 7、查看進程 ...
一周排行
    -Advertisement-
    Play Games
  • C#TMS系統代碼-基礎頁面BaseCity學習 本人純新手,剛進公司跟領導報道,我說我是java全棧,他問我會不會C#,我說大學學過,他說這個TMS系統就給你來管了。外包已經把代碼給我了,這幾天先把增刪改查的代碼背一下,說不定後面就要趕鴨子上架了 Service頁面 //using => impo ...
  • 委托與事件 委托 委托的定義 委托是C#中的一種類型,用於存儲對方法的引用。它允許將方法作為參數傳遞給其他方法,實現回調、事件處理和動態調用等功能。通俗來講,就是委托包含方法的記憶體地址,方法匹配與委托相同的簽名,因此通過使用正確的參數類型來調用方法。 委托的特性 引用方法:委托允許存儲對方法的引用, ...
  • 前言 這幾天閑來沒事看看ABP vNext的文檔和源碼,關於關於依賴註入(屬性註入)這塊兒產生了興趣。 我們都知道。Volo.ABP 依賴註入容器使用了第三方組件Autofac實現的。有三種註入方式,構造函數註入和方法註入和屬性註入。 ABP的屬性註入原則參考如下: 這時候我就開始疑惑了,因為我知道 ...
  • C#TMS系統代碼-業務頁面ShippingNotice學習 學一個業務頁面,ok,領導開完會就被裁掉了,很突然啊,他收拾東西的時候我還以為他要旅游提前請假了,還在尋思為什麼回家連自己買的幾箱飲料都要叫跑腿帶走,怕被偷嗎?還好我在他開會之前拿了兩瓶芬達 感覺感覺前面的BaseCity差不太多,這邊的 ...
  • 概述:在C#中,通過`Expression`類、`AndAlso`和`OrElse`方法可組合兩個`Expression<Func<T, bool>>`,實現多條件動態查詢。通過創建表達式樹,可輕鬆構建複雜的查詢條件。 在C#中,可以使用AndAlso和OrElse方法組合兩個Expression< ...
  • 閑來無聊在我的Biwen.QuickApi中實現一下極簡的事件匯流排,其實代碼還是蠻簡單的,對於初學者可能有些幫助 就貼出來,有什麼不足的地方也歡迎板磚交流~ 首先定義一個事件約定的空介面 public interface IEvent{} 然後定義事件訂閱者介面 public interface I ...
  • 1. 案例 成某三甲醫預約系統, 該項目在2024年初進行上線測試,在正常運行了兩天後,業務系統報錯:The connection pool has been exhausted, either raise MaxPoolSize (currently 800) or Timeout (curren ...
  • 背景 我們有些工具在 Web 版中已經有了很好的實踐,而在 WPF 中重新開發也是一種費時費力的操作,那麼直接集成則是最省事省力的方法了。 思路解釋 為什麼要使用 WPF?莫問為什麼,老 C# 開發的堅持,另外因為 Windows 上已經裝了 Webview2/edge 整體打包比 electron ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...