Linux-CPU之平均負(fù)載-創(chuàng)新互聯(lián)

一般我們覺得系統(tǒng)變慢了,都會(huì)執(zhí)行 top 或者 uptime 命令,來了解系統(tǒng)的負(fù)載情況。

成都創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比漢南網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式漢南網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋漢南地區(qū)。費(fèi)用合理售后完善,10年實(shí)體公司更值得信賴。
uptime
 11:29:06 up 0 min,  2 users,  load average: 1.21, 0.29, 0.10
 // 當(dāng)前時(shí)間    // 系統(tǒng)運(yùn)行時(shí)間  // 正在登錄用戶數(shù)   //1 分鐘、5 分鐘、15 分鐘的平均負(fù)載
概念:

平均負(fù)載是指單位時(shí)間內(nèi),系統(tǒng)處于可運(yùn)行狀態(tài)和不可中斷狀態(tài)的平均進(jìn)程數(shù),也就是平均活躍進(jìn)程數(shù),它和 CPU 使用率并沒有直接關(guān)系。

  1. 可運(yùn)行狀態(tài)的進(jìn)程,是指正在使用 CPU 或者正在等待 CPU 的進(jìn)程,也就是我們常用 ps 命令看到的,處于 R 狀態(tài)(Running 或 Runnable)的進(jìn)程。
  2. 不可中斷狀態(tài)的進(jìn)程則是正處于內(nèi)核態(tài)關(guān)鍵流程中的進(jìn)程,并且這些流程是不可打斷的。比如最常見的是等待硬件設(shè)備的 I/O 響應(yīng),也就是我們?cè)?ps 命令中看到的 D 狀態(tài)(Uninterruptible Sleep,也稱為 Disk Sleep)的進(jìn)程。
平均負(fù)載多少合適

本質(zhì):平均負(fù)載其實(shí)就是平均活躍進(jìn)程數(shù)。

理想的,就是每個(gè) CPU 上都剛好運(yùn)行著一個(gè)進(jìn)程,這樣每個(gè) CPU 都得到了充分利用。

當(dāng)平均負(fù)載高于 CPU 數(shù)量 70% 的時(shí)候,你就應(yīng)該分析排查負(fù)載高的問題了。

平均負(fù)載為 2 時(shí):
只有 2 個(gè) CPU 的系統(tǒng)上,意味著所有的 CPU 都剛好被完全占用。
4 個(gè) CPU 的系統(tǒng)上,意味著 CPU 有 50% 的空閑。
1 個(gè) CPU 的系統(tǒng)中,則意味著有一半的進(jìn)程競(jìng)爭(zhēng)不到 CPU。

如何獲取CPU的個(gè)數(shù):文件 /proc/cpuinfo 中獲取個(gè)數(shù)。

grep 'model name' /proc/cpuinfo |wc -l
2
平均負(fù)載與 CPU 使用率區(qū)分

平均負(fù)載是指單位時(shí)間內(nèi),處于可運(yùn)行狀態(tài)和不可中斷狀態(tài)的進(jìn)程數(shù),不僅包括了正在使用 CPU 的進(jìn)程,還包括等待 CPU 和等待 I/O 的進(jìn)程。

CPU 使用率,是單位時(shí)間內(nèi) CPU 繁忙情況的統(tǒng)計(jì),跟平均負(fù)載并不一定完全對(duì)應(yīng)。

CPU 密集型進(jìn)程,使用大量 CPU 會(huì)導(dǎo)致平均負(fù)載升高,此時(shí)這兩者是一致的;
I/O 密集型進(jìn)程,等待 I/O 也會(huì)導(dǎo)致平均負(fù)載升高,但 CPU 使用率不一定很高;
大量等待 CPU 的進(jìn)程調(diào)度也會(huì)導(dǎo)致平均負(fù)載升高,此時(shí)的 CPU 使用率也會(huì)比較高。

CPU 使用率

Linux 作為一個(gè)多任務(wù)操作系統(tǒng),將每個(gè) CPU 的時(shí)間劃分為很短的時(shí)間片,再通過調(diào)度器輪流分配給各個(gè)任務(wù)使用。

維護(hù) CPU 時(shí)間,Linux 通過事先定義的節(jié)拍率(內(nèi)核中表示為 HZ),觸發(fā)時(shí)間中斷,并使用全局變量 Jiffies 記錄了開機(jī)以來的節(jié)拍數(shù)。每發(fā)生一次時(shí)間中斷,Jiffies 的值就加 1。

因?yàn)楣?jié)拍率 HZ 是內(nèi)核選項(xiàng),為了方便用戶空間程序,內(nèi)核還提供了一個(gè)用戶空間節(jié)拍率 USER_HZ,它總是固定為 100,也就是 1/100 秒。

Linux 通過 /proc 虛擬文件系統(tǒng),向用戶空間提供了系統(tǒng)內(nèi)部狀態(tài)的信息,而 /proc/stat 提供的就是系統(tǒng)的 CPU 和任務(wù)統(tǒng)計(jì)信息。

cat /proc/stat
//user 用戶態(tài)時(shí)間nice 用戶態(tài)時(shí)間(低優(yōu)先級(jí),nice>0)
//system 內(nèi)核態(tài)時(shí)間  idle 空閑時(shí)間
//iowait I/O等待時(shí)間
//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)啟動(dòng)以來的所有interrupts的次數(shù)情況
ctxt 22523049  //系統(tǒng)上下文切換次數(shù)
btime 1500827856  //啟動(dòng)時(shí)長(zhǎng)(單位:秒),從Epoch(即1970零時(shí))開始到系統(tǒng)啟動(dòng)所經(jīng)過的時(shí)長(zhǎng),每次啟動(dòng)會(huì)改變。
processes 23231  //系統(tǒng)啟動(dòng)后所創(chuàng)建過的進(jìn)程數(shù)量。當(dāng)短時(shí)間該值特別大,系統(tǒng)可能出現(xiàn)異常
procs_running 1  // 處于Runnable狀態(tài)的進(jìn)程個(gè)數(shù)
procs_blocked 0  // 處于等待I/O完成的進(jìn)程個(gè)數(shù)
softirq 3552900 843593 733695 19691 93143 468832 12783 257382 610426 0 513355

時(shí)間單位,sysconf(_SC_CLK_TCK)一般地定義為jiffies(一般地等于10ms)

iowait時(shí)間是不可靠值,理由如下:
CPU不會(huì)等待I/O執(zhí)行完成,而iowait是等待I/O完成的時(shí)間。 當(dāng)CPU進(jìn)入idle狀態(tài),很可能會(huì)調(diào)度另一個(gè)task執(zhí)行,所以iowait計(jì)算時(shí)間偏??;

計(jì)算方法

在這里插入圖片描述
根據(jù)這個(gè)公式,我們就可以從 /proc/stat 中的數(shù)據(jù),很容易地計(jì)算出 CPU 使用率。當(dāng)然,也可以用每一個(gè)場(chǎng)景的 CPU 時(shí)間,除以總的 CPU 時(shí)間,計(jì)算出每個(gè)場(chǎng)景的 CPU 使用率。

這是開機(jī)以來的節(jié)拍數(shù)累加值,所以直接算出來的,是開機(jī)以來的平均 CPU 使用率,一般沒啥參考價(jià)值。

為了計(jì)算 CPU 使用率,性能工具一般都會(huì)取間隔一段時(shí)間(比如 3 秒)的兩次值,作差后,再計(jì)算出這段時(shí)間內(nèi)的平均 CPU 使用率,即
在這里插入圖片描述

top 默認(rèn)使用 3 秒時(shí)間間隔,而 ps 使用的卻是進(jìn)程的整個(gè)生命周期。

CPU 使用率過高排查

1.通過 top、ps、pidstat 等工具,你能夠輕松找到 CPU 使用率較高(比如 100% )的進(jìn)程。
2.尋找占用 CPU 的到底是代碼里的哪個(gè)函數(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 的報(bào)告

第一行包含三個(gè)數(shù)據(jù),分別是采樣數(shù)(Samples)、事件類型(event)和事件總數(shù)量(Event count)。比如這個(gè)例子中,perf 總共采集了 833 個(gè) CPU 時(shí)鐘事件,而總事件數(shù)則為 97742399。

第一列 Overhead ,是該符號(hào)的性能事件在所有采樣中的比例,用百分比來表示。
第二列 Shared ,是該函數(shù)或指令所在的動(dòng)態(tài)共享對(duì)象(Dynamic Shared Object),如內(nèi)核、進(jìn)程名、動(dòng)態(tài)鏈接庫名、內(nèi)核模塊名等。
第三列 Object ,是動(dòng)態(tài)共享對(duì)象的類型。比如 [.] 表示用戶空間的可執(zhí)行程序、或者動(dòng)態(tài)鏈接庫,而 [k] 則表示內(nèi)核空間。
最后一列 Symbol 是符號(hào)名,也就是函數(shù)名。當(dāng)函數(shù)名未知時(shí),用十六進(jìn)制的地址來表示。

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

本文題目:Linux-CPU之平均負(fù)載-創(chuàng)新互聯(lián)
鏈接地址:http://muchs.cn/article2/psioc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營(yíng)銷型網(wǎng)站建設(shè)網(wǎng)站制作、全網(wǎng)營(yíng)銷推廣建站公司、小程序開發(fā)、ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管