您好,登錄后才能下訂單哦!
小編給大家分享一下Linux系統中FIO常用命令有哪些,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
FIO是測試IOPS的非常好的工具,用來對硬件進行壓力測試和驗證,支持13種不同的I/O引擎,他可以通過多線程或進程模擬各種io操作。
參數說明: filename=/dev/sdb1 測試文件名稱,通常選擇需要測試的盤的data目錄。 direct=1 是否使用directIO,測試過程繞過OS自帶的buffer,使測試磁盤的結果更真實。Linux讀寫的時候,內核維護了緩存,數據先寫到緩存,后面再后臺寫到SSD。讀的時候也優先讀緩存里的數據。這樣速度可以加快,但是一旦掉電緩存里的數據就沒了。所以有一種模式叫做DirectIO,跳過緩存,直接讀寫SSD。 rw=randwrite 測試隨機寫的I/O rw=randrw 測試隨機寫和讀的I/O bs=16k 單次io的塊文件大小為16k bsrange=512-2048 同上,提定數據塊的大小范圍 size=5G 每個線程讀寫的數據量是5GB。 numjobs=1 每個job(任務)開1個線程,這里用了幾,后面每個用-name指定的任務就開幾個線程測試。所以最終線程數=任務數(幾個name=jobx)* numjobs。 name=job1:一個任務的名字,重復了也沒關系。如果fio -name=job1 -name=job2,建立了兩個任務,共享-name=job1之前的參數。-name之后的就是job2任務獨有的參數。 thread 使用pthread_create創建線程,另一種是fork創建進程。進程的開銷比線程要大,一般都采用thread測試。 runtime=1000 測試時間為1000秒,如果不寫則一直將5g文件分4k每次寫完為止。 ioengine=libaio 指定io引擎使用libaio方式。libaio:Linux本地異步I/O。請注意,Linux可能只支持具有非緩沖I/O的排隊行為(設置為“direct=1”或“buffered=0”);rbd:通過librbd直接訪問CEPH Rados iodepth=16 隊列的深度為16.在異步模式下,CPU不能一直無限的發命令到SSD。比如SSD執行讀寫如果發生了卡頓,那有可能系統會一直不停的發命令,幾千個,甚至幾萬個,這樣一方面SSD扛不住,另一方面這么多命令會很占內存,系統也要掛掉了。這樣,就帶來一個參數叫做隊列深度。 Block Devices(RBD),無需使用內核RBD驅動程序(rbd.ko)。該參數包含很多ioengine,如:libhdfs/rdma等 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%隨機寫)
fio例子:
[root@docker sda]# fio -ioengine=libaio -bs=4k -direct=1 -thread -rw=read -filename=/dev/sda -name="BS 4KB read test" -iodepth=16 -runtime=60 BS 4KB read test: (g=0): rw=read, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=16 fio-3.7 Starting 1 thread Jobs: 1 (f=1): [R(1)][100.0%][r=89.3MiB/s,w=0KiB/s][r=22.9k,w=0 IOPS][eta 00m:00s] BS 4KB read test: (groupid=0, jobs=1): err= 0: pid=18557: Thu Apr 11 13:08:11 2019 read: IOPS=22.7k, BW=88.5MiB/s (92.8MB/s)(5313MiB/60001msec) slat (nsec): min=901, max=168330, avg=6932.34, stdev=1348.82 clat (usec): min=90, max=63760, avg=698.08, stdev=240.83 lat (usec): min=97, max=63762, avg=705.17, stdev=240.81 clat percentiles (usec): | 1.00th=[ 619], 5.00th=[ 627], 10.00th=[ 627], 20.00th=[ 635], | 30.00th=[ 635], 40.00th=[ 685], 50.00th=[ 717], 60.00th=[ 725], | 70.00th=[ 725], 80.00th=[ 725], 90.00th=[ 734], 95.00th=[ 816], | 99.00th=[ 1004], 99.50th=[ 1020], 99.90th=[ 1057], 99.95th=[ 1057], | 99.99th=[ 1860] bw ( KiB/s): min=62144, max=91552, per=100.00%, avg=90669.02, stdev=3533.77, samples=120 iops : min=15536, max=22888, avg=22667.27, stdev=883.44, samples=120 lat (usec) : 100=0.01%, 250=0.01%, 500=0.01%, 750=93.85%, 1000=5.14% lat (msec) : 2=0.99%, 4=0.01%, 10=0.01%, 50=0.01%, 100=0.01% cpu : usr=5.35%, sys=23.17%, ctx=1359692, majf=0, minf=17 IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=100.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.1%, 32=0.0%, 64=0.0%, >=64=0.0% issued rwts: total=1360097,0,0,0 short=0,0,0,0 dropped=0,0,0,0 latency : target=0, window=0, percentile=100.00%, depth=16 Run status group 0 (all jobs): READ: bw=88.5MiB/s (92.8MB/s), 88.5MiB/s-88.5MiB/s (92.8MB/s-92.8MB/s), io=5313MiB (5571MB), run=60001-60001msec Disk stats (read/write): sda: ios=1357472/0, merge=70/0, ticks=949141/0, in_queue=948776, util=99.88%
io=執行了多少M的IO
bw=平均IO帶寬 iops=IOPS runt=線程運行時間 slat=提交延遲,提交該IO請求到kernel所花的時間(不包括kernel處理的時間) clat=完成延遲, 提交該IO請求到kernel后,處理所花的時間 lat=響應時間 bw=帶寬 cpu=利用率 IO depths=io隊列 IO submit=單個IO提交要提交的IO數 IO complete=Like the above submit number, but for completions instead. IO issued=The number of read/write requests issued, and how many of them were short. IO latencies=IO完延遲的分布
io=總共執行了多少size的IO aggrb=group總帶寬 minb=最小.平均帶寬. maxb=最大平均帶寬. mint=group中線程的最短運行時間. maxt=group中線程的最長運行時間.
ios=所有group總共執行的IO數. merge=總共發生的IO合并數. ticks=Number of ticks we kept the disk busy. io_queue=花費在隊列上的總共時間. util=磁盤利用率
fio 有很多測試任務配置文件,在git工程 examples 文件夾中,我們可以使用命令行參數進行直接配置,也可以直接通過配置文件配置一次測試的內容。
更詳細對fio輸出說明請參考博文:
IO狀態監控:
進行磁盤測試的時候,我們可以使用iostat 等監控工具,查看所有磁盤當前的讀寫狀態(fedora 系統上 sysstat-11.7.3-2.fc29.x86_64 收錄了此工具)。
監控磁盤IO命令:iostat –mx 1
iostat主要用于監控系統設備的IO負載情況,iostat首次運行時顯示自系統啟動開始的各項統計信息,之后運行iostat將顯示自上次運行該命令以后的統計信息。用戶可以通過指定統計的次數和時間來獲得所需的統計信息。
語法
iostat [ -c ] [ -d ] [ -h ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ] [ device [...] | ALL ] [ -p [ device [,...] | ALL ] ] [ interval [ count ] ]
iostat使用范例:
iostat -d -x -k 1 10 Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util sda 1.56 28.31 7.80 31.49 42.51 2.92 21.26 1.46 1.16 0.03 0.79 2.62 10.28 Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util sda 2.00 20.00 381.00 7.00 12320.00 216.00 6160.00 108.00 32.31 1.75 4.50 2.17 84.20
-d: 顯示該設備的狀態的參數;
-x:是一個比較常用的選項,該選項將用于顯示和io相關的擴展數據。
-k: 靜態顯示每秒的統計(單位kilobytes )
1: 第一個數字表示每隔1秒刷新一次數據顯示。
10:第二個數字表示總共的刷新次數
rrqm/s:每秒這個設備相關的讀取請求有多少被Merge了(當系統調用需要讀取數據的時候,VFS將請求發到各個FS,如果FS發現不同的讀取請求讀取的是相同Block的數據,FS會將這個請求合并Merge); wrqm/s:每秒這個設備相關的寫入請求有多少被Merge了。 r/s: 該設備的每秒完成的讀請求數(merge合并之后的) w/s: 該設備的每秒完成的寫請求數(merge合并之后的) rsec/s:每秒讀取的扇區數; wsec/:每秒寫入的扇區數。 rKB/s:每秒發送給該設備的總讀請求數 wKB/s:每秒發送給該設備的總寫請求數 avgrq-sz 平均請求扇區的大小 avgqu-sz 是平均請求隊列的長度。毫無疑問,隊列長度越短越好。 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%,因為磁盤的并發能力,所以磁盤使用未必就到了瓶頸)。
看完了這篇文章,相信你對“Linux系統中FIO常用命令有哪些”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。