01 uptime命令
通常我們發(fā)現(xiàn)系統(tǒng)變慢時(shí),,我們都會(huì)執(zhí)行top或者uptime命令,,來查看當(dāng)前系統(tǒng)的負(fù)載情況,比如像下面,,我執(zhí)行了uptime,系統(tǒng)返回的了結(jié)果,。
[root@lincoding ~]# uptime
08:31:49 up 27 min, 1 user, load average: 0.07, 0.04, 0.00
前幾列的信息,,相信大家都很熟悉,它們分別是當(dāng)前時(shí)間,、系統(tǒng)運(yùn)行時(shí)間和正在登陸的用戶個(gè)數(shù),,最后一個(gè)就是系統(tǒng)平均負(fù)載的情況。
08:31:49 // 當(dāng)前時(shí)間
up 27 min // 系統(tǒng)運(yùn)行時(shí)間
1 user // 正在登錄用戶數(shù)
load average: 0.07, 0.04, 0.00 // 平均負(fù)載的情況
Load Average的三個(gè)數(shù)字,,依次則是過去1分鐘,、5分鐘、15分鐘的平均負(fù)載,??梢酝ㄟ^觀察這三個(gè)數(shù)字的大小,可以簡(jiǎn)單判斷系統(tǒng)的負(fù)載是下降的趨勢(shì)還是上升的趨勢(shì),。
- 如果
load average: 1.00, 5.00, 10.00 三個(gè)數(shù)字依次增大,,則說明在過去的 1 分鐘系統(tǒng)的負(fù)載比過去 15 分鐘系統(tǒng)的負(fù)載小,表明系統(tǒng)的負(fù)載是下降的趨勢(shì),。
- 如果
load average: 10.00, 5.00, 1.00 三個(gè)數(shù)字依次降低,,則說明在過去的 1 分鐘系統(tǒng)的負(fù)載比過去 15 分鐘系統(tǒng)的負(fù)載大,表明系統(tǒng)的負(fù)載是上升的趨勢(shì),。
- 如果
load average: 0.07, 0.04, 0.0 三個(gè)數(shù)字基本相同,,或者相差不大,, 表明系統(tǒng)的負(fù)載是平穩(wěn)的。
所以分析系統(tǒng)的負(fù)載情況,,必須要看三個(gè)不同時(shí)間間隔的平均值,。
02 平均負(fù)載概念
平均負(fù)載很多人容易理解成單位時(shí)間內(nèi)的 CPU 使用率,這是不正確的,。平均負(fù)載確實(shí)與 CPU 使用率有關(guān)系,,但不是直接的關(guān)系。
簡(jiǎn)單來說,,平均負(fù)載是指單位時(shí)間內(nèi),,系統(tǒng)處于可運(yùn)行狀態(tài)和不可中斷狀態(tài)的平均進(jìn)程數(shù),也就是平均活躍進(jìn)程數(shù),,它和 CPU 使用率并沒有直接關(guān)系,。
- 可運(yùn)行狀態(tài),是指正在使用 CPU 或者正在等待 CPU 的進(jìn)程,,也就是在 ps 命令看到的 R 狀態(tài)的進(jìn)程,。
- 不可中斷狀態(tài),是指正處于內(nèi)核關(guān)鍵流程中的進(jìn)程,,并且這些流程是不可以打斷的,,比如最常見的等待硬件設(shè)備的 I/O 響應(yīng),也就是在 ps 命令看到的 D 狀態(tài)的進(jìn)程,。
因此,,平均負(fù)載其實(shí)就是平均活躍進(jìn)程數(shù),可以更直觀的理解成單位時(shí)間內(nèi)的活躍進(jìn)程數(shù),。
既然平均的是活躍進(jìn)程數(shù),,那么最理想的,就是每個(gè)CPU上剛好運(yùn)行著一個(gè)進(jìn)程,,這樣每個(gè)CPU就得到了充分利用,。
比如當(dāng)平均負(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。
03 平均負(fù)載為多少時(shí)合理
在評(píng)判你當(dāng)前的系統(tǒng)平均負(fù)載是否合理的時(shí),,首先你要知道系統(tǒng)有幾個(gè) CPU,,可以通過 lscpu 命令或者從文件 /proc/cpuinfo 中讀取
# lscpu 命令查看 CPU 個(gè)數(shù)
[root@lincoding ~]# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 4 # 這里數(shù)字表示 CPU 個(gè)數(shù)
....
# 從文件 /proc/cpuinfo 中查看 CPU 個(gè)數(shù)
[root@lincoding ~]# grep 'model name' /proc/cpuinfo | wc -l
4
有了 CPU 個(gè)數(shù),我們就可以判斷出,,當(dāng)平均負(fù)載比 CPU 個(gè)數(shù)還大的時(shí)候,,系統(tǒng)已經(jīng)出現(xiàn)了過載,。
這里我再舉個(gè)例子,假設(shè)我們?cè)谝粋€(gè)單 CPU 系統(tǒng)上看到平均負(fù)載為 1.73,,0.60,,7.98
- 在過去 1 分鐘內(nèi),系統(tǒng)有 73% 的超載
- 在過 15 分鐘內(nèi),,有 698%的超載,,從整體趨勢(shì)來看,系統(tǒng)的負(fù)載在降低,。
平均負(fù)載高于 CPU 數(shù)量 70% 的時(shí)候,,就應(yīng)該分析排查負(fù)載高的問題了。一旦負(fù)載過高,,就可能導(dǎo)致進(jìn)程響應(yīng)變慢,,進(jìn)而影響服務(wù)的正常功能。
04 平均負(fù)載與 CPU 使用率
我們經(jīng)常容易把平均負(fù)載和 CPU 使用率混淆,,所以在這里,,我也做一個(gè)區(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ì)比較高。
05 平均負(fù)載升高分析命令
我們現(xiàn)在很清楚的知道導(dǎo)致平均負(fù)載高的情況,,不只是看 CPU 的使用率,,也要觀察系統(tǒng) I/O 等待時(shí)間高不高。
當(dāng)發(fā)現(xiàn)平均負(fù)載升高時(shí),,可以使用 mpstat 命令查看 CPU 的性能,。
# -P ALL 表示監(jiān)控所有CPU,,后面數(shù)字1表示間隔1秒后輸出一組數(shù)據(jù)
$ 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
從上面發(fā)現(xiàn)
- CPU 的用戶層(%usr)使用率高達(dá)45%左右;
- CPU 的系統(tǒng)層(%sys)使用率高達(dá)50%左右,;
- CPU 的 I/0 - 等待(%iowait)占用率為0.41%,;
- CPU 的空閑率(%idle)只有2~3%。
可以推斷出是由于 CPU 使用率導(dǎo)致平均負(fù)載升高的情況,。
假設(shè)只有 CPU 的I/0 等待(%iowait)占用率高,,CPU 用戶層和系統(tǒng)層使用率很輕松,那么導(dǎo)致平均負(fù)載升高的原因就是 iowait 的升高,。
判斷了是因?yàn)?CPU 使用率升高還是 iowait 升高導(dǎo)致平均負(fù)載升高后,,我們還需要定位是哪個(gè)進(jìn)程導(dǎo)致的??梢杂?pidstat 來查詢:
# 間隔1秒后輸出一組數(shù)據(jù),,-u表示CPU指標(biāo)
$ 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
可以發(fā)現(xiàn)是 events/0 和 events/1 內(nèi)核進(jìn)程 CPU 使用率非常高,所以可能這兩個(gè)進(jìn)程導(dǎo)致平均負(fù)載升高,。
06 小結(jié)
平均負(fù)載提供了一個(gè)快速查看系統(tǒng)整體性能的手段,,反映了整體的負(fù)載情況。但只看平均負(fù)載本身,,我們并不能直接發(fā)現(xiàn),,到底是哪里出現(xiàn)了瓶頸。所以,,在理解平均負(fù)載時(shí),,也要注意:
- 平均負(fù)載高有可能是 CPU 密集型進(jìn)程導(dǎo)致的;
- 平均負(fù)載高并不一定代表 CPU 使用率高,,還有可能是 I/O 更繁忙了,;
- 當(dāng)發(fā)現(xiàn)負(fù)載高的時(shí)候,你可以使用
mpstat ,、pidstat 等工具,,輔助分析負(fù)載的來源。
|