Raspberry Pi Benchmarking File IO
using sysbench, sd card and attached external hard disk

Set up sysbench

  • Earlier I used it to benchmark the cpu here.
  • So, I used sysbench to benchmark the file system.
  • sysbench can be installed using apt-get
    sudo apt-get update
    sudo apt-get install sysbench
    

Benchmarking cases

  1. HDD - FAT32 mounted at /mnt/storage/
  2. HDD - NTFS mounted at /mnt/transfers/
  3. SD CARD - EXT4 mounted at /

Benchmarking Preparation

  1. Create directory benchmark in all three locations

    mkdir /mnt/storage/benchmark
    mkdir /mnt/transfers/benchmark
    mkdir ~/benchmark
    
  2. Create required test files

    $ cd /mnt/storage/benchmark
    $ sysbench --test=fileio --file-total-size=5G prepare
    sysbench 0.4.12:  multi-threaded system evaluation benchmark
    
    128 files, 40960Kb each, 5120Mb total
    Creating files for the test...
    
  3. Copy the files to other 2 locations

    cp * /mnt/transfers/benchmark/
    cp * ~/benchmark/
    

Benchmark

  • Change to required directory.
  • Run the benchmark.
  • Do this for all 3 cases.

Output for all cases shown below.

  1. HDD - FAT32

    $ cd /mnt/storage/benchmark
    $ sysbench --test=fileio --file-total-size=5G \
    --file-test-mode=rndrw --init-rng=on \
    --max-time=300 --max-requests=0 run
    
    sysbench 0.4.12:  multi-threaded system evaluation benchmark
    
    Running the test with following options:
    Number of threads: 1
    Initializing random number generator from timer.
    
    Extra file open flags: 0
    128 files, 40Mb each
    5Gb total file size
    Block size 16Kb
    Number of random requests for random IO: 0
    Read/Write ratio for combined random IO test: 1.50
    Periodic FSYNC enabled, calling fsync() each 100 requests.
    Calling fsync() at the end of test, Enabled.
    Using synchronous I/O mode
    Doing random r/w test
    Threads started!
    Time limit exceeded, exiting...
    Done.
    
    Operations performed:  27810 Read, 18540 Write, 59264 Other = 105614 Total
    Read 434.53Mb  Written 289.69Mb  Total transferred 724.22Mb  (2.414Mb/sec)
      154.49 Requests/sec executed
    
    Test execution summary:
        total time:                          300.0140s
        total number of events:              46350
        total time taken by event execution: 226.9894
        per-request statistics:
             min:                                  0.08ms
             avg:                                  4.90ms
             max:                                 28.78ms
             approx.  95 percentile:              11.81ms
    
    Threads fairness:
        events (avg/stddev):           46350.0000/0.00
        execution time (avg/stddev):   226.9894/0.00
    
  2. HDD - NTFS

    $ cd /mnt/transfers/benchmark
    $ sysbench --test=fileio --file-total-size=5G \
             --file-test-mode=rndrw --init-rng=on \
             --max-time=300 --max-requests=0 run
    sysbench 0.4.12:  multi-threaded system evaluation benchmark
    
    Running the test with following options:
    Number of threads: 1
    Initializing random number generator from timer.
    
    Extra file open flags: 0
    128 files, 40Mb each
    5Gb total file size
    Block size 16Kb
    Number of random requests for random IO: 0
    Read/Write ratio for combined random IO test: 1.50
    Periodic FSYNC enabled, calling fsync() each 100 requests.
    Calling fsync() at the end of test, Enabled.
    Using synchronous I/O mode
    Doing random r/w test
    Threads started!
    Time limit exceeded, exiting...
    Done.
    
    Operations performed:  20629 Read, 13752 Write, 43904 Other = 78285 Total
    Read 322.33Mb  Written 214.88Mb  Total transferred 537.2Mb  (1.7906Mb/sec)
      114.60 Requests/sec executed
    
    Test execution summary:
        total time:                          300.0108s
        total number of events:              34381
        total time taken by event execution: 241.7225
        per-request statistics:
             min:                                  0.09ms
             avg:                                  7.03ms
             max:                                 70.43ms
             approx.  95 percentile:              12.80ms
    
    Threads fairness:
        events (avg/stddev):           34381.0000/0.00
        execution time (avg/stddev):   241.7225/0.00
    
  3. SD CARD - EXT4

    $ cd ~/benchmark
    $ sysbench --test=fileio --file-total-size=5G \
    --file-test-mode=rndrw --init-rng=on \
    --max-time=300 --max-requests=0 run
    sysbench 0.4.12:  multi-threaded system evaluation benchmark
    
    Running the test with following options:
    Number of threads: 1
    Initializing random number generator from timer.
    
    Extra file open flags: 0
    128 files, 40Mb each
    5Gb total file size
    Block size 16Kb
    Number of random requests for random IO: 0
    Read/Write ratio for combined random IO test: 1.50
    Periodic FSYNC enabled, calling fsync() each 100 requests.
    Calling fsync() at the end of test, Enabled.
    Using synchronous I/O mode
    Doing random r/w test
    Threads started!
    Time limit exceeded, exiting...
    Done.
    
    Operations performed:  1020 Read, 680 Write, 2122 Other = 3822 Total
    Read 15.938Mb  Written 10.625Mb  Total transferred 26.562Mb  (90.526Kb/sec)
    5.66 Requests/sec executed
    
    Test execution summary:
    total time:                          300.4667s
    total number of events:              1700
    total time taken by event execution: 8.3414
    per-request statistics:
         min:                                  0.10ms
         avg:                                  4.91ms
         max:                                821.14ms
         approx.  95 percentile:               2.32ms
    
    Threads fairness:
    events (avg/stddev):           1700.0000/0.00
    execution time (avg/stddev):   8.3414/0.00
    

Observation and notes

  • HDD - FAT32(2.414Mb/sec) > HDD - NTFS(1.7906Mb/sec) >>>>> SD CARD - EXT4(90.526Kb/sec).
  • So, in speed comparison,
    • HDD - FAT32 = 1.35 x HDD - NTFS
    • HDD - FAT32 = 26.67 x SD CARD - EXT4
    • HDD - NTFS = 19.77 x SD CARD - EXT4
  • In short, HDD is like 20x faster than SD card.
  • As in any benchmark, take this with a pinch of salt.
  • I repeated each case couple of times and didn't see much deviation in the overall speed.

Clean up

  • Remove the benchmark folders.
  • Or may be if you want empty benchmark folders, then run sysbench --test=fileio cleanup in each folder.

Hardware and OS

  • I was using Raspberry Pi 1 Model B for this setup.
  • It is running Raspbian GNU/Linux 8 (jessie)
  • Internal HDD - Seagate Barracuda 7200.12, 1TB - connected via USB enclosure.
  • SD Card - Transcend 16 GB SDHC Class 10

Share

Great!! You read till this point, just go ahead and share this post to your followers, collegues and friends. Thanks!

About Author

Sakthi Priyan H
Passionate Programmer

  • I am passionate about building excellent teams, processes and systems.
  • Primarily I use Java, Scala and Python for building various systems and tools.
  • Building API services, Big data processing and Machine Learning systems in Crayon Data.
  • Also, interested in Golang and building web apps using Javascript ecosystem.
  • I wrote my first program in BASIC in 1998, Passionate about computers since then.