rwcheck:為嵌入式裝置設計的讀寫壓測工具
我設計的一款讀寫壓測工具,開源在我的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個步驟:
- 寫:按不同模式要求建立多個檔案,迴圈建立直至空間使用率達到設定的百分比
- 校驗:讀取每一個檔案,校驗檔案CRC值 (允許最後一個檔案CRC校驗值錯誤)
- 刪除:刪除測試檔案
Q:為什麼允許最後一個檔案CRC校驗值錯誤? A:因為在隨機掉電情況下,最後一個檔案寫入不完整,會導致校驗值不準確,但實際上,這並不是錯誤 Q:為什麼有時候沒寫任何檔案直接跳入到校驗環節? A:當檢查到已有檔案存在的時候,寫環節會跳過,進入到校驗環節,以此實現檢查上一次執行時建立的檔案
隨機資料
rwcheck寫入的資料是從/dev/urandom
獲取的隨機資料,確保了測試覆蓋到儘可能多的資料組合。但這樣也存在個問題,當出現數據校驗出錯時,並沒有原始資料對比分析,怎麼辦呢?
rwcheck是這麼做的:
- 在每一次迴圈開始之前,從
/dev/urandom
讀取一定大小的隨機資料到 rwcheck.org - rwcheck.org 作為資料來源,從 rwcheck.org 迴圈讀,獲取足夠資料寫入到測試檔案
- 一次測試迴圈後,刪除舊的 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