1. 程式人生 > >rwcheck:為嵌入式裝置設計的讀寫壓測工具

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個步驟:

  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