1. 查看磁盤 IO 性能
1.1 top 命令
top 命令通過查看 CPU 的 wa% 值來判斷當前磁盤 IO 性能,如果這個數值過大,很可能是磁盤 IO 太高了,當然也可能是其他原因,例如網絡 IO 過高等。
top命令的其他參數代表的含義詳見top命令詳解
1.2 sar 命令
sar 命令是分析系統瓶頸的神器,可以用來查看 CPU 、內存、磁盤、網絡等性能。
sar 命令查看當前磁盤性能的命令為:
[root@server-68.2.stage.polex.io var ]$ sar -d -p 1 2 Linux 3.10.0-693.5.2.el7.x86_64 (server-68) 03/11/2019 _x86_64_ (64 CPU) 02:28:54 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 02:28:55 PM sda 1.00 0.00 3.00 3.00 0.01 9.00 9.00 0.90 02:28:55 PM sdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 02:28:55 PM polex_pv-rootvol 1.00 0.00 3.00 3.00 0.01 9.00 9.00 0.90 02:28:55 PM polex_pv-varvol 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 02:28:55 PM polex_pv-homevol 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 02:28:55 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 02:28:56 PM sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 02:28:56 PM sdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 02:28:56 PM polex_pv-rootvol 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 02:28:56 PM polex_pv-varvol 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 02:28:56 PM polex_pv-homevol 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 Average: DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util Average: sda 0.50 0.00 1.50 3.00 0.00 9.00 9.00 0.45 Average: sdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 Average: polex_pv-rootvol 0.50 0.00 1.50 3.00 0.00 9.00 9.00 0.45 Average: polex_pv-varvol 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 Average: polex_pv-homevol 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
其中, “-d”參數代表查看磁盤性能,“-p”參數代表將 dev 設備按照 sda,sdb……名稱顯示,“1”代表每隔1s采取一次數值,“2”代表總共采取2次數值。
-
await:平均每次設備 I/O 操作的等待時間(以毫秒為單位)。
-
svctm:平均每次設備 I/O 操作的服務時間(以毫秒為單位)。
-
%util:一秒中有百分之幾的時間用於 I/O 操作。
對於磁盤 IO 性能,一般有如下評判標准:
正常情況下 svctm 應該是小於 await 值的,而 svctm 的大小和磁盤性能有關,CPU 、內存的負荷也會對 svctm 值造成影響,過多的請求也會間接的導致 svctm 值的增加。
await 值的大小一般取決與 svctm 的值和 I/O 隊列長度以 及I/O 請求模式,如果 svctm 的值與 await 很接近,表示幾乎沒有 I/O 等待,磁盤性能很好,如果 await 的值遠高於 svctm 的值,則表示 I/O 隊列等待太長,系統上運行的應用程序將變慢,此時可以通過更換更快的硬盤來解決問題。
%util 項的值也是衡量磁盤 I/O 的一個重要指標,如果 %util 接近 100% ,表示磁盤產生的 I/O 請求太多,I/O 系統已經滿負荷的在工作,該磁盤可能存在瓶頸。長期下去,勢必影響系統的性能,可以通過優化程序或者通過更換更高、更快的磁盤來解決此問題。
默認情況下,sar從最近的0點0分開始顯示數據;如果想繼續查看一天前的報告;可以查看保存在/var/log/sa/下的sar日志:
[root@server-68.2.stage.polex.io var ]$ sar -d -p -f /var/log/sa/sa11 | more Linux 3.10.0-693.5.2.el7.x86_64 (server-68) 03/11/2019 _x86_64_ (64 CPU) 09:50:01 AM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 10:00:01 AM sda 0.51 0.00 9.06 17.82 0.02 37.65 14.65 0.74 10:00:01 AM sdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 10:00:01 AM polex_pv-rootvol 0.22 0.00 2.50 11.56 0.01 37.44 14.10 0.31 10:00:01 AM polex_pv-varvol 0.30 0.00 6.55 21.97 0.01 38.55 14.73 0.44 10:00:01 AM polex_pv-homevol 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 10:10:01 AM sda 0.79 3.45 13.18 21.06 0.04 51.81 11.03 0.87 10:10:01 AM sdb 0.04 3.45 0.00 86.33 0.00 0.25 0.25 0.00 10:10:01 AM polex_pv-rootvol 0.26 0.00 3.08 11.85 0.01 50.21 17.88 0.46 10:10:01 AM polex_pv-varvol 0.54 3.45 10.10 24.95 0.03 52.58 7.49 0.41 10:10:01 AM polex_pv-homevol 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 10:20:01 AM sda 0.65 0.00 10.43 16.11 0.03 38.67 10.99 0.71 10:20:01 AM sdb 0.04 3.46 0.00 86.33 0.00 0.08 0.08 0.00
1.3 iostat 命令
iostat主要用於監控系統設備的 IO 負載情況,iostat 首次運行時顯示自系統啟動開始的各項統計信息,之后運行 iostat 將顯示自上次運行該命令以后的統計信息。用戶可以通過指定統計的次數和時間來獲得所需的統計信息。
[root@server-68.2.stage.polex.io var ]$ iostat -dxk 1 2 Linux 3.10.0-693.5.2.el7.x86_64 (server-68) 03/11/2019 _x86_64_ (64 CPU) Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 0.00 0.06 0.32 2.08 1.44 72.78 61.81 0.14 59.32 0.51 68.37 5.68 1.36 sdb 0.00 0.00 0.03 0.00 1.15 0.00 86.32 0.00 0.17 0.17 0.00 0.16 0.00 dm-0 0.00 0.00 0.00 0.24 0.02 1.56 13.22 0.01 44.55 6.36 44.71 13.25 0.32 dm-1 0.00 0.00 0.32 1.90 1.32 71.22 65.30 0.14 62.43 0.49 72.79 4.75 1.06 dm-2 0.00 0.00 0.00 0.00 0.00 0.00 26.79 0.00 28.06 4.68 38.98 5.18 0.00 Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 0.00 0.00 0.00 3.00 0.00 16.00 10.67 0.26 86.33 0.00 86.33 42.33 12.70 sdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 dm-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 dm-1 0.00 0.00 0.00 3.00 0.00 16.00 10.67 0.26 86.33 0.00 86.33 42.33 12.70 dm-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
該命令的結果與上面 sar -d -p 1 2 命令類似,實際使用中主要還是看 await svctm %util 參數。
1.4 vmstat 命令
vmstat 命令使用方法很簡單:
[root@server-68.2.stage.polex.io var ]$ vmstat 2 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 3 0 0 93221488 4176 69117136 0 0 0 1 0 0 4 1 94 0 0 2 0 0 93226048 4176 69117128 0 0 0 0 33326 36671 18 2 80 0 0 1 0 0 93218776 4176 69117104 0 0 0 9 26225 21588 18 2 80 0 0 1 0 0 93226072 4176 69117072 0 0 0 0 13271 25857 5 0 94 0 0 0 0 0 93223984 4176 69117040 0 0 0 5 34637 24444 20 2 78 0 0 11 0 0 93219248 4176 69117184 0 0 0 0 30736 20671 8 2 90 0 0
輸出結果中,bi bo 可以表示磁盤當前性能:
-
bi 塊設備每秒接收的塊數量,這里的塊設備是指系統上所有的磁盤和其他塊設備,默認塊大小是 1024 byte 。
-
bo 塊設備每秒發送的塊數量,例如我們讀取文件,bo 就要大於0。bi 和 bo 一般都要接近 0,不然就是 IO 過於頻繁,需要調整。
2. 測試磁盤 IO 性能
2.1 hdparm 命令
hdparm 命令提供了一個命令行的接口用於讀取和設置IDE或SCSI硬盤參數,注意該命令只能測試磁盤的讀取速率。
例如,測試 sda 磁盤的讀取速率:
[root@server-68.2.stage.polex.io var ]$ hdparm -Tt /dev/polex_pv/varvol /dev/polex_pv/varvol: Timing cached reads: 15588 MB in 2.00 seconds = 7803.05 MB/sec Timing buffered disk reads: 1128 MB in 3.01 seconds = 374.90 MB/sec
從測試結果看出,帶有緩存的讀取速率為:7803.05MB/s ,磁盤的實際讀取速率為:374.90 MB/s 。
2.2 dd 命令
Linux dd 命令用於讀取、轉換並輸出數據。dd 可從標准輸入或文件中讀取數據,根據指定的格式來轉換數據,再輸出到文件、設備或標准輸出。
我們可以利用 dd 命令的復制功能,測試某個磁盤的 IO 性能,須要注意的是 dd 命令只能大致測出磁盤的 IO 性能,不是非常准確。
測試寫性能命令:
[root@server-68.2.stage.polex.io var ]$ time dd if=/dev/zero of=test.file bs=1G count=2 oflag=direct 2+0 records in 2+0 records out 2147483648 bytes (2.1 GB) copied, 13.5487 s, 159 MB/s real 0m13.556s user 0m0.000s sys 0m0.888s
可以看到,該分區磁盤寫入速率為 159M/s,其中:
- /dev/zero 偽設備,會產生空字符流,對它不會產生 IO 。
- if 參數用來指定 dd 命令讀取的文件。
- of 參數用來指定 dd 命令寫入的文件。
- bs 參數代表每次寫入的塊的大小。
- count 參數用來指定寫入的塊的個數。
- offlag=direc 參數測試 IO 時必須指定,代表直接寫如磁盤,不使用 cache 。
測試讀性能命令:
[root@server-68.2.stage.polex.io var ]$ dd if=test.file of=/dev/null iflag=direct 4194304+0 records in 4194304+0 records out 2147483648 bytes (2.1 GB) copied, 4.87976 s, 440 MB/s
可以看到,該分區的讀取速率為 440MB/s
2.3 fio 命令
fio 命令是專門測試 iops 的命令,比 dd 命令准確,fio 命令的參數很多,這里舉幾個例子供大家參考:
順序讀:
fio -filename=/var/test.file -direct=1 -iodepth 1 -thread -rw=read -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=test_r
隨機寫:
fio -filename=/var/test.file -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=test_randw
順序寫:
fio -filename=/var/test.file -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=test_w
混合隨機讀寫:
fio -filename=/var/test.file -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=70 -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=test_r_w -ioscheduler=noop
參考鏈接:
https://elf8848.iteye.com/blog/2168876
https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/sar.html
http://blog.sina.com.cn/s/blog_62b832910102w3zt.html
https://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858810.html
https://linux.cn/article-6104-1.html
http://www.runoob.com/linux/linux-comm-hdparm.html
sar –u 查看CPU使用率
[root@localhost ~]# sar -u
Linux 2.6.18-194.26.1.el5 (localhost) 2012年04月29日
09時39分42秒 LINUX RESTART
09時40分01秒 CPU %user %nice %system %iowait %steal %idle
09時50分01秒 all 0.14 0.00 0.58 0.12 0.00 99.15
10時00分01秒 all 0.06 0.00 0.50 0.16 0.00 99.27
10時10分01秒 all 0.11 0.06 0.95 2.58 0.00 96.30
10時20分01秒 all 0.12 0.19 0.82 1.41 0.00 97.46
10時30分01秒 all 0.14 0.00 0.54 0.12 0.00 99.20
10時40分01秒 all 0.15 0.00 0.54 0.16 0.00 99.15
Average: all 0.12 0.04 0.65 0.76 0.00 98.43
這里:
%user : 用戶模式下消耗的CPU時間的比例;
%nice:通過nice改變了進程調度優先級的進程,在用戶模式下消耗的CPU時間的比例;
%system:系統模式下消耗的CPU時間的比例;
%iowait:CPU等待磁盤I/O而導致空閑狀態消耗時間的比例;
%steal:利用Xen等操作系統虛擬化技術時,等待其他虛擬CPU計算占用的時間比例;
%idle:CPU沒有等待磁盤I/O等的空閑狀態消耗的時間比例;
注:
如果 %iowait 的值過高,表示硬盤存在I/O瓶頸
如果 %idle 的值高但系統響應慢時,有可能是 CPU 等待分配內存,此時應加大內存容量
如果 %idle 的值持續低於 10,則系統的 CPU 處理能力相對較低,表明系統中最需要解決的資源是 CPU