操作系統(tǒng)的負(fù)載狀態(tài),反映了應(yīng)用程序的資源使用情況,從中能找出應(yīng)用程序優(yōu)化的瓶頸所在。
系統(tǒng)平均負(fù)載,是指處于運(yùn)行或不可打擾狀態(tài)的進(jìn)程的平均數(shù)。
處于運(yùn)行,表示運(yùn)行態(tài),占用 CPU,或就緒態(tài),等待 CPU 調(diào)度。
不可打擾,表示阻塞,正在等待 I/O
在 linux 系統(tǒng)中,要查看負(fù)載情況一般使用 uptime 命令(w 命令和 top 命令也行)*
一、uptime 命令
$ uptime 16:33:56 up 69 days, 5:10, 1 user, load average: 0.14, 0.24, 0.29
以上信息的解析如下:
- 16:33:56 : 當(dāng)前時(shí)間
- up 69 days, 5:10 : 系統(tǒng)運(yùn)行了 69 天 5 小時(shí) 10 分
- 1 user : 當(dāng)前有 1 個(gè)用戶登錄了系統(tǒng) load average: 0.14, 0.24, 0.29 : 系統(tǒng)在過去 1 分鐘內(nèi),5 分鐘內(nèi),15 分鐘內(nèi)的平均負(fù)載
- load average: 0.14, 0.24, 0.29 : 系統(tǒng)在過去 1 分鐘內(nèi),5 分鐘內(nèi),15 分鐘內(nèi)的平均負(fù)載
平均負(fù)載解析
查看邏輯 CPU 核心數(shù):
$ grep 'model name' /proc/cpuinfo | wc -l 1
運(yùn)行結(jié)果表示,有 1 個(gè)邏輯 CPU 核心。以 1 個(gè) CPU 核心為例,假設(shè) CPU 每分鐘最多處理 100 個(gè)進(jìn)程 –
- load=0,沒有進(jìn)程需要 CPU
- load=0.5,CPU 處理了 50 個(gè)進(jìn)程
- load=1, CPU 處理了 100 個(gè)進(jìn)程,這時(shí) CPU 已被占滿,但系統(tǒng)還是能順暢運(yùn)作的
- load=1.5, CPU 處理了 100 個(gè)進(jìn)程,還有 50 個(gè)進(jìn)程正在排除等著 CPU 處理,這時(shí),CPU 已經(jīng)超負(fù)荷工作了
為了系統(tǒng)順暢運(yùn)行,load 值最好不要超過 1.0,這樣就沒有進(jìn)程需要等待了,所有進(jìn)程都能第一時(shí)間得到處理。
很顯然,1.0 是一個(gè)關(guān)鍵值,超過這個(gè)值,系統(tǒng)就不在最佳狀態(tài)了。 一般 0.7 是一個(gè)比較理想的值。
另外,load 值的健康狀態(tài)還跟系統(tǒng) CPU 核心數(shù)相關(guān),如果 CPU 核心數(shù)為 2,那么 load 值健康值應(yīng)該為 2,以此類推。
評(píng)價(jià)系統(tǒng)的負(fù)載一般采用 15 分鐘內(nèi)的那個(gè)平均負(fù)載值。
二、w 命令
$ w 17:47:40 up 69 days, 6:24, 1 user, load average: 0.46, 0.26, 0.25 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT lvinkim pts/0 14.18.144.2 15:55 0.00s 0.02s 0.00s w
第 1 行:與 uptime 一相同。
第 2 行以下,當(dāng)前登錄用戶的列表。
三、top 命令
$ top top - 17:51:23 up 69 days, 6:28, 1 user, load average: 0.31, 0.30, 0.26 Tasks: 99 total, 1 running, 98 sleeping, 0 stopped, 0 zombie Cpu(s): 2.3%us, 0.2%sy, 0.0%ni, 97.4%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 1922244k total, 1737480k used, 184764k free, 208576k buffers Swap: 0k total, 0k used, 0k free, 466732k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 19232 1004 708 S 0.0 0.1 0:01.17 init 2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd ...
第 1 行:與 uptime 一相同。
第 2 行:進(jìn)程數(shù)信息。
- Tasks: 99 total : 總共有 99 個(gè)進(jìn)程
- 1 running : 1 個(gè)進(jìn)程正在占用 CPU
- 98 sleeping : 98 個(gè)睡眠進(jìn)程
- 0 stopped : 0 個(gè)停止的進(jìn)程
- 0 zombie : 0 個(gè)僵尸進(jìn)程
第 3 行 : CPU 使用率
- us (user): 非 nice 用戶進(jìn)程占用 CPU 的比率
- sy (system): 內(nèi)核、內(nèi)核進(jìn)程占用 CPU 的比率
- ni (nice): 用戶進(jìn)程空間內(nèi)改變過優(yōu)先級(jí)的進(jìn)程占用 CPU 比率
- id (idle): CPU 空閑比率,如果系統(tǒng)緩慢而這個(gè)值很高,說明系統(tǒng)慢的原因不是 CPU 負(fù)載高
- wa (iowait): CPU 等待執(zhí)行 I/O 操作的時(shí)間比率,該指標(biāo)可以用來排查磁盤 I/O 的問題,通常結(jié)合 wa 和 id 判斷
- hi (Hardware IRQ): CPU 處理硬件中斷所占時(shí)間的比率
- si (Software Interrupts): CPU 處理軟件中斷所占時(shí)間的比率
- st (steal): 流逝的時(shí)間,虛擬機(jī)中的其他任務(wù)所占 CPU 時(shí)間的比率
需要注意的一些情形:
- 用戶進(jìn)程 us 占比高,I/O 操作 wa 低:說明系統(tǒng)緩慢的原因在于進(jìn)程占用大量 CPU,通常還會(huì)伴有教低的空閑比率 id,說明 CPU 空轉(zhuǎn)時(shí)間很少。
- I/O 操作 wa 低,空閑比率 id 高:可以排除 CPU 資源瓶頸的可能。
- I/O 操作 wa 高:說明 I/O 占用了大量的 CPU 時(shí)間,需要檢查交換空間的使用,交換空間位于磁盤上,性能遠(yuǎn)低于內(nèi)存,當(dāng)內(nèi)存耗盡開始使用交換空間時(shí),將會(huì)給性能帶來嚴(yán)重影響,所以對(duì)于性能要求較高的服務(wù)器,一般建議關(guān)閉交換空間。另一方面,如果內(nèi)存充足,但 wa 很高,說明需要檢查哪個(gè)進(jìn)程占用了大量的 I/O 資源。
更多負(fù)載情形,可在實(shí)際中靈活判斷。
四、IOStat 命令
iostat 命令可以查看系統(tǒng)分區(qū)的 IO 使用情況
$ iostat Linux 2.6.32-573.22.1.el6.x86_64 (sgs02) 01/20/2017 _x86_64_ (1 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 2.29 0.00 0.25 0.04 0.00 97.41 Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn vda 1.15 3.48 21.88 21016084 131997520
一些值得注意的 IO 指標(biāo) :
- Device : 磁盤名稱
- tps : 每秒 I/O 傳輸請(qǐng)求量
- Blk_read/s : 每秒讀取多少塊,查看塊大小可參考命令 tune2fs
- Blk_wrtn/s : 每秒寫取多少塊
- Blk_read : 一共讀了多少塊
- –Blk_wrtn : 一共寫了多少塊
五、iotop 命令
iotop 命令類似于 top 命令,但是顯示的是各個(gè)進(jìn)程的 I/O 情況,對(duì)于定位 I/O 操作較重的進(jìn)程有比較大的作用。
# iotop Total DISK READ: 0.00 B/s | Total DISK WRITE: 774.52 K/s TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND 272 be/3 root 0.00 B/s 0.00 B/s 0.00 % 4.86 % [jbd2/vda1-8] 9072 be/4 MySQL 0.00 B/s 268.71 K/s 0.00 % 0.00 % mysqld 5058 be/4 lvinkim 0.00 B/s 3.95 K/s 0.00 % 0.00 % php-fpm: pool www 1 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % init
可以看到不同任務(wù)的讀寫強(qiáng)度。
六、sysstat 工具
很多時(shí)候當(dāng)檢測(cè)到或者知道歷史的高負(fù)載狀況時(shí),可能需要回放歷史監(jiān)控?cái)?shù)據(jù),這時(shí) sar 命令就派上用場(chǎng)了,sar 命令同樣來自 sysstat 工具包,可以記錄系統(tǒng)的 CPU 負(fù)載、I/O 狀況和內(nèi)存使用記錄,便于歷史數(shù)據(jù)的回放。
sysstat 的配置文件在 /etc/sysconfig/sysstat 文件,歷史日志的存放位置為 /var/log/sa
統(tǒng)計(jì)信息都是每 10 分鐘記錄一次,每天的 23:59 會(huì)分割統(tǒng)計(jì)文件,這些操作的頻率都在 /etc/cron.d/sysstat 文件配置。
七、sar 命令
使用 sar 命令查看當(dāng)天 CPU 使用:
$ sar Linux 2.6.32-431.23.3.el6.x86_64 (szs01) 01/20/2017 _x86_64_ (1 CPU) 10:50:01 AM CPU %user %nice %system %iowait %steal %idle 11:00:01 AM all 0.45 0.00 0.22 0.40 0.00 98.93 Average: all 0.45 0.00 0.22 0.40 0.00 98.93
使用 sar 命令查看當(dāng)天內(nèi)存使用:
$ sar -r Linux 2.6.32-431.23.3.el6.x86_64 (szs01) 01/20/2017 _x86_64_ (1 CPU) 10:50:01 AM kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit 11:00:01 AM 41292 459180 91.75 44072 164620 822392 164.32 Average: 41292 459180 91.75 44072 164620 822392 164.32
使用 sar 命令查看當(dāng)天 IO 統(tǒng)計(jì)記錄:
$ sar -b Linux 2.6.32-431.23.3.el6.x86_64 (szs01) 01/20/2017 _x86_64_ (1 CPU) 10:50:01 AM tps rtps wtps bread/s bwrtn/s 11:00:01 AM 3.31 2.14 1.17 37.18 16.84 Average: 3.31 2.14 1.17 37.18 16.84
更多 sar 用法,請(qǐng) man sar 。