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