伺服器io測試工具-fio --轉發 https://blog.51cto.com/u_12993908/5275922

Libra_bai發表於2024-07-10

Fio 是一個 I/O 工具,旨在用於基準測試和壓力/硬體驗證。它支援 19 種不同型別的 I/O 引擎(sync、mmap、libaio、posixaio、SG v3、splice、null、network、syslet、guasi、solarisaio 等)、I/O 優先順序(適用於較新的 Linux 核心) 、評估 I/O、分叉或執行緒作業等等。它可以在塊裝置和檔案上工作。fio 接受簡單易懂的文字格式的職位描述。包括幾個示例作業檔案。fio 顯示各種 I/O 效能資訊,包括完整的 IO 延遲和百分位數。Fio 在許多地方被廣泛使用,用於基準測試、QA 和驗證目的。它支援 Linux、FreeBSD、NetBSD、OpenBSD、OS X、OpenSolaris、AIX、HP-UX、Android 和 Windows。

目前主流的第三方IO測試工具有fio、iometer 和 Orion,這三種工具各有千秋,在linux 下也可以使用dd 進行簡單的磁碟(檔案系統)測試(文末補充)。

Fio在Linux系統下使用比較方便,iometer在window系統下使用比較方便,Orion是oracle的IO測試軟體,可在沒有安裝oracle資料庫的情況下模擬oracle資料庫場景的讀寫。

Multithreaded IO generation tool , FIO 是一個多執行緒io生成工具,可以生成多種IO模式,用來測試磁碟裝置的效能(也包含檔案系統:如針對網路檔案系統 NFS 的IO測試)。

1.安裝fio工具
1.1 yum 安裝fio
[root@s2ahumysqlpg01 fio-3.29]# yum install fio
[root@s2ahumysqlpg01 fio-3.29]# yum info fio
Loaded plugins: ulninfo
Available Packages
Name : fio
Arch : x86_64
Version : 3.7
Release : 2.el7
Size : 467 k
Repo : centos-7-base
Summary : Multithreaded IO generation tool
URL : http://git.kernel.dk/?p=fio.git;a=summary
License : GPLv2
Description : fio is an I/O tool that will spawn a number of threads or processes doing
: a particular type of io action as specified by the user. fio takes a
: number of global parameters, each inherited by the thread unless
: otherwise parameters given to them overriding that setting is given.
: The typical use of fio is to write a job file matching the io load
: one wants to simulate.

1.2 原始碼安裝fio
#可根據實際測試中缺少的外掛,安裝依賴包
yum -y install libaio-devel libaio-dev libaio* zilb*

下載 https://git.kernel.dk/cgit/fio/

tar -zxvf fio-3.29.tar.gz
cd fio-3.29
# 注意如果編譯的時候出現gcc 版本過低,可參考問題升級gcc 後在編譯。 或者安裝fio-3.20的版本
./configure
make
make install

[root@s2ahumysqlpg01 fio-3.29]# fio -v
fio-3.29


2.輸入輸出引數
2.1Fio常用輸入引數
filename=/dev/emcpowerb 支援檔案系統或者裸裝置,-filename=/dev/sda
direct=1 測試過程繞過機器自帶的buffer,使測試結果更真實
rw=randwread 測試隨機讀的I/O
rw=randwrite 測試隨機寫的I/O
rw=randrw 測試隨機混合寫和讀的I/O
rw=read 測試順序讀的I/O
rw=write 測試順序寫的I/O
rw=rw 測試順序混合寫和讀的I/O
bs=4k 單次io的塊檔案大小為4k
bsrange=512-2048 同上,提定資料塊的大小範圍
size=5g 本次的測試檔案大小為5g,以每次4k的io進行測試
numjobs=30 本次的測試執行緒為30
runtime=1000 測試時間為1000秒,如果不寫則一直將5g檔案分4k每次寫完為止
ioengine=psync io引擎使用pync方式(同步I),如果要使用libaio引擎, 需要yum install libaio-devel包
rwmixwrite=30 在混合讀寫的模式下,寫佔30%
group_reporting 關於顯示結果的,彙總每個程序的資訊
lockmem=1g 只使用1g記憶體進行測試
zero_buffers 用0初始化系統buffer。
nrfiles=8 每個程序生成檔案的數量。

磁碟讀寫常用測試點:
1. Read=100% Ramdon=100% rw=randread (100%隨機讀)
2. Read=100% Sequence=100% rw=read (100%順序讀)
3. Write=100% Sequence=100% rw=write (100%順序寫)
4. Write=100% Ramdon=100% rw=randwrite (100%隨機寫)
5. Read=70% Sequence=100% rw=rw, rwmixread=70, rwmixwrite=30 (70%順序讀,30%順序寫)
6. Read=70% Ramdon=100% rw=randrw, rwmixread=70, rwmixwrite=30 (70%隨機讀,30%隨機寫)


2.2Fio輸出結果說明
Fio工具讀寫測速結果引數說明
io 執行了多少M的IO
bw 平均IO頻寬
iops IOPS
runt 執行緒執行時間
slat 提交延遲 (stdev指標準差)
clat 完成延遲
lat 響應時間
bw 頻寬
cpu 利用率
IO depths io佇列
IO submit 單個IO提交要提交的IO數
IO complete 與上面的提交編號類似,但用於完成。
IO issued 發出的讀/寫請求的數量,以及其中有多少是短的。
IO latencies IO完延遲的分佈
io 總共執行了多少size的IO
aggrb group總頻寬
minb 最小平均頻寬.
maxb 最大平均頻寬.
mint group中執行緒的最短執行時間.
maxt group中執行緒的最長執行時間.
ios 所有group總共執行的IO數.
merge 總共發生的IO合併數.
ticks 我們保持磁碟繁忙的ticks數。
io_queue 花費在佇列上的總共時間.
util 磁碟利用率


3.測試場景
3.1順序讀
# 順序讀注意,bs 單次io的塊檔案大小,我們建議可以設定為資料庫的塊或頁大小,在真實的環境中或以調大size
fio -filename=/dev/sda1 -direct=1 -iodepth= 1 -rw=read -ioengine=psync -bs=4k -size=1000G -numjobs=50 -runtime=180 -group_reporting -name=sqe_100read_4k

[root@s2ahumysqlpg01 tmp]# fio -filename=/tmp/read.dat -direct=1 -iodepth 1 -rw=read -ioengine=psync -bs=4k -size=4G -numjobs=1 -runtime=180 -group_reporting -name=sqe_100read_4k
sqe_100read_4k: (g=0): rw=read, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=psync, iodepth=1
fio-3.29
Starting 1 process
sqe_100read_4k: Laying out IO file (1 file / 4096MiB)
Jobs: 1 (f=1): [R(1)][100.0%][r=8372KiB/s][r=2093 IOPS][eta 00m:00s]ta 00m:56s]
sqe_100read_4k: (groupid=0, jobs=1): err= 0: pid=5685: Fri Mar 4 17:42:10 2022
read: IOPS=3317, BW=13.0MiB/s (13.6MB/s)(2332MiB/180001msec)
clat (usec): min=209, max=535634, avg=296.20, stdev=1443.62
lat (usec): min=210, max=535635, avg=297.13, stdev=1443.62
clat percentiles (usec):
| 1.00th=[ 233], 5.00th=[ 241], 10.00th=[ 243], 20.00th=[ 247],
| 30.00th=[ 251], 40.00th=[ 253], 50.00th=[ 258], 60.00th=[ 265],
| 70.00th=[ 269], 80.00th=[ 281], 90.00th=[ 302], 95.00th=[ 330],
| 99.00th=[ 627], 99.50th=[ 1074], 99.90th=[ 4817], 99.95th=[ 9896],
| 99.99th=[34866]
bw ( KiB/s): min= 32, max=15432, per=100.00%, avg=13284.66, stdev=2559.17, samples=359
iops : min= 8, max= 3858, avg=3321.16, stdev=639.79, samples=359
lat (usec) : 250=28.88%, 500=69.77%, 750=0.58%, 1000=0.21%
lat (msec) : 2=0.36%, 4=0.08%, 10=0.06%, 20=0.03%, 50=0.02%
lat (msec) : 100=0.01%, 250=0.01%, 500=0.01%, 750=0.01%
cpu : usr=3.56%, sys=7.57%, ctx=597121, majf=0, minf=14
IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
issued rwts: total=597112,0,0,0 short=0,0,0,0 dropped=0,0,0,0
latency : target=0, window=0, percentile=100.00%, depth=1

Run status group 0 (all jobs):
READ: bw=13.0MiB/s (13.6MB/s), 13.0MiB/s-13.0MiB/s (13.6MB/s-13.6MB/s), io=2332MiB (2446MB), run=180001-180001msec

Disk stats (read/write):
sda: ios=599673/169, merge=2/7, ticks=185089/422, in_queue=184716, util=90.06%

我們需要得點關注的是IOPS :3317 以及BW IO頻寬是:13.0MiB/s

read: IOPS=3317, BW=13.0MiB/s (13.6MB/s)(2332MiB/180001msec)


3.2 隨機寫
#隨機寫 -rw=randwrite ,我們啟用了50個程序模擬
[root@s2ahumysqlpg01 fio-3.29]# fio -filename=/tmp/write.dat -direct=1 -iodepth 1 -rw=randwrite -ioengine=psync -bs=4k -size=4G -numjobs=50 -runtime=180 -group_reporting -name=sqe_100write_4k
sqe_100write_4k: (g=0): rw=randwrite, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=psync, iodepth=1
...
fio-3.29
Starting 50 processes
sqe_100write_4k: Laying out IO file (1 file / 4096MiB)
Jobs: 50 (f=50): [w(50)][100.0%][w=3692KiB/s][w=923 IOPS][eta 00m:00s]
sqe_100write_4k: (groupid=0, jobs=50): err= 0: pid=7128: Fri Mar 4 17:54:18 2022
write: IOPS=1108, BW=4434KiB/s (4540kB/s)(781MiB/180331msec); 0 zone resets
clat (usec): min=311, max=5969.7k, avg=45097.62, stdev=236640.38
lat (usec): min=313, max=5969.7k, avg=45098.90, stdev=236640.39
clat percentiles (usec):
| 1.00th=[ 750], 5.00th=[ 1057], 10.00th=[ 1303],
| 20.00th=[ 1647], 30.00th=[ 1844], 40.00th=[ 2343],
| 50.00th=[ 3064], 60.00th=[ 3687], 70.00th=[ 4047],
| 80.00th=[ 4948], 90.00th=[ 22938], 95.00th=[ 164627],
| 99.00th=[1283458], 99.50th=[1753220], 99.90th=[2634023],
| 99.95th=[3640656], 99.99th=[5939135]
bw ( KiB/s): min= 350, max=103337, per=100.00%, avg=7568.53, stdev=265.17, samples=10555
iops : min= 50, max=25811, avg=1887.29, stdev=66.26, samples=10555
lat (usec) : 500=0.09%, 750=0.95%, 1000=3.17%
lat (msec) : 2=29.75%, 4=34.89%, 10=18.41%, 20=2.36%, 50=2.42%
lat (msec) : 100=1.74%, 250=2.29%, 500=1.44%, 750=0.83%, 1000=0.34%
lat (msec) : 2000=1.02%, >=2000=0.30%
cpu : usr=0.03%, sys=0.15%, ctx=220103, majf=0, minf=821
IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
issued rwts: total=0,199884,0,0 short=0,0,0,0 dropped=0,0,0,0
latency : target=0, window=0, percentile=100.00%, depth=1

Run status group 0 (all jobs):
WRITE: bw=4434KiB/s (4540kB/s), 4434KiB/s-4434KiB/s (4540kB/s-4540kB/s), io=781MiB (819MB), run=180331-180331msec

Disk stats (read/write):
sda: ios=0/218756, merge=0/1942, ticks=0/9721312, in_queue=9809977, util=100.00%

我們可以看到IOPS是1108 ,BW頻寬只有 4434KiB/s

write: IOPS=1108, BW=4434KiB/s (4540kB/s)(781MiB/180331msec); 0 zone resets


3.3隨機讀寫混合
#70%隨機讀-rwmixread=70 ,30%隨機寫
[root@s2ahumysqlpg01 fio-3.29]# fio -filename=/tmp/read_write.dat -direct=1 -iodepth=1 -rw=randrw -rwmixread=70 -ioengine=psync -bs=4k -size=4G -numjobs=50 -runtime=180 -group_reporting -name=randrw_70read_4k

randrw_70read_4k: (g=0): rw=randrw, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=psync, iodepth=1
...
fio-3.29
Starting 50 processes
randrw_70read_4k: Laying out IO file (1 file / 4096MiB)
Jobs: 6 (f=6): [m(1),_(7),m(1),_(7),m(1),_(4),m(1),_(6),m(1),_(14),m(1),_(6)][2.2%][r=10.9MiB/s,w=4884KiB/s][r=2801,w=1221 IOPS][eta 02h:11m:59s]
randrw_70read_4k: (groupid=0, jobs=50): err= 0: pid=8027: Fri Mar 4 18:01:37 2022
read: IOPS=1802, BW=7209KiB/s (7382kB/s)(1268MiB/180113msec)
clat (usec): min=225, max=3503.6k, avg=18238.79, stdev=55447.72
lat (usec): min=226, max=3503.6k, avg=18239.86, stdev=55447.72
clat percentiles (usec):
| 1.00th=[ 330], 5.00th=[ 553], 10.00th=[ 635],
| 20.00th=[ 799], 30.00th=[ 1074], 40.00th=[ 1631],
| 50.00th=[ 3326], 60.00th=[ 8717], 70.00th=[ 17433],
| 80.00th=[ 28967], 90.00th=[ 47973], 95.00th=[ 69731],
| 99.00th=[ 147850], 99.50th=[ 196084], 99.90th=[ 429917],
| 99.95th=[ 859833], 99.99th=[2936013]
bw ( KiB/s): min= 350, max=25119, per=100.00%, avg=8438.00, stdev=106.40, samples=15326
iops : min= 50, max= 6272, avg=2094.52, stdev=26.64, samples=15326
write: IOPS=774, BW=3096KiB/s (3171kB/s)(545MiB/180113msec); 0 zone resets
clat (usec): min=251, max=3576.5k, avg=22074.38, stdev=134044.57
lat (usec): min=252, max=3576.5k, avg=22075.53, stdev=134044.60
clat percentiles (usec):
| 1.00th=[ 347], 5.00th=[ 537], 10.00th=[ 603],
| 20.00th=[ 709], 30.00th=[ 816], 40.00th=[ 955],
| 50.00th=[ 1188], 60.00th=[ 1565], 70.00th=[ 2311],
| 80.00th=[ 4080], 90.00th=[ 9634], 95.00th=[ 35390],
| 99.00th=[ 583009], 99.50th=[1082131], 99.90th=[1501561],
| 99.95th=[1837106], 99.99th=[3472884]
bw ( KiB/s): min= 350, max=13399, per=100.00%, avg=3753.05, stdev=51.84, samples=14762
iops : min= 50, max= 3343, avg=923.38, stdev=13.00, samples=14762
lat (usec) : 250=0.06%, 500=2.99%, 750=16.22%, 1000=12.87%
lat (msec) : 2=18.13%, 4=10.02%, 10=10.01%, 20=8.68%, 50=13.12%
lat (msec) : 100=5.06%, 250=1.98%, 500=0.44%, 750=0.11%, 1000=0.09%
lat (msec) : 2000=0.18%, >=2000=0.02%
cpu : usr=0.06%, sys=0.14%, ctx=488255, majf=0, minf=1027
IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
issued rwts: total=324593,139424,0,0 short=0,0,0,0 dropped=0,0,0,0
latency : target=0, window=0, percentile=100.00%, depth=1

Run status group 0 (all jobs):
READ: bw=7209KiB/s (7382kB/s), 7209KiB/s-7209KiB/s (7382kB/s-7382kB/s), io=1268MiB (1330MB), run=180113-180113msec
WRITE: bw=3096KiB/s (3171kB/s), 3096KiB/s-3096KiB/s (3171kB/s-3171kB/s), io=545MiB (571MB), run=180113-180113msec

Disk stats (read/write):
sda: ios=324721/139458, merge=0/2, ticks=5905787/3076202, in_queue=8984158, util=100.00%

從結果中我們可以看到70%隨機讀的IOPS 是1802 ,30%隨機寫是774 ,而頻寬分別是7209KiB/s,3096KiB/s。

read: IOPS=1802, BW=7209KiB/s (7382kB/s)(1268MiB/180113msec)

write: IOPS=774, BW=3096KiB/s (3171kB/s)(545MiB/180113msec); 0 zone resets

4.補充測試
4.1 測試建議
fio 用於測試磁碟效能時,測試之前需要先把要測試的磁碟解除安裝掉,測試完後需格式化一遍再掛載上去。
# 解除安裝磁碟
umount /mnt/datadir1

# 格式化磁碟
mkfs.ext4 /dev/sdd

# 掛載磁碟
mount -t ext4 /dev/sdd /mnt/datadir1

# 自動掛載,在裡面新增該盤
vim /etc/fstab

4.2IO監控
進行磁碟測試的時候,我們可以使用iostat 等監控工具,檢視所有磁碟當前的讀寫狀態(fedora 系統上 sysstat-11.7.3-2.fc29.x86_64 收錄了此工具)。
監控磁碟IO命令:iostat –mx 1

# iostat –mx 1
avg-cpu: %user %nice %system %iowait %steal %idle
0.25 0.00 3.01 80.70 0.00 16.04

Device r/s w/s rMB/s wMB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
sda 13417.00 0.00 209.64 0.00 0.00 0.00 0.00 0.00 2.23 0.00 29.96 16.00 0.00 0.07 100.00


rrqms:每秒這個裝置相關的讀取請求有多少被Merge了(當系統呼叫需要讀取資料的時候,VFS將請求發到各個FS,如果FS發現不同的讀取請求讀取的是相同Block的資料,FS會將這個請求合併Merge)
wrqm/s:每秒這個裝置相關的寫入請求有多少被Merge了。
rsec/s:The number of sectors read from the device per second.
wsec/s:The number of sectors written to the device per second.
rKB/s:The number of kilobytes read from the device per second.
wKB/s:The number of kilobytes written to the device per second.
avgrq-sz:平均請求扇區的大小,The average size (in sectors) of the requests that were issued to the device.
avgqu-sz:是平均請求佇列的長度。毫無疑問,佇列長度越短越好,The average queue length of the requests that were issued to the device.
await:每一個IO請求的處理的平均時間(單位是微秒毫秒)。這裡可以理解為IO的響應時間,一般地系統IO響應時間應該低於5ms,如果大於10ms就比較大了。
這個時間包括了佇列時間和服務時間,也就是說,一般情況下,await大於svctm,它們的差值越小,則說明佇列時間越短,反之差值越大,佇列時間越長,說明系統出了問題。
svctm:表示平均每次裝置I/O操作的服務時間(以毫秒為單位)。如果svctm的值與await很接近,表示幾乎沒有I/O等待,磁碟效能很好。
如果await的值遠高於svctm的值,則表示I/O佇列等待太長,系統上執行的應用程式將變慢。
%util: 在統計時間內所有處理IO時間,除以總共統計時間。例如,如果統計間隔1秒,該裝置有0.8秒在處理IO,而0.2秒閒置,那麼該裝置的%util = 0.8/1 = 80%,
所以該引數暗示了裝置的繁忙程度,一般地,如果該引數是100%表示磁碟裝置已經接近滿負荷執行了(當然如果是多磁碟,即使%util是100%,因為磁碟的併發能力,所以磁碟使用未必就到了瓶頸)。


4.3IOFIO 圖形介面工具
FIO 圖形介面工具:​ ​fio效能測試工具新添圖形前端gfio​​ ,apt install gfio # fio 圖形測試工具。

5.dd測試
dd 也是我們經常使用到的磁碟測試工具,Linux伺服器裝好系統之後,想要知道硬碟的讀寫是否能滿足服務的需要,如果不滿足硬碟的IO就是服務的一個瓶頸。我們可以使用dd命令簡單進行測試,更為專業的測試可以使用上面描述的fio 工具:

time有計時作用,dd用於複製,從if讀出,寫到of。if=/dev/zero不產生IO,因此可以用來測試純寫速度。同理of=/dev/null不產生IO,可以用來測試純讀速度。bs是每次讀或寫的大小,即一個塊的大小,count是讀寫塊的數量。

5.1 dd純寫速度
[root@s2ahumysqlpg01 fio-3.29]# time dd if=/dev/zero of=/tmp/ddout bs=8k count=5000
5000+0 records in
5000+0 records out
40960000 bytes (41 MB) copied, 0.055353 s, 740 MB/s

real 0m0.288s
user 0m0.004s
sys 0m0.276s
[root@s2ahumysqlpg01 fio-3.29]# time dd if=/dev/zero of=/tmp/ddout bs=8k count=50000
50000+0 records in
50000+0 records out
409600000 bytes (410 MB) copied, 1.59508 s, 257 MB/s

real 0m1.604s
user 0m0.021s
sys 0m0.379s
[root@s2ahumysqlpg01 fio-3.29]# time dd if=/dev/zero of=/tmp/ddout bs=8k count=500000
500000+0 records in
500000+0 records out
4096000000 bytes (4.1 GB) copied, 40.5061 s, 101 MB/s

real 0m40.584s
user 0m0.279s
sys 0m4.036s

dd測試讀寫速度,就是讀當前磁碟檔案,再寫入當前磁碟之中。一定程度上,複製量越大,讀寫的時間越長,統計的結果越準。但是測試結果資訊量較少,只能作為參考量,更多讀寫模式和測試資訊:可以使用dd 命令引數來配置:

使用conv, iflag, oflag 三個變數可以配置dd 命令的複製模組式,讀取模式和寫入模式;
#CONV 選項有:
ascii 從 EBCDIC 到 ASCII
ebcdic 從 ASCII 到 EBCDIC
ibm 從 ASCII 到備用 EBCDIC
block 用空格填充換行符終止的記錄到 cbs-size
unblock 用換行符替換 cbs-size 記錄中的尾隨空格
lcase 將大寫改為小寫
ucase 將小寫變為大寫
sparse 嘗試尋找而不是寫入 NUL 輸入塊的輸出
swab 交換每對輸入位元組
sync 用 NUL 填充每個輸入塊到 ibs 大小; 與 block 或 unblock 一起使用時,用空格而不是 NUL 填充
excl 如果輸出檔案已經存在,則失敗
nocreat 不建立輸出檔案
notrunc 不截斷輸出檔案
noerror 在讀取錯誤後繼續
fdatasync 在完成之前物理寫入輸出檔案資料
fsync 同樣,還要寫入後設資料

#FLAG( iflag, oflag) 選項有:
append 附加模式(僅對輸出有意義;建議使用 conv=notrunc)
direct 對資料使用直接 I/O
directory 除非目錄失敗
dsync 對資料使用同步 I/O
sync 同樣,也適用於後設資料
fullblock 累積輸入的完整塊(僅 iflag)
nonblock 使用非阻塞 I/O
noatime 不更新訪問時間
nocache 丟棄快取資料
noctty 不從檔案中分配控制終端
nofollow 不遵循符號連結
count_bytes 將 'count=N' 視為位元組數(僅限 iflag)
skip_bytes 將 'skip=N' 視為位元組數(僅 iflag)
seek_bytes 將 'seek=N' 視為位元組數(僅用於標記)

#如果要規避掉檔案系統cache,直接讀寫,不使用buffer cache,需做這樣的設定
iflag=direct,nonblock
oflag=direct,nonblock


5.2 dd純讀速度
[root@s2ahumysqlpg01 fio-3.29]# time dd if=/tmp/ddout of=/dev/null bs=4k count=5000
5000+0 records in
5000+0 records out
20480000 bytes (20 MB) copied, 0.180166 s, 114 MB/s

real 0m0.198s
user 0m0.000s
sys 0m0.033s
[root@s2ahumysqlpg01 fio-3.29]# time dd if=/tmp/ddout of=/dev/null bs=4k count=50000
50000+0 records in
50000+0 records out
204800000 bytes (205 MB) copied, 1.5581 s, 131 MB/s

real 0m1.560s
user 0m0.026s
sys 0m0.271s
[root@s2ahumysqlpg01 fio-3.29]# time dd if=/tmp/ddout of=/dev/null bs=4k count=500000
500000+0 records in
500000+0 records out
2048000000 bytes (2.0 GB) copied, 18.0358 s, 114 MB/s

real 0m18.038s
user 0m0.240s
sys 0m2.054s

5.3 dd 命令三種經典測試
# dd 命令三種經典使用方法:
dd if=/dev/zero of=test bs=64k count=16k 是不準確的,可能有資料存在核心快取中,沒有同步到磁碟上。對於關鍵資料應該加上fsync標識,防止關鍵資料丟失;
dd if=/dev/zero of=test bs=64k count=16k conv=fsync 較為穩妥,但是時間用時較長,他在dd結束前會寫資料和檔案後設資料到磁碟;
dd if=/dev/zero of=test bs=64k count=4k oflag=dsync or sync 每寫一次就寫一次磁碟,在實際操作中,可以聽到磁碟響聲,用時較長;
更多dd 命令詳細使用方法,可以參考man pages. dd 命令可以用來製作啟動盤,請參見博文 <a href="https://www.cnblogs.com/xuyaowen/p/linux_make_USB_boot.html" target="_blank" style="text-decoration:none;color:rgb(0, 0, 0);">linux (fedora 28) 製作啟動隨身碟,啟動盤</a>

#SSD 效能測試:
PCIe-SSD Optane: dd if=/dev/urandom of=./optane.bin bs=256k count=102400 (順序寫 25GB的隨機資料)
M.2-STAT-SSD: dd if=/dev/urandom of=./m2sata.bin bs=256k count=102400 (順序寫 25GB的隨機資料)
M.2-NVMe-SSD: dd if=/dev/urandom of=./m2nvme.bin bs=256k count=102400 (順序寫 25GB的隨機資料)
HDD: dd if=/dev/urandom of=./sata.bin bs=256k count=102400 (順序寫 25GB的隨機資料)


6.關於gcc 版本過低問題
[root@s2ahumysqlpg01 fio-3.29]# ./configure
Operating system Linux
CPU x86_64
Big endian no
Compiler gcc
Cross compile no

Static build no

Your compiler doesn't support C11 atomics. gcc 4.9/clang 3.6 are the
minimum versions with it - perhaps your compiler is too old?
C11 atomics support not found
Configure failed, check config.log and/or the above output

# 升級gcc 版本到 5.2
## 1.安裝centos-release-scl 工具
wget http://mirror.centos.org/centos/7/extras/x86_64/Packages/centos-release-scl-2-3.el7.centos.noarch.rpm
wget http://mirror.centos.org/centos/7/extras/x86_64/Packages/centos-release-scl-rh-2-3.el7.centos.noarch.rpm


[root@s2ahumysqlpg01 yum.repos.d]# rpm -ivh *.rpm
warning: centos-release-scl-2-3.el7.centos.noarch.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Preparing... ################################# [100%]
Updating / installing...
1:centos-release-scl-rh-2-3.el7.cen################################# [ 50%]
2:centos-release-scl-2-3.el7.centos################################# [100%]

#2.安裝devtoolset,注意,如果想安裝7.*版本的,就改成devtoolset-7-gcc*,以此類推
yum install centos-release-scl

#3. 啟用對應的devtoolset,所以你可以一次安裝多個版本的devtoolset,需要的時候用下面這條命令切換到對應的版本
enable devtoolset-8 bash

#4.檢視一下gcc版本
gcc -v
#5. 這條啟用命令只對本次會話有效,重啟會話後還是會變回原來的4.8.5版本,如下操作可以直接替換舊的gcc
舊的gcc是執行的 /usr/bin/gcc,所以將該目錄下的gcc/g++替換為剛安裝的新版本gcc軟連線,免得每次enable , 一般個人不建議直接替換
mv /usr/bin/gcc /usr/bin/gcc-4.8.5
ln -s /opt/rh/devtoolset-8/root/bin/gcc /usr/bin/gcc
mv /usr/bin/g++ /usr/bin/g++-4.8.5
ln -s /opt/rh/devtoolset-8/root/bin/g++ /usr/bin/g++
gcc --version
g++ --version

相關文章