一般我們覺得系統(tǒng)變慢了,都會執(zhí)行 top 或者 uptime 命令,來了解系統(tǒng)的負載情況。
uptime
11:29:06 up 0 min, 2 users, load average: 1.21, 0.29, 0.10
// 當(dāng)前時間 // 系統(tǒng)運行時間 // 正在登錄用戶數(shù) //1 分鐘、5 分鐘、15 分鐘的平均負載
概念:平均負載是指單位時間內(nèi),系統(tǒng)處于可運行狀態(tài)和不可中斷狀態(tài)的平均進程數(shù),也就是平均活躍進程數(shù),它和 CPU 使用率并沒有直接關(guān)系。
平均負載多少合適
- 可運行狀態(tài)的進程,是指正在使用 CPU 或者正在等待 CPU 的進程,也就是我們常用 ps 命令看到的,處于 R 狀態(tài)(Running 或 Runnable)的進程。
- 不可中斷狀態(tài)的進程則是正處于內(nèi)核態(tài)關(guān)鍵流程中的進程,并且這些流程是不可打斷的。比如最常見的是等待硬件設(shè)備的 I/O 響應(yīng),也就是我們在 ps 命令中看到的 D 狀態(tài)(Uninterruptible Sleep,也稱為 Disk Sleep)的進程。
本質(zhì):平均負載其實就是平均活躍進程數(shù)。
理想的,就是每個 CPU 上都剛好運行著一個進程,這樣每個 CPU 都得到了充分利用。
當(dāng)平均負載高于 CPU 數(shù)量 70% 的時候,你就應(yīng)該分析排查負載高的問題了。
平均負載為 2 時:
只有 2 個 CPU 的系統(tǒng)上,意味著所有的 CPU 都剛好被完全占用。
4 個 CPU 的系統(tǒng)上,意味著 CPU 有 50% 的空閑。
1 個 CPU 的系統(tǒng)中,則意味著有一半的進程競爭不到 CPU。
如何獲取CPU的個數(shù):文件 /proc/cpuinfo 中獲取個數(shù)。
grep 'model name' /proc/cpuinfo |wc -l
2
平均負載與 CPU 使用率區(qū)分平均負載是指單位時間內(nèi),處于可運行狀態(tài)和不可中斷狀態(tài)的進程數(shù),不僅包括了正在使用 CPU 的進程,還包括等待 CPU 和等待 I/O 的進程。
CPU 使用率,是單位時間內(nèi) CPU 繁忙情況的統(tǒng)計,跟平均負載并不一定完全對應(yīng)。
CPU 使用率CPU 密集型進程,使用大量 CPU 會導(dǎo)致平均負載升高,此時這兩者是一致的;
I/O 密集型進程,等待 I/O 也會導(dǎo)致平均負載升高,但 CPU 使用率不一定很高;
大量等待 CPU 的進程調(diào)度也會導(dǎo)致平均負載升高,此時的 CPU 使用率也會比較高。
Linux 作為一個多任務(wù)操作系統(tǒng),將每個 CPU 的時間劃分為很短的時間片,再通過調(diào)度器輪流分配給各個任務(wù)使用。
維護 CPU 時間,Linux 通過事先定義的節(jié)拍率(內(nèi)核中表示為 HZ),觸發(fā)時間中斷,并使用全局變量 Jiffies 記錄了開機以來的節(jié)拍數(shù)。每發(fā)生一次時間中斷,Jiffies 的值就加 1。
因為節(jié)拍率 HZ 是內(nèi)核選項,為了方便用戶空間程序,內(nèi)核還提供了一個用戶空間節(jié)拍率 USER_HZ,它總是固定為 100,也就是 1/100 秒。
Linux 通過 /proc 虛擬文件系統(tǒng),向用戶空間提供了系統(tǒng)內(nèi)部狀態(tài)的信息,而 /proc/stat 提供的就是系統(tǒng)的 CPU 和任務(wù)統(tǒng)計信息。
cat /proc/stat
//user 用戶態(tài)時間nice 用戶態(tài)時間(低優(yōu)先級,nice>0)
//system 內(nèi)核態(tài)時間 idle 空閑時間
//iowait I/O等待時間
//irq 硬中斷 softirq 軟中斷
//CPU指標(biāo):user,nice, system, idle, iowait, irq, softirq
cpu 130216 19944 162525 1491240 3784 24749 17773 0 0 0
cpu0 40321 11452 49784 403099 2615 6076 6748 0 0 0
cpu1 26585 2425 36639 151166 404 2533 3541 0 0 0
cpu2 22555 2957 31482 152460 330 2236 2473 0 0 0
cpu3 15232 1243 20945 153740 303 1985 3432 0 0 0
cpu4 5903 595 6017 157410 30 10959 605 0 0 0
cpu5 4716 380 3794 157909 23 118 181 0 0 0
cpu6 8001 515 8995 157571 48 571 180 0 0 0
cpu7 6903 377 4869 157885 31 271 613 0 0 0
intr ... //系統(tǒng)啟動以來的所有interrupts的次數(shù)情況
ctxt 22523049 //系統(tǒng)上下文切換次數(shù)
btime 1500827856 //啟動時長(單位:秒),從Epoch(即1970零時)開始到系統(tǒng)啟動所經(jīng)過的時長,每次啟動會改變。
processes 23231 //系統(tǒng)啟動后所創(chuàng)建過的進程數(shù)量。當(dāng)短時間該值特別大,系統(tǒng)可能出現(xiàn)異常
procs_running 1 // 處于Runnable狀態(tài)的進程個數(shù)
procs_blocked 0 // 處于等待I/O完成的進程個數(shù)
softirq 3552900 843593 733695 19691 93143 468832 12783 257382 610426 0 513355
時間單位,sysconf(_SC_CLK_TCK)一般地定義為jiffies(一般地等于10ms)
計算方法iowait時間是不可靠值,理由如下:
CPU不會等待I/O執(zhí)行完成,而iowait是等待I/O完成的時間。 當(dāng)CPU進入idle狀態(tài),很可能會調(diào)度另一個task執(zhí)行,所以iowait計算時間偏?。?/p>
根據(jù)這個公式,我們就可以從 /proc/stat 中的數(shù)據(jù),很容易地計算出 CPU 使用率。當(dāng)然,也可以用每一個場景的 CPU 時間,除以總的 CPU 時間,計算出每個場景的 CPU 使用率。
這是開機以來的節(jié)拍數(shù)累加值,所以直接算出來的,是開機以來的平均 CPU 使用率,一般沒啥參考價值。
為了計算 CPU 使用率,性能工具一般都會取間隔一段時間(比如 3 秒)的兩次值,作差后,再計算出這段時間內(nèi)的平均 CPU 使用率,即
CPU 使用率過高排查top 默認(rèn)使用 3 秒時間間隔,而 ps 使用的卻是進程的整個生命周期。
1.通過 top、ps、pidstat 等工具,你能夠輕松找到 CPU 使用率較高(比如 100% )的進程。
2.尋找占用 CPU 的到底是代碼里的哪個函數(shù)呢。
perf:perf 是 Linux 2.6.31 以后內(nèi)置的性能分析工具。它以性能事件采樣為基礎(chǔ),不僅可以分析系統(tǒng)的各種事件和內(nèi)核性能,還可以用來分析指定應(yīng)用程序的性能問題。
$ perf top
Samples: 833 of event 'cpu-clock', Event count (approx.): 97742399
Overhead Shared Object Symbol
7.28% perf [.] 0x00000000001f78a4
4.72% [kernel] [k] vsnprintf
4.32% [kernel] [k] module_get_kallsym
3.65% [kernel] [k] _raw_spin_unlock_irqrestore
...
#離線采集分析 -g 參數(shù),開啟調(diào)用關(guān)系的采樣
perf record -g # 按 Ctrl+C 終止采樣
perf report # 展示類似于 perf top 的報告
第一行包含三個數(shù)據(jù),分別是采樣數(shù)(Samples)、事件類型(event)和事件總數(shù)量(Event count)。比如這個例子中,perf 總共采集了 833 個 CPU 時鐘事件,而總事件數(shù)則為 97742399。
第一列 Overhead ,是該符號的性能事件在所有采樣中的比例,用百分比來表示。
第二列 Shared ,是該函數(shù)或指令所在的動態(tài)共享對象(Dynamic Shared Object),如內(nèi)核、進程名、動態(tài)鏈接庫名、內(nèi)核模塊名等。
第三列 Object ,是動態(tài)共享對象的類型。比如 [.] 表示用戶空間的可執(zhí)行程序、或者動態(tài)鏈接庫,而 [k] 則表示內(nèi)核空間。
最后一列 Symbol 是符號名,也就是函數(shù)名。當(dāng)函數(shù)名未知時,用十六進制的地址來表示。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
本文題目:Linux-CPU之平均負載-創(chuàng)新互聯(lián)
鏈接地址:http://chinadenli.net/article2/psioc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營銷型網(wǎng)站建設(shè)、網(wǎng)站制作、全網(wǎng)營銷推廣、建站公司、小程序開發(fā)、ChatGPT
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容