SSD 性能測試

2021-02-13 coredump
如何描述 SSD 的性能

SSD 的性能指標主要包括:IOPS、帶寬和延遲

IOPS (Input/Output Operations per Second)是指每秒能處理的 I/O 個數。一般 OLTP 的資料庫應用需要關注 IOPS 性能。帶寬是指單位時間內可以成功傳輸的數據量(MB/s)。大量順序讀寫的應用,例如離線計算任務,需要關注帶寬。延遲是指 SSD 處理一個 I/O 需要的時間(us)。一般情況下,在線業務對高延遲比較敏感,離線任務對高延遲比較不敏感。dd 命令

dd 是 Linux 下的一個命令,其作用是用指定大小的塊拷貝一個文件,並在拷貝的同時進行指定的轉換。

dd 的幾個主要參數(命令的詳細參數、用法可以參考 Linux man page[1] ):

ibs: 輸入塊大小(input block size)obs: 輸出塊大小(output block size)bs: 輸入和輸出的塊大小(input and output block size)iflag: 輸入 flag(input flag)oflag: 輸出 flag(outout flag)

幾個常用的 flag 參數:

dsync:寫入文件塊後,調用 fdatasyncnonblock: 採用非阻塞的方式讀寫文件。在 Linux 下,只有 O_DIRECT 的文件 I/O 支持非阻塞

/dev/zero 是 Linux 提供的一個特殊文件,可以無限產生 0x00 字符,從這個文件讀取不產生 I/O,可以用來作為輸入文件測試 SSD 的純寫速度。

/dev/null 也會 Linux 提供的一個特殊文件,提供一種「無底洞」的特性,往這個文件寫入任何數據都不會產生 I/O,可以作為輸出文件測試 SSD 的純讀速度。

用於測試 SSD 的命令:

dd if=/dev/zero of=test.data bs=4k oflag=direct,nonblock count=1000000
dd if=/dev/zero of=test.data bs=4k oflag=direct,nonblock,dsync count=1000000
dd if=/dev/zero of=test.data bs=4k oflag=direct,nonblock,sync count=1000000

dd 命令行工具的優點是使用簡單,並且 Linux 作業系統一般都有自帶,不需要額外安裝。缺點也是因為太簡單了:

單進程單線程運行,無法充分發揮 SSD 的並行特性。pg_test_fsync

pg_test_fsync 是 PostgreSQL 提供的一個測試工具,主要作用是讓用戶方便快捷地了解特定系統上最快的 wal_sync_method。pg_test_fsync 的執行結果報告了每個 wal_sync_method 的平均文件同步操作時間。

簡單說,pg_test_fsync 可以用來測試 fsync/fdatasync 的延遲。

pg_test_fsync 可以從 PostgreSQL 的官網[2]下載原始碼進行編譯。比如:

我下載的是 postgresql-13.1.tar.bz2[3]。切換帶原始碼的根目錄下:cd postgresql-13.1切換帶 pg_test_fsync 的代碼目錄下:cd src/bin/pg_test_fsync

運行 pg_test_fsync 時遇到一個小問題:

8 *  2kB open_sync writes    pg_test_fsync: error: write failed: Invalid argument

原因是使用 O_DIRECT 對寫入的數據有對齊要求:

Under Linux 2.4, transfer sizes, and the alignment of the user buffer and the file offset must all be multiples of the logical block size of the filesystem.  Since Linux 2.6.0, alignment to the logical block size of the underlying storage (typically 512 bytes) suffices.  The logical block size can be determined using the ioctl(2) BLKSSZGET** **operation or from the shell using the command:blockdev --getss

在我的測試機器上,這個 block size 是 4096 而 pg_test_fsync 這個工具認為是 512:

cat /sys/block/nvme0n1/queue/physical_block_size4096

最簡單的做法是將不符合這個要求的兩行代碼注釋掉:

static void
test_open_syncs(void)
{
  printf(_("\nCompare open_sync with different write sizes:\n"));
  printf(_("(This is designed to compare the cost of writing 16kB in different write\n"
       "open_sync sizes.)\n"));

  test_open_sync(_(" 1 * 16kB open_sync write"), 16);
  test_open_sync(_(" 2 *  8kB open_sync writes"), 8); 
  test_open_sync(_(" 4 *  4kB open_sync writes"), 4); 
  //test_open_sync(_(" 8 *  2kB open_sync writes"), 2);
  //test_open_sync(_("16 *  1kB open_sync writes"), 1);
}

執行結果示例:

5 seconds per test
O_DIRECT supported on this platform for open_datasync and open_sync.

Compare file sync methods using one 8kB write:
(in wal_sync_method preference order, except fdatasync is Linux's default)
        open_datasync                     63591.342 ops/sec      16 usecs/op
        fdatasync                         52872.641 ops/sec      19 usecs/op
        fsync                             52138.296 ops/sec      19 usecs/op
        fsync_writethrough                              n/a
        open_sync                         65479.469 ops/sec      15 usecs/op

Compare file sync methods using two 8kB writes:
(in wal_sync_method preference order, except fdatasync is Linux's default)
        open_datasync                     32794.672 ops/sec      30 usecs/op
        fdatasync                         38832.670 ops/sec      26 usecs/op
        fsync                             36112.149 ops/sec      28 usecs/op
        fsync_writethrough                              n/a
        open_sync                         33255.280 ops/sec      30 usecs/op

Compare open_sync with different write sizes:
(This is designed to compare the cost of writing 16kB in different write
open_sync sizes.)
         1 * 16kB open_sync write         50401.319 ops/sec      20 usecs/op
         2 *  8kB open_sync writes        32680.378 ops/sec      31 usecs/op
         4 *  4kB open_sync writes        19378.457 ops/sec      52 usecs/op

Test if fsync on non-write file descriptor is honored:
(If the times are similar, fsync() can sync data written on a different
descriptor.)
        write, fsync, close               47270.649 ops/sec      21 usecs/op
        write, close, fsync               45598.608 ops/sec      22 usecs/op

Non-sync'ed 8kB writes:
        write                            380100.992 ops/sec       3 usecs/op

這裡簡單解釋一下執行結果:

open_datasync: open 文件的時候指定 O_DSYNC。fdatasync: write 之後調用 fdatasync。fsync_writethrough: 是 Windows 的,這裡忽略。open_sync: open 文件的時候指定 O_SYNC。8kB 的 sync 延遲不到 20us,16kB 的 sync 延遲大約 30us。O_SYNC 和 O_DSYNC 延遲差別不大;fsync 和 fdatasync 延遲差別不大。O_SYNC/O_DSYNC 的延遲看起來略優於 fsync/fdatasync。直接寫 page cache 不進行 sync 的延遲大概是 3us => 可以看出,sync 非常影響資料庫應用的延遲/性能。fio

fio[4] 是一個多線程 I/O 生成工具,可以生成多種 I/O 模式,可以用來測試 SSD 的性能,特別是 IOPS。

fio 是個功能挺複雜的工具,這裡先簡單介紹幾個常用的命令參數:

--name=fio-test      # 任務名稱--filename=/dev/sda  # 讀寫的文件或者設備--direct=1           # 使用 O_DIRECT 讀寫數據(繞過 page cache)--rw=randread        # 隨機讀--rw=randwrite       # 隨機寫--rw=randrw          # 隨機讀寫混合--rw=read            # 順序讀--rw=write           # 順序寫--rw=rw              # 順序讀寫混合--rwmixwrite=30      # 混合讀寫的模式下,寫佔30%--bs=4k              # 單次 I/O 的數據塊大小為 4k--bsrange=512-2048   # 單機 I/O 的數據塊大小範圍--size=5G            # 測試文件大小為 5GB--numjobs=30         # 30 個線程--time_based         # 基於時間運行,運行 --runtime 時間後結束--runtime=600        # 測試時間為 600 秒,如果不寫則一直將 --size 大小的文件寫完為止--ioengine=libaio    # I/O 引擎,Linux 下一般用 libaio--group_reporting    # 顯示結果匯總每個進程的信息--lockmem=1G         # 只使用 1GB 內存進行測試--iodepth=32         # I/O 隊列深度,可以認為是使用異步 I/O 時同時提交的 I/O 數。

這裡直接用幾個實際例子來說明。

fio \
--name=fio-test \
--filename=test.data \
--size=50G \
--bs=4k \
--rw=randwrite \
--ioengine=libaio \
--direct=1 \
--iodepth=32 \
--time_based \
--runtime=600 \
--group_reporting

fio \
--name=fio-test \
--filename=test.data \
--size=50G \
--bs=4k \
--rw=randread \
--ioengine=libaio \
--direct=1 \
--iodepth=32 \
--time_based \
--runtime=600 \
--group_reporting

fio \
--name=fio-test \
--filename=test.data \
--size=50G \
--bs=128k \
--rw=write \
--ioengine=libaio \
--direct=1 \
--iodepth=32 \
--time_based \
--runtime=600 \
--group_reporting

fio \
--name=fio-test \
--filename=test.data \
--size=50G \
--bs=128k \
--rw=read \
--ioengine=libaio \
--direct=1 \
--iodepth=32 \
--time_based \
--runtime=600 \
--group_reporting

fio 的輸出示例:

fio-test: (groupid=0, jobs=1): err= 0: pid=41759: Fri Dec  4 16:05:04 2020
  write: IOPS=245k, BW=956MiB/s (1003MB/s)(560GiB/600001msec); 0 zone resets
    slat (nsec): min=1251, max=1708.0k, avg=2791.81, stdev=1767.94
    clat (usec): min=7, max=2171, avg=126.93, stdev=17.05
     lat (usec): min=10, max=2174, avg=129.78, stdev=17.15
    clat percentiles (usec):
     |  1.00th=[   85],  5.00th=[  102], 10.00th=[  111], 20.00th=[  119],
     | 30.00th=[  123], 40.00th=[  125], 50.00th=[  126], 60.00th=[  128],
     | 70.00th=[  130], 80.00th=[  135], 90.00th=[  145], 95.00th=[  159],
     | 99.00th=[  182], 99.50th=[  192], 99.90th=[  210], 99.95th=[  223],
     | 99.99th=[  253]
   bw (  KiB/s): min=644168, max=999168, per=100.00%, avg=979886.11, stdev=23593.11, samples=1199
   iops        : min=161042, max=249792, avg=244971.55, stdev=5898.29, samples=1199
  lat (usec)   : 10=0.01%, 20=0.01%, 50=0.05%, 100=4.22%, 250=95.71%
  lat (usec)   : 500=0.01%, 750=0.01%, 1000=0.01%
  lat (msec)   : 2=0.01%, 4=0.01%
  cpu          : usr=28.70%, sys=71.31%, ctx=47128, majf=0, minf=31
  IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=100.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.1%, 64=0.0%, >=64=0.0%
     issued rwts: total=0,146906790,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=32

Run status group 0 (all jobs):
  WRITE: bw=956MiB/s (1003MB/s), 956MiB/s-956MiB/s (1003MB/s-1003MB/s), io=560GiB (602GB), run=600001-600001msec

Disk stats (read/write):
  nvme2n1: ios=2/146881125, merge=0/0, ticks=0/2404296, in_queue=2433748, util=100.00%

上面是我在某臺測試機器上用 fio 測試隨機寫 IOPS(4K 塊、隊列深度 32) 的輸出結果。這裡簡單解釋一下:

第二行總結了本次測試的結果:寫操作 IOPS 245k,帶寬(BW)1003 MB/s。接下來的 slat、clat、lat 是延遲信息:slat: 提交延遲(submission latency)。提交延遲只對異步 I/O 有意義。clat: 完成延遲(completion latency)。I/O 提交成功到 I/O 完成的時間。lat: 總延遲(total latency)。I/O 請求從創建到完成的時間。min 是本次測試的最小值;max 是本次測試的最大值;stdev 是標準差。總結

本文介紹了 3 個可以用來測試 SSD 的工具:dd、pg_test_fsync、fio:

dd 命令功能比較簡單,已經不適合用來測試 SSD 了。pg_test_fsync 可以很方便快捷地測試 SSD 的 sync 性能。fio 是個強大的工具,各種工作負載都能模擬,輸出信息比較豐富:IOPS、帶寬、延遲應有盡有。本文舉的幾個例子只是裡面的九牛一毛(不過也達到了我本次的測試目的)。

一般網上或產品提供商提供的性能數據只能作為一個參考,因為不同的工作負載、不同的型號的 SSD 都會影響實際的使用性能,真實數據還是要自己實際測試才靠譜。

參考資料[1]

Linux man page: https://man7.org/linux/man-pages/man1/dd.1.html

[2]

PostgreSQL 的官網: https://www.postgresql.org/

[3]

postgresql-13.1.tar.bz2: https://ftp.postgresql.org/pub/source/v13.1/postgresql-13.1.tar.bz2

[4]

fio: https://fio.readthedocs.io/en/latest/fio_doc.html

相關焦點

  • PCIe NVMe SSD常用測試工具介紹
    11自動化測試框架    11注入客戶自定義的任意NVMe命令    11控制外圍熱插拔以及電源模塊進行測試    12NVMe嚴重錯誤及觸發條件設置    12讀/寫延遲統計圖    13豐富的各種性能展現視圖    13測試結果Web統計
  • 主流SSD測試軟體介紹
    由於每個測試都需要進行一定大小的數據讀寫,硬碟性能越低,測試需要花費的時間就越久,拿機械硬碟來跑這個測試並不適宜,跑完全程大約需要1個小時左右。尋址時間測試那裡,讀取是測試尋址隨機的4KB文件(全盤LBA區域),寫入是測試尋址隨機的512B文件(指定的1GB地址範圍)。注意,運行AS SSD基準測試至少需要2GB的空閒空間。
  • CUBRID和MySQL使用SSD前後性能測試對比
    使用CUBRID的公司可以得到更好的性能,高可靠性,靈活性,擴展性和高可用性,為其重要客戶提供7*24小時的持續服務」  CUBRID被韓國IT業的領頭企業NHN公司大量的使用,該公司部署了超過一萬臺CUBRID伺服器,看來它的確和MySQL有得一比,本文主要測試兩者的性能,我們同時在HDD硬碟和SSD硬碟上完成了測試,為了保證公平,每個資料庫(CUBRID和MySQL)都安裝在兩臺伺服器上
  • 見證奇蹟 三星Magician讓SSD更加出色
    2014年04月24日 02:25作者:宋陽編輯:宋陽文章出處:泡泡網原創     泡泡網SSD固態硬碟頻道4月24日 目前,SSD的性能已經是有口皆碑了
  • 315揭秘:拼多多千元主機裡SSD是個啥路數?
    SSD         首先,我們選用CrystalDiskMark對持續讀寫速度進行測試。該軟體讀寫速度測試傾向於非壓縮算法,而非壓縮算法SSD具備不掉速的特性。測試時選用的CrystalDiskMark版本為6.1.0 x64,默認隊列深度為1,默認測試次數為5,下面我們來看看測試結果如何。
  • 真是一分錢一分貨 NVme SSD都有哪些優勢?
    【IT168 評論】SSD 固態硬碟近年來被廣泛的應用,在機械硬碟過渡固態硬碟的期間,也擁有更高的追求,而要讓 SSD 發揮到極致的性能,原來的 SATA 模式與 AHCI 模式已經不能夠滿足,但現在最新的存儲接口 M.2 和 SARA-E 接口都是採用的 PCI-E 通道,而 PCI-E 接口發揮最高性能就需要新的 NVMe 標準
  • 目標檢測|SSD原理與實現
    不同算法的性能如圖1所示,可以看到兩類方法在準確度和速度上的差異。圖1 不同檢測算法的性能對比本文講解的是SSD算法,其英文全名是Single Shot MultiBox Detector,名字取得不錯,Single shot指明了SSD算法屬於one-stage方法,MultiBox指明了SSD是多框預測。
  • 如何基準測試 Linux PC 的性能?
    簡而言之,它能同時測試計算機的所有主要子系統。但它不是測試純粹的性能,而是更加專注於穩定性和可靠性。為了獲得最佳結果,我們推薦將它與其他一些形式的性能測試手段結合起來。它提供免費 30 天試用的服務;一旦試用期結束,就要收費(79 美元)。二、處理器基準測試比較兩個不同的處理器很困難。
  • SSD開啟NTFS壓縮性能測試
    這個經常處於遺忘角落中的Windows功能在硬碟容量突飛猛進的前幾年就已經被不少用戶棄之不用,而且對CPU性能比較敏感,還由於不能壓縮系統文件使得具體應用仍然受到一些限制,但對於容量仍然偏小的SSD來說看上去仍然是一件利器。
  • 2D和3D TLC快閃記憶體性能大PK
    具體的測試條件如圖所示,對於3D NAND快閃記憶體,擦寫次數是300,數據保存時間為63天;對於2D NAND快閃記憶體,擦寫次數也是300,數據保存時間是57天。由下圖a可以看出,3D NAND快閃記憶體在頂字線(Top Word-line)和底字線(Bottom Word-line)位置的誤碼率要明顯比其他位置字線的誤碼率高。
  • 桌上型電腦如何安裝SSD詳細圖文教程
    固態硬碟的安裝教程分為普通桌上型電腦的固態硬碟安裝和筆記本電腦的固態硬碟安裝,下面分別介紹普通2.5寸ssd和mSATA接口的ssd安裝:桌上型電腦固態硬碟安裝教程:第一步:>臺式機固態硬碟的安裝方法和機械硬碟一樣,也是分為供電口和數據口,如果是筆記本拓展可以放在光碟機位上如果是機械硬碟替換可以直接接口對應替換,臺式機相比較就更簡單了,直接把原有的接口替換就好了,這裡記住一般固態硬碟都支持SATA3以上接口,這樣才能提高硬碟的實際性能。
  • 全面進化 閃迪Ultra II 240GB SSD評測
    在SLC跨越到MLC顆粒的時代,消費者們怨聲四起,覺得性能和耐用性都大打折扣,或者成本低了價格不低等抱怨也不在少數。幾年過去,MLC的表現讓我們看見壽命不是問題,性能提升了。現在又要面臨的是MLC到TLC的轉變,還是那一套怨言,還是省省吧。
  • 持續讀寫不算啥 4K隨機讀寫才是SSD專長
    固態硬碟的確能夠極致的提升電腦開機速度,但這並不是因為固態硬碟的持續讀寫速度優於機械硬碟而實現的,這其中的關鍵在於4K隨機讀寫性能。    在性能上,SSD並不是完勝機械硬碟,要是認為它在各個方面都是100%強大的話,在某些時候可是會鬧笑話的。其實超大容量機械硬碟寫入速度能達到160MB/s,突發速度甚至可以上到477MB/s,幾乎與一些低端SSD相當。那麼為什麼更換SSD之後感覺電腦變快了呢?在於小文件隨機性能上SSD有明顯的變化。
  • SSD模擬器 DISKSIM(三)
    前面介紹了 syssim_driver 接口。作者留給我們的只是使用該接口的一個小例子。怎麼閱讀ssdfans其他文章?點擊文末閱讀原文進入www.ssdfans.com,用搜索框搜索關鍵字即可。也可以直接在公眾號回復關鍵詞搜索。不想錯過後續精彩文章?長按或掃描下面二維碼關注ssdfans就可以了!
  • 什麼是ssd固態硬碟 ssd固態硬碟優缺點【詳解】
    【ssd固態硬碟】ssd固態硬碟是什麼意思 ssd固態硬碟好處介紹 ssd固態硬碟是什麼意思 對於固態硬碟很多朋友都很陌生,固態硬碟也由於機械硬碟高價導致三、SSD固態硬碟優化 1、刷官方最新固件 固件不單直接影響SSD的性能、穩定性,也會影響到SSD的壽命。優秀的固件包含先進的算法能減少固態硬碟不必要的寫入,從而減少快閃記憶體晶片的磨損,維持性能的同時也延長了固態硬碟的壽命。因此及時更新官方發布的最新固件顯得十分重要。
  • U2接口成趨勢 影馳旗下首款U2 SSD曝光
    根據目前U.2接口規範,接口帶寬已經達到了32Gbps,支持NVMe協議,同時供電能力也提高了,這都有助於提高SSD性能。究竟性能會達到什麼樣的恐怖速率,或是有其他亮點呢?敬請關注後續報導。 http://ssd.zol.com.cn/595/5951180.html ssd.zol.com.cn
  • SSD空間佔用率對讀寫性能影響多大,附Lexar NS100 對比測試
    這裡有個細節的部分就是,選擇了2G和8G分別進行三次測試,各自選擇三次數據中順序讀取數據最低的一組,因為這樣更有參考意義。為什麼選擇2G和8G,原因就是某些SSD隨著選擇1G,2G,8G等不同參數時,會隨著參數的增大而導致讀寫數據的大幅降低。多一組測試結果,就會多一份參考。來看看讀取性能的變化,整體而言確實2G參數設置下的讀取性能更高些。
  • 淺析U.2接口NVMe SSD雙埠模式(下)——可靠性及性能測試
    作者介紹汪洋寫得了腳本、做得了測試、講得了技術,出得了稿子,可以說非常全能的工程師選手了。本來我以為她低調不多言語,然而為了讓我更好的理解,這位工程師帶我到機房介紹了伺服器的組成,還介紹了雙埠是怎麼連的。能把複雜的功能通俗易懂的講清楚,都是高手。
  • SSD測試軟體-使用指南
    由於每個測試都需要進行一定大小的數據讀寫,硬碟性能越低,測試需要花費的時間就越久,拿機械硬碟來跑這個測試並不適宜,跑完全程大約需要1個小時左右。尋址時間測試那裡,讀取是測試尋址隨機的4KB文件(全盤LBA區域),寫入是測試尋址隨機的512B文件(指定的1GB地址範圍)。注意,運行AS SSD基準測試至少需要2GB的空閒空間。
  • SSD測試不得不知的秘密
    AMD與Intel平臺除了CPU性能不一樣外,它們提供的存儲控制器也是不一樣的。總得來說,SSD測試上Intel平臺所測試的成績要好過於AMD,這得益於Intel晶片組一直在對SSD做出的優化。開啟AHCI模式對SSD重要性不言而喻,因為AHCI中的原生命令隊列特性(NCQ)可以優化用戶發送指令的順序,從而降低設備負荷,提升設備性能。