在 Linux 下如何測試硬碟效能(feat. Ubuntu)
每個管理員都會需要知道手上的裝置到底有多少能耐,尤其是型號眾多的儲存裝置,自己沒測過還真的不安心。
使用圖形界面的工具
搜尋
Disk
就可以找到
傳輸率:
- 取樣數目:以我個人的經驗來說,預設的 100 就夠了,更多也不會準到哪裡去。如果你測的是隨身碟之類較慢的裝置,那就請設的更小一點,不然會測到天荒地老。
- 取樣大小:這個就比較微妙,不過我建議是看你的硬碟快取有多大,然後要比它大一些,像是現在的桌機多數都有 128M 以上,這時候我會設成 200M
注:這裡的
MiB
指的是 Mega Binary Byte,也就是 1024 進位的意思
存取時間:
取樣數目:按照預設值就好了,除非你測的是很大的傳統硬碟 ex. 3T 以上
上圖是 創見 JetFlash JF760 16GB 的測試結果。
使用 hdparm
就… 好用的內建工具
➜ ~ sudo hdparm -tT --direct /dev/sda
/dev/sda:
Timing O_DIRECT cached reads: 3160 MB in 2.00 seconds = 1580.36 MB/sec
Timing O_DIRECT disk reads: 2702 MB in 3.01 seconds = 897.76 MB/sec
上面的設定 -t
測有快取的,-T
測沒快取的,--direct
關閉分頁快取。
使用 Sysbench
當然直接從套件庫安裝也是可以,不過套件庫裡面的版本比較舊,輸出結果比較難懂,我不喜歡。
sudo apt install sysbench
我比較喜歡從官方的 GitHub 上編譯,反正程式很小,編譯不用花多少時間!
首先安裝編譯需要的工具:
sudo apt install make automake libtool pkg-config libaio-dev
# For MySQL support
sudo apt install libmysqlclient-dev libssl-dev
# For PostgreSQL support
sudo apt install libpq-dev
到這裡下載最新的版本:
https://github.com/akopytov/sysbench/releases/latest
編譯並安裝:
# 解壓縮
unzip sysbench-1.x.x.zip
# 編譯
cd sysbench-1.x.x
./autogen.sh
# 加入 --with-pgsql 選項,以啟用 PostgreSQL
./configure
make -j4
# 安裝
sudo make install
安裝完成之後,就可以開始測試!
首先設定建立總計 1G 的測試檔案,怎麼生成就靠預設值:
~ » sysbench fileio --threads=20 --file-total-size=1G --file-test-mode=rndrw prepare
sysbench 1.0.17 (using bundled LuaJIT 2.1.0-beta2)
128 files, 8192Kb each, 1024Mb total
Creating files for the test...
Extra file open flags: (none)
Creating file test_file.0
Creating file test_file.1
Creating file test_file.2
...略...
Creating file test_file.127
1073741824 bytes written in 13.79 seconds (74.27 MiB/sec).
接下來就可以開始測試:
➜ ~ sysbench fileio --threads=20 --file-total-size=1G --file-test-mode=rndrw run
sysbench 1.0.17 (using bundled LuaJIT 2.1.0-beta2)
...略...
File operations:
reads/s: 38.69
writes/s: 25.87
fsyncs/s: 208.78
Throughput:
read, MiB/s: 0.60
written, MiB/s: 0.40
General statistics:
total time: 20.1341s
total number of events: 2944
Latency (ms):
min: 0.00
avg: 80.90
max: 3867.97
95th percentile: 376.49
sum: 238155.27
Threads fairness:
events (avg/stddev): 147.2000/55.00
execution time (avg/stddev): 11.9078/1.87
然後也不要忘記清理剛才建立的檔案:
➜ ~ sysbench fileio --threads=20 --file-total-size=1G --file-test-mode=rndrw cleanup
sysbench 1.0.17 (using bundled LuaJIT 2.1.0-beta2)
Removing test files...
嗯… 我知道這段
使用 fio
總之是個很複雜的工具,報告非常詳細,我也只用過幾次,我覺得 SSORC.tw 在參數的解釋上比較詳細,有興趣的各位就直接去看吧!
注意:千萬 不要 指到 block 裝置,會抹掉的!
➜ ~ fio --name fio_test_read --direct=1 --rw=randrw --bs=4k --size=1G --refill_buffers --ioengine=libaio --iodepth=16
fio_test_read: (g=0): rw=randrw, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=16
fio-3.1
Starting 1 process
Jobs: 1 (f=1): [m(1)][95.9%][r=0KiB/s,w=0KiB/s][r=0,w=0 IOPS][eta 00m:02s]
fio_test_read: (groupid=0, jobs=1): err= 0: pid=3020: Mon Jul 15 02:12:47 2019
read: IOPS=2740, BW=10.7MiB/s (11.2MB/s)(512MiB/47824msec)
slat (usec): min=2, max=890, avg=30.84, stdev=23.99
clat (usec): min=63, max=11126k, avg=3510.23, stdev=150054.01
lat (usec): min=80, max=11126k, avg=3541.69, stdev=150053.58
clat percentiles (usec):
| 1.00th=[ 281], 5.00th=[ 343], 10.00th=[ 404],
| 20.00th=[ 494], 30.00th=[ 529], 40.00th=[ 553],
...略...
--ioengine=libaio
:還蠻有效的,用async io
的方式可以避免被 CPU 限制--name fio_test_read
:請千萬不要用/dev/sda
之類的,除非你很清楚自己在幹麻--refill_buffers
:避免使用 buffer--iodepth=16
:使用 16 個 Thread / Worker 進行測試