rwcheck:為嵌入式設備設計的讀寫壓測工具

  • 2019 年 10 月 3 日
  • 筆記

我設計的一款讀寫壓測工具,開源在我的github倉庫


rwcheck是一個對嵌入式設備進行讀寫壓測的工具

什麼是rwcheck

正如其名,rwcheck工具用於讀寫壓測。它是什麼工作原理呢?為什麼要用rwcheck呢?

rwcheck的初衷是為嵌入式Linux設備提供讀寫冒煙測試的工具,在大壓力的IO測試中,確保存儲穩定。rwcheck也被用於讀寫掉電測試,在讀寫時掉電,並在上電後對掉電前寫入的文件進行檢查。

他有以下特點:

  • 多種測試模式,覆蓋各種尺寸的測試文件
  • 讀寫隨機數據,覆蓋到各種數據組合
  • CRC校驗數據,錯誤即刻退出並保留問題現場
  • 支援讀寫掉電,重啟後校驗歷史數據
  • 動態獲取系統資訊,按存儲空間使用比例限制測試總大小
  • 支援多執行緒寫,模擬真實使用場景

怎麼用rwcheck

下載與編譯

git clone https://github.com/gmpy/rwcheck.git rwcheck && make -C rwcheck

使用說明

rwcheck -h可以獲取到使用說明

  Usage: rwcheck [-h] [-d dir] [-t times] [-b size] [-e size]             [-s size] [-u size] [-p percent] [-i input] [-j jobs]        -h : show this massage and exit      -d # : the diretory to check [default currect path]      -t # : check times      -b # : [up mode] set begin size      -e # : [up mode] set end size      -s # : [same mode] set file size      -u # : set read/write buf size      -p # : set maximum ratio of total flash size to check. Eg. -p 95      -i # : input path of file [default <check_dir>/rwcheck.org]             if file don't existed, create 64K from /dev/urandom      -j # : multiple jobs      size trailing with k|m|g or not      rwcheck work in 3 mode:    1. -s # : files have the same size, keep testing until no enough space    2. -b # :    2. -e # : file size increase by The multiplier of 2, loop              from beginning to ending size until no enough space    3. none : file size is 50% of the free space, keep testing until              the less space is less than 64K

例如:

rwcheck -d /mnt/UDISK -b 128k -p 90 -j 2 -t 10000000

上面命令的含義:

  • /mnt/UDISK 目錄下進行讀寫
  • UP模式,測試從 128K 文件大小開始,使用默認最大文件大小(16G)
  • 測試總大小為總容量的 90%
  • 2個執行緒 同時寫
  • 循環測試 10000000次

1次循環

-t <次數>可以指定循環測試次數,那麼,怎樣才是1次循環呢?

每一次循環,包含3個步驟:

  1. 寫:按不同模式要求創建多個文件,循環創建直至空間使用率達到設定的百分比
  2. 校驗:讀取每一個文件,校驗文件CRC值 (允許最後一個文件CRC校驗值錯誤)
  3. 刪除:刪除測試文件
Q:為什麼允許最後一個文件CRC校驗值錯誤?  A:因為在隨機掉電情況下,最後一個文件寫入不完整,會導致校驗值不準確,但實際上,這並不是錯誤    Q:為什麼有時候沒寫任何文件直接跳入到校驗環節?  A:當檢查到已有文件存在的時候,寫環節會跳過,進入到校驗環節,以此實現檢查上一次執行時創建的文件

隨機數據

rwcheck寫入的數據是從/dev/urandom獲取的隨機數據,確保了測試覆蓋到儘可能多的數據組合。但這樣也存在個問題,當出現數據校驗出錯時,並沒有原始數據對比分析,怎麼辦呢?

rwcheck是這麼做的:

  1. 在每一次循環開始之前,從/dev/urandom讀取一定大小的隨機數據到 rwcheck.org
  2. rwcheck.org 作為數據源,從 rwcheck.org 循環讀,獲取足夠數據寫入到測試文件
  3. 一次測試循環後,刪除舊的 rwcheck.org 文件,以便下一次循環創建新的隨機數據源

由於一旦出錯rwcheck會即刻退出以保留現場,因此可以通過對比 rwcheck.org 與出錯文件,分析錯誤情況

測試日誌

root# rwcheck -d /mnt/UDISK -t 2 -b 128k -p 85 -j2            rwcheck: do read and write check            version: v0.1.0          build: Compiled in Aug 20 2019 at 02:32:41          date: Mon Aug 19 18:01:21 2019            free/total ddr: 33/53 MB          free/total flash: 62/63 MB          flash filesystem ubifs          set mode to Up Mode          set file begin size to 128 KB          set file end size to 1 GB          set times to 2          set max percent of total space to 85%          set buf size to 512 KB          set check diretory as /mnt/UDISK          set orgin file as /mnt/UDISK/rwcheck.org          set jobs as 2            --- CREATE ---          create  : /mnt/UDISK/rwcheck.tmp.0_1 ... OK (64K)          create  : /mnt/UDISK/rwcheck.tmp.0_0 ... OK (64K)          create  : /mnt/UDISK/rwcheck.tmp.1_1 ... OK (128K)          create  : /mnt/UDISK/rwcheck.tmp.1_0 ... OK (128K)                          ......          create  : /mnt/UDISK/rwcheck.tmp.7_0 ... OK (64K)          create  : /mnt/UDISK/rwcheck.tmp.7_1 ... OK (64K)          --- CHECK ---          check   : /mnt/UDISK/rwcheck.tmp.0_0 ... OK          check   : /mnt/UDISK/rwcheck.tmp.0_1 ... OK                          ......          check   : /mnt/UDISK/rwcheck.tmp.7_0 ... OK          check   : /mnt/UDISK/rwcheck.tmp.7_1 ... OK          --- REMOVE ---          remove  : /mnt/UDISK/rwcheck.tmp.0_0 ... OK          remove  : /mnt/UDISK/rwcheck.tmp.0_1 ... OK                          ......          remove  : /mnt/UDISK/rwcheck.tmp.7_0 ... OK          remove  : /mnt/UDISK/rwcheck.tmp.7_1 ... OK

一旦出現錯誤,會列印類似的錯誤資訊

        --- CREATE ---          --- CHECK ---          check   : /mnt/UDISK/rwcheck.tmp.0_0 ... OK          check   : /mnt/UDISK/rwcheck.tmp.0_1 ... OK          check   : /mnt/UDISK/rwcheck.tmp.1_0 ... OK          check   : /mnt/UDISK/rwcheck.tmp.1_1 ... OK          check   : /mnt/UDISK/rwcheck.tmp.2_0 ... FAILED (crc error)            --- ERROR INFO ---          file: rwcheck.c (573)          errno: I/O error (5)          info: /mnt/UDISK/rwcheck.tmp.2_0 crc error

測試模式

rwcheck支援3種測試模式,分別是AUTO模式UP模式SAME模式

不同測試模式下,測試文件大小會不一樣,測試文件大小策略可見函數 get_test_size()

模式 選項 特點
AUTO (default) 每次測試取當前剩餘空間的一半做測試文件大小
UP -b/-e 從設定的begin開始到設定的end結束,文件大小以2的倍數遞增
SAME -s 固定每個測試文件的大小

AUTO模式

默認為 auto模式,在此模式下,每次測試的文件大小為剩餘分區空間的 50%(最大不允許超過4G),直至測試文件大小 小於64K剩餘空間達到了設置的百分比

因此,** auto模式 ** 也可以說是二分遞減模式

例如,當前剩餘空間為64M,測試百分比設置為95%,則創建的文件大小依次為:

32M -> 16M -> 8M -> 4M -> 1M

在最後一次測試中,由於剩餘空間不足,因此跳過2M,直接測試1M大小文件

UP模式

auto模式 相反,up模式 是以2的倍數遞增,通過選項-b <開始大小>-e <結束大小>設置遞增的範圍,直至 剩餘空間達到了設置的百分比

如果達到了設置的結束大小,但還有充足剩餘空間,則從設置的開始大小重新循環。

例如,當前剩餘空間為64M,測試百分比設置為95%,開始大小設置為128K,則創建的文件大小為:

128K -> 256K -> 512K -> 1M -> 2M -> 4M -> 8M -> 16M -> 128K -> 256K -> ...

SAME模式

same模式 是固定測試文件大小,通過選項-s <文件大小>設置測試文件大小,循環創建文件直至 剩餘空間達到了設置的百分比沒有充足空間繼續創建

例如,當前剩餘空間為64M,測試百分比設置為95%,設置固定大小為5M,則創建的文件大小為:

5M -> 5M -> 5M -> 5M -> 5M -> 5M -> 5M -> 5M -> 5M -> 5M -> 5M -> 5M