linux 磁碟IO測試工具:FIO (同時簡要介紹dd工具測試)

来源:https://www.cnblogs.com/xuyaowen/archive/2019/04/11/fio-usage.html
-Advertisement-
Play Games

FIO是測試IOPS的非常好的工具,用來對硬體進行壓力測試和驗證。磁碟IO是檢查磁碟性能的重要指標,可以按照負載情況分成照順序讀寫,隨機讀寫兩大類。 目前主流的第三方IO測試工具有fio、iometer 和 Orion,這三種工具各有千秋,在linux 下也可以使用dd 進行簡單的磁碟(文件系統)測 ...


FIO是測試IOPS的非常好的工具,用來對硬體進行壓力測試和驗證。磁碟IO是檢查磁碟性能的重要指標,可以按照負載情況分成照順序讀寫,隨機讀寫兩大類。

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

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

Multithreaded IO generation tool , FIO 是一個多線程io生成工具,可以生成多種IO模式,用來測試磁碟設備的性能(也包含文件系統:如針對網路文件系統 NFS 的IO測試);

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.

安裝:

yum install fio
yum info fio

項目地址:

https://github.com/axboe/fio.git

http://git.kernel.dk/cgit/fio/

磁碟處理:

fio 用於測試磁碟性能時,測試之前需要先把要測試的磁碟卸載掉,測試完後需格式化一遍再掛載上去。

# 卸載磁碟
umount /mnt/datadir1
# 格式化磁碟
mkfs.ext4 /dev/sdd
# 掛載磁碟
mount -t ext4 /dev/sdd /mnt/datadir1

# 自動掛載,在裡面添加該盤
vim /etc/fstab

FIO 工具常用方法:

參數說明:
filename=/dev/sdb1 測試文件名稱,通常選擇需要測試的盤的data目錄。
direct=1 測試過程繞過機器自帶的buffer。使測試結果更真實。
rw=randwrite 測試隨機寫的I/O
rw=randrw 測試隨機寫和讀的I/O
bs=16k 單次io的塊文件大小為16k
bsrange=512-2048 同上,提定數據塊的大小範圍
size=5g 本次的測試文件大小為5g,以每次4k的io進行測試。
numjobs=30 本次的測試線程為30.
runtime=1000 測試時間為1000秒,如果不寫則一直將5g文件分4k每次寫完為止。
ioengine=psync io引擎使用pync方式
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=write100%順序寫)
4. Write=100% Ramdon=100% rw=randwrite (100%隨機寫)
5. Read=70% Sequence=100% rw=rw, rwmixread=70, rwmixwrite=3070%順序讀,30%順序寫)
6. Read=70% Ramdon=100% rw=randrw, rwmixread=70, rwmixwrite=30
(70%隨機讀,30%隨機寫)

測試樣例:

[root@docker mnt]# fio -filename=/dev/sda -direct=1 -iodepth 1 -thread -rw=read -ioengine=psync -bs=16k -size=20G -numjobs=30 -runtime=1000 -group_reporting -name=yaoxu-sda

本文章,只是資料查找中的簡要摘錄,詳細使用說明,請參考 man fio

測試結果:(其中加粗的輸入日誌,是我們關註的內容:磁碟的吞吐量bw,這個是順序讀寫考察的重點;磁碟的每秒讀寫次數iops,這個是隨機讀寫考察的重點)

[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=提交延遲
clat=完成延遲
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輸出說明請參考博文:Fio Output Explained 

IO狀態監控:

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

監控磁碟IO命令: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%,因為磁碟的併發能力,所以磁碟使用未必就到了瓶頸)。
View Code

dd 工具使用:

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

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

dd測試純寫速度:

[root@docker sda]# time dd if=/dev/zero of=/mnt/sda/ddout bs=8k count=1000000
1000000+0 records in
1000000+0 records out
8192000000 bytes (8.2 GB, 7.6 GiB) copied, 43.1081 s, 190 MB/s

real    0m43.110s
user    0m0.207s
sys    0m3.914s

dd測試純讀速度:

[root@docker sda]# time dd if=/mnt/sda/ddout of=/dev/null bs=8k count=1000000
1000000+0 records in
1000000+0 records out
8192000000 bytes (8.2 GB, 7.6 GiB) copied, 1.30322 s, 6.3 GB/s

real    0m1.306s
user    0m0.199s
sys    0m1.102s

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

使用conv, iflag, oflag 三個變數可以配置dd 命令的複製模塊式,讀取模式和寫入模式;

conv 關鍵symbol:

fdatasync
           physically write output file data before finishing

    fsync  likewise, but also write metadata

iflag, oflag 關鍵symbol:

dsync  use synchronized I/O for data

 sync  likewise, but also for metadata
direct use direct I/O for data

dd 命令繞過系統cache:

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

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 命令可以用來製作啟動盤,請參見博文 linux (fedora 28) 製作啟動U盤,啟動盤 

參考鏈接:

https://www.cnblogs.com/bugutian/p/6653083.html

https://www.linuxidc.com/Linux/2017-04/143251.htm

https://github.com/axboe/fio

https://blog.csdn.net/jiecxy/article/details/58197387 (有很好的fio 輸出日誌註釋,解釋了每行輸出內容的含義,建議閱讀。)

https://www.cnblogs.com/raykuan/p/6914748.html

https://blog.csdn.net/feng4656/article/details/11054595

https://tobert.github.io/post/2014-04-17-fio-output-explained.html

https://github.com/axboe/fio/blob/master/HOWTO

保持更新,轉載請註明出處。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Simple function of recording screen based on ffmpeg Using WPF環境 Visual Studio 2017,dotNet Framework 4.0 SDK支持Windows XP,Windows Win7、8、10下載地址 項目地址 聲明: ...
  • 1.下載https://www.elastic.co/downloads/logstash到/usr/local/src 2.解壓 3.創建配置文件 輸入 4.新建測試log文件 寫入測試數據:aa 5.打開kibana 新建index partner 查看 至此,簡單完成了日誌系統,生產中,可以通 ...
  • [TOC] 回顧你過去將近3年的學習經歷 1.當初你報考的時候,是真正喜歡電腦這個專業嗎? 是的,感覺電腦讓我著迷 2.你現在後悔選擇了這個專業嗎? 沒有 3.你認為你現在最喜歡的領域是什麼(可以是電腦的也可以是其它領域)? 我感覺喜愛電腦內的資料庫這一領域 總結你現在已經掌握的知識 1.你 ...
  • Do not let dream just be your dream. 背景:Linux伺服器文件上傳下載。 XShell+Xftp安裝包(解壓即用)百度網盤鏈接:https://pan.baidu.com/share/init?surl=M8L4ud2NUYcC9qaG_0XPKg 提取碼: t ...
  • 第一次發生這種狀況,是因為上一次關機時我直接斷電了(並非故意的,我用了deepin一個月出了好幾次關機後死機╮(╯▽╰)╭) 參考: 愛之墨色(完美解決)linux 開機進入initramfs無法開機 Jerry_SCY deepin系統啟動進入busybox界面 狀況:出現“(inittramfs ...
  • url重寫是指通過配置conf文件,以讓網站的url中達到某種狀態時則定向/跳轉到某個規則,比如常見的偽靜態、301重定向、瀏覽器定向等 rewrite 語法 在配置文件的server塊中寫,如: server { rewrite 規則 定向路徑 重寫類型; } 規則:可以是字元串或者正則來表示想匹 ...
  • 趁著這波比較閑的時候來劃一波水,想起自己那都快生會的騰訊雲伺服器 到現在還不能通過版本控制系統上傳文件,於是趁這波功夫在伺服器上安裝個svn來管理代碼。 首先就簡單的介紹一波 svn : 首先svn不同於GIT它是集中式的,即只有一條主線並沒有分支,Subversion(SVN) 是一個開源的版本控 ...
  • Linux 中主要有五種IO模式:阻塞IO, 非阻塞IO, IO 多路復用,信號驅動IO和非同步IO; 如果從同步非同步,阻塞非阻塞角度來看,又可以分為:同步阻塞IO, 同步非阻塞IO,非同步阻塞IO和非同步非阻塞IO; 每種IO模型,都有自己的使用模式,他們對於特定的應用程式都有自己的優點:其簡單分佈如 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...