自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

聊聊性能指標(biāo)CPU利用率如何計(jì)算的?

開(kāi)發(fā) 前端
CPU 負(fù)載統(tǒng)計(jì)了一段時(shí)間內(nèi)所有正在使用電話(huà)的人以及等待分配電話(huà)的人數(shù)的平均值。為了得到平均負(fù)載情況,我們每 5 分鐘統(tǒng)計(jì)一次人數(shù),并在第 1、5、15 分鐘時(shí)取平均值,從而得到 1、5、15 分鐘的平均負(fù)載。

CPU 利用率,又稱(chēng) CPU 使用率。顧名思義,CPU 利用率用于描述 CPU 的運(yùn)行情況,反映了一段時(shí)間內(nèi) CPU 被程序占用的情況。使用率越高,表示計(jì)算機(jī)在該時(shí)間段內(nèi)運(yùn)行了更多的程序,反之則較少。CPU 的利用率與其性能直接相關(guān)。

現(xiàn)代操作系統(tǒng)如 Windows、Linux 和 MacOS 都是多用戶(hù)、多任務(wù)的分時(shí)操作系統(tǒng)。這意味著多個(gè)用戶(hù)可以在同一時(shí)間“同時(shí)”進(jìn)行多項(xiàng)操作,這已經(jīng)成為我們?nèi)粘I畹囊徊糠郑@得非常普遍。然而,在單個(gè) CPU 計(jì)算機(jī)中,實(shí)際上同一時(shí)間只能處理一項(xiàng)任務(wù)。

為了實(shí)現(xiàn)看似“同時(shí)處理多項(xiàng)任務(wù)”的效果,分時(shí)操作系統(tǒng)將 CPU 時(shí)間劃分為長(zhǎng)度基本相同的時(shí)間片段,也就是“時(shí)間片”。操作系統(tǒng)通過(guò)管理這些時(shí)間片,依次分配給各個(gè)用戶(hù)使用。

如果某個(gè)作業(yè)在其分配的時(shí)間片結(jié)束前沒(méi)有完成,該作業(yè)會(huì)被暫停,釋放 CPU,等待下一個(gè)時(shí)間片再繼續(xù)執(zhí)行。此時(shí) CPU 會(huì)被分配給另一個(gè)作業(yè)使用。由于計(jì)算機(jī)處理速度非???,適當(dāng)設(shè)置時(shí)間片的長(zhǎng)度使得用戶(hù)在時(shí)間片間隙感知不到停頓,仿佛整個(gè)系統(tǒng)是在獨(dú)占 CPU 一樣。

因此,我們提到的 CPU 占用率通常指的就是 CPU 在時(shí)間片內(nèi)被占用的情況。

查看 CPU 利用率

在 Linux 系統(tǒng)中,確實(shí)可以使用一些命令來(lái)查看系統(tǒng)的負(fù)載情況和 CPU 利用率。這些命令包括:

  1. uptime: 顯示系統(tǒng)的運(yùn)行時(shí)間以及平均負(fù)載。
  2. top: 實(shí)時(shí)顯示系統(tǒng)中各個(gè)進(jìn)程的資源占用情況,包括 CPU 利用率、內(nèi)存占用等。
  3. w: 顯示當(dāng)前登錄用戶(hù)和各用戶(hù)的活動(dòng)信息,包括登錄時(shí)間、運(yùn)行的命令等。
  4. vmstat: 報(bào)告系統(tǒng)的虛擬內(nèi)存統(tǒng)計(jì)信息,包括 CPU 利用率、內(nèi)存利用率、磁盤(pán) I/O 等。

這些命令在終端中執(zhí)行后,可以幫助管理員實(shí)時(shí)監(jiān)控系統(tǒng)的性能和資源使用情況,從而及時(shí)進(jìn)行調(diào)整和優(yōu)化。

vmstat 命令

vmstat 命令是 Linux/Unix 系統(tǒng)中常見(jiàn)的監(jiān)控工具,能夠展示在指定時(shí)間間隔內(nèi)服務(wù)器的各種狀態(tài)值,包括 CPU 利用率、內(nèi)存使用情況、虛擬內(nèi)存交換情況以及 IO 讀寫(xiě)情況。

~ vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  1      0 2446260      0 3202312  0    0   201 16304    1    6  0  0 84  5 1

從上述結(jié)果中,我們可以獲取大量信息,但本文重點(diǎn)關(guān)注 CPU 部分的指標(biāo)。

us sy id wa st
0  0  84  5 1

以上幾個(gè)指標(biāo)是當(dāng)前 CPU 的占用情況。

  • %us: 用戶(hù)進(jìn)程執(zhí)行時(shí)間百分比。
  • %sy: 內(nèi)核系統(tǒng)進(jìn)程執(zhí)行時(shí)間百分比。
  • %id: 空閑時(shí)間百分比。
  • %wa: IO 等待時(shí)間百分比。
  • %st: 虛擬 CPU 等待實(shí)際 CPU 的時(shí)間百分比。

當(dāng)%us 較高時(shí),表示用戶(hù)進(jìn)程占用了大量 CPU 時(shí)間。然而,如果長(zhǎng)期超過(guò) 50%,則需要考慮優(yōu)化程序算法或加速處理。

高%sy 表明系統(tǒng)內(nèi)核消耗了大量 CPU 資源,這不利于系統(tǒng)正常運(yùn)行,應(yīng)當(dāng)尋找問(wèn)題根源。

%wa 的高值表示 IO 等待較為嚴(yán)重,可能是由于磁盤(pán)隨機(jī)訪問(wèn)頻繁或磁盤(pán)性能瓶頸引起的塊操作問(wèn)題。

通常使用 vmstat 工具時(shí),需要指定兩個(gè)數(shù)值參數(shù)。第一個(gè)參數(shù)表示采樣的時(shí)間間隔,單位為秒;第二個(gè)參數(shù)表示采樣的次數(shù)。

~ vmstat 2 2
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 2479444    0 3165172    0    0   196 15905    2    8  0  0 84  5 11
 0  0      0 2479404    0 3165176

以上命令表示采集兩次數(shù)據(jù),每隔 2 秒采集一次。

top 命令

top 命令是 Linux 系統(tǒng)下常用的性能分析工具,能夠?qū)崟r(shí)顯示系統(tǒng)中各個(gè)進(jìn)程的資源占用情況,類(lèi)似于 Windows 中的任務(wù)管理器。

~ top
top - 10:58:07 up 18:13,  1 user,  load average: 0.32, 0.24, 0.19
Tasks:  64 total,   1 running,  63 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.1%us,  0.2%sy,  0.0%ni, 92.8%id,  0.1%wa,  0.0%hi,  0.0%si,  6.8%st
Mem:   8388608k total,  5928076k used,  2460532k free,        0k buffers
Swap: 16777216k total,        0k used, 16777216k free,  3181996k cached

   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
  2393 admin     20   0 5056m 2.2g  56m S  4.3 27.6  79:06.21 java
  1054 root      20   0  338m 9760 5112 S  0.3  0.1   2:37.30 logagent

從上述打印信息中,我們可以看到第三行反映了當(dāng)前 CPU 的整體情況。

此外,我們還能觀察到 ID 為 2393 的 Java 進(jìn)程當(dāng)前內(nèi)存使用率最高,約占 4.3%。

由于 Java 是多線程的,有時(shí)候我們希望能夠查看一個(gè) Java 進(jìn)程中所有線程的 CPU 使用情況,這也可以通過(guò) top 命令來(lái)實(shí)現(xiàn)。

~ top -Hp 1893
PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
19163 admin     20   0 5056m 2.2g  56m S  1.7 27.6  17:39.97 java
10649 admin     20   0 5056m 2.2g  56m S  0.7 27.6   4:07.64 java
5884 admin     20   0 5056m 2.2g  56m S  0.3 27.6   2:18.19 java
10650 admin     20   0 5056m 2.2g  56m S  0.3 27.6   1:24.77 java

通過(guò)執(zhí)行top -Hp 1893命令,我們可以發(fā)現(xiàn),當(dāng)前進(jìn)程 ID 為 1893 的 Java 進(jìn)程中,線程 ID 為 19163 的線程占用 CPU 最高,大約達(dá)到 1.7%。

PS:top 命令的輸出結(jié)果是動(dòng)態(tài)變化的,會(huì)隨著系統(tǒng)情況的變化實(shí)時(shí)更新。

CPU 使用率的計(jì)算邏輯

描述系統(tǒng) CPU 使用情況主要包括以下幾個(gè)方面:

  • user: 自系統(tǒng)啟動(dòng)以來(lái),CPU 處于用戶(hù)態(tài)運(yùn)行的時(shí)間,不包括 nice 值為負(fù)的進(jìn)程。
  • nice: 自系統(tǒng)啟動(dòng)以來(lái),CPU 中 nice 值為負(fù)的進(jìn)程占用的時(shí)間。
  • system: 自系統(tǒng)啟動(dòng)以來(lái),CPU 處于內(nèi)核態(tài)運(yùn)行的時(shí)間。
  • idle: 自系統(tǒng)啟動(dòng)以來(lái),CPU 除了 iowait 以外的空閑等待時(shí)間。
  • iowait: 自系統(tǒng)啟動(dòng)以來(lái),CPU 等待 IO 操作完成的時(shí)間。
  • irq: 自系統(tǒng)啟動(dòng)以來(lái),CPU 處理硬中斷花費(fèi)的時(shí)間。
  • softirq: 自系統(tǒng)啟動(dòng)以來(lái),CPU 處理軟中斷花費(fèi)的時(shí)間。
  • steal: 自系統(tǒng)啟動(dòng)以來(lái),CPU 被其他虛擬環(huán)境中的操作系統(tǒng)“偷走”的時(shí)間。
  • guest: 自系統(tǒng)啟動(dòng)以來(lái),CPU 運(yùn)行在通過(guò) Linux 內(nèi)核控制的客戶(hù)操作系統(tǒng)上的虛擬 CPU 的時(shí)間。
  • guest_nice: 自系統(tǒng)啟動(dòng)以來(lái),CPU 運(yùn)行在通過(guò) Linux 內(nèi)核控制的客戶(hù)操作系統(tǒng)上的 nice 值為負(fù)的虛擬 CPU 的時(shí)間。

理解了以上參數(shù)的含義,計(jì)算某段時(shí)間內(nèi)的 CPU 使用率并不復(fù)雜。假設(shè)我們有兩個(gè)時(shí)間點(diǎn),t1 和 t2,可以通過(guò)以下公式來(lái)計(jì)算 CPU 在這段時(shí)間內(nèi)的總使用時(shí)間:

( user2+ nice2+ system2+ idle2+ iowait2+ irq2+ softirq2 + steal2 + guest2 + guest_nice2 ) - ( user1+ nice1+ system1+ idle1+ iowait1+ irq1+ softirq1 + steal1 + guest1 + guest_nice1)

CPU 的空閑時(shí)間:

(idle2 -idle1)

CPU 在 t1 和 t2 時(shí)間內(nèi)的使用率:

CPU非空閑時(shí)間/CPU總時(shí)間*100%=(1-CPU的空閑時(shí)間/CPU總時(shí)間)*100%

則:

CPU(t1,t2)使用率:1-(idle2-idle1)/(( user2+ nice2+ system2+ idle2+ iowait2+ irq2+ softirq2 + steal2 + guest2 + guest_nice2 ) - ( user1+ nice1+ system1+ idle1+ iowait1+ irq1+ softirq1 + steal1 + guest1 + guest_nice1))

CPU 利用率和負(fù)載

很多朋友常常分不清楚 CPU 利用率和負(fù)載之間的區(qū)別與聯(lián)系。

CPU 利用率是對(duì)某一時(shí)間段內(nèi) CPU 使用情況的統(tǒng)計(jì),通過(guò)這個(gè)指標(biāo)可以了解 CPU 在特定時(shí)間段內(nèi)被使用的情況。

而 CPU 負(fù)載(Load)則是對(duì)某一時(shí)間段內(nèi) CPU 正在處理和等待處理的進(jìn)程數(shù)之和的統(tǒng)計(jì)信息,也可以理解為 CPU 使用隊(duì)列的長(zhǎng)度統(tǒng)計(jì)。

可以用一個(gè)比喻來(lái)解釋?zhuān)瑢?CPU 的使用比作排隊(duì)打電話(huà):

我們可以將 CPU 比喻為一個(gè)電話(huà)亭,每一個(gè)進(jìn)程就像是需要打電話(huà)的人。假設(shè)有一個(gè)單核計(jì)算機(jī),現(xiàn)在有 10 個(gè)人需要使用電話(huà)(代表 10 個(gè)進(jìn)程)。電話(huà)使用規(guī)則是管理員按順序給每個(gè)人分配 1 分鐘的通話(huà)時(shí)間。如果一個(gè)人在 1 分鐘內(nèi)完成通話(huà),他可以將電話(huà)交還給管理員。但如果在 1 分鐘內(nèi)沒(méi)有完成通話(huà),他需要重新排隊(duì)等待再次分配。在電話(huà)亭使用過(guò)程中,會(huì)有人打完電話(huà)離開(kāi),有人沒(méi)打完電話(huà)選擇重新排隊(duì),也會(huì)有新人來(lái)排隊(duì),這種人數(shù)的變化就相當(dāng)于任務(wù)數(shù)的增減。

CPU 負(fù)載統(tǒng)計(jì)了一段時(shí)間內(nèi)所有正在使用電話(huà)的人以及等待分配電話(huà)的人數(shù)的平均值。為了得到平均負(fù)載情況,我們每 5 分鐘統(tǒng)計(jì)一次人數(shù),并在第 1、5、15 分鐘時(shí)取平均值,從而得到 1、5、15 分鐘的平均負(fù)載。

而 CPU 利用率則統(tǒng)計(jì)了進(jìn)程實(shí)際使用電話(huà)的時(shí)間與在電話(huà)亭內(nèi)停留的總時(shí)間的比率。例如,一個(gè)用戶(hù)獲得了 1 分鐘的使用權(quán),在 10 秒內(nèi)打了電話(huà),接著花了 20 秒查電話(huà)簿,剩下的 30 秒又打了一個(gè)電話(huà)。那么他的利用率就是(10+30)/60。

Java Web 應(yīng)用 CPU 使用率飆高排查思路

當(dāng)發(fā)現(xiàn)系統(tǒng)的 CPU 使用率突然升高,首先需要確定是哪個(gè)進(jìn)程造成了 CPU 負(fù)載的增加。在 Java 代碼中,導(dǎo)致 CPU 占用高的原因可能包括以下幾點(diǎn):

  1. 內(nèi)存泄漏導(dǎo)致大量 Full GC:例如典型的 Java 1.7 之前的 String.subString 方法可能會(huì)導(dǎo)致內(nèi)存泄漏問(wèn)題,進(jìn)而引發(fā)頻繁的 Full GC 操作。
  2. 代碼中存在死循環(huán):特別是在多線程場(chǎng)景下,使用不當(dāng)?shù)臄?shù)據(jù)結(jié)構(gòu)如 HashMap 可能導(dǎo)致死循環(huán),使得某些線程消耗大量 CPU 資源。

解決這些問(wèn)題的基本步驟是首先定位占用 CPU 較多的進(jìn)程和線程,然后通過(guò)相應(yīng)的命令查看這些線程的執(zhí)行情況,并分析代碼以定位問(wèn)題。關(guān)鍵在于熟練使用 jstack、jstat 以及 jmap 等工具來(lái)定位和解決 Java 進(jìn)程中的問(wèn)題。

那么如何在真實(shí)環(huán)境中排查 CPU 飆高的問(wèn)題呢?由于本篇幅過(guò)長(zhǎng),感興趣的小伙伴可以關(guān)注,下期出。

責(zé)任編輯:武曉燕 來(lái)源: 碼上遇見(jiàn)你
相關(guān)推薦

2024-06-28 11:54:20

2023-11-20 09:48:13

Linux性能指標(biāo)命令

2010-09-08 11:38:27

2017-08-25 15:56:54

Linuxproc文件系統(tǒng)CPU利用率

2023-04-04 09:22:50

LinuxCPU命令

2010-03-11 16:49:55

Linux CPU利用

2011-05-04 13:53:08

jQuery

2024-09-20 08:32:21

2013-06-17 10:19:30

交換機(jī)性能交換機(jī)參數(shù)交換機(jī)

2022-05-02 08:56:04

前端性能指標(biāo)

2019-03-05 15:53:40

Linux服務(wù)器CPU

2011-07-28 14:58:49

HP ProLiant服務(wù)器

2023-11-25 20:16:22

前端

2023-12-29 15:30:41

內(nèi)存存儲(chǔ)

2023-12-17 14:49:20

前端首屏?xí)r間

2011-06-07 14:16:38

雙絞線

2023-09-08 15:37:29

軟件開(kāi)發(fā)性能

2018-11-20 10:09:42

磁盤(pán)IO性能

2019-05-21 15:42:08

磁盤(pán)IO指標(biāo)

2024-10-14 13:01:33

AOTcpu符號(hào)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)