SDカードの読み込み/書き込み性能を fio の測定結果から比較する
概要
SDカードには規格が定義されており、それぞれの製品には準拠した規格が記載されていることが多い。
本記事では、4種類のSDカードと2種類のSDカードリーダを用いて、それぞれ読み込み/書き込み性能を測定した。
その結果、下記のような傾向が見られた。
- ファイルシステムを介することによる書き込み性能が大きく低下する
- SDカードによって性能が最も発揮できるブロックサイズが異なる
- Raspberry Pi 4の場合だと、並列処理によりパフォーマンスは低下する
- UHS-II 非対応のカードリーダの場合、UHS-II対応のSDカードの性能を発揮できない
はじめに
SDカードには規格が定義されており、それぞれの製品には準拠した規格が記載されていることが多い。
ユースケースに応じて、適切なSDカードを使用することでその製品を最大限に生かすことができる。
しかし、これら規格は数が多く複雑なものが多い。
そこで複数のSDカードを計測することで、実測値と規格の関係性を調査する。
調査には、未使用のSDカードを4種類を使用し、Raspberriy Pi 4上で計測する。 このとき、UHS-II の影響も調査するために2種類のカードリーダ(UHS-II 未対応、UHS-II 対応) を用意し、 UHS-II対応カードリーダとの組み合わせも考慮する。
目的
- ファイルシステムを介することによるオーバーヘッドを計測する
- SDカードの違いによってパフォーマンスが異なることを確認する
- ブロックサイズの違いによってパフォーマンスが異なることを確認する
- 並列処理させることでパフォーマンスが異なることを確認する
- UHS-II 非対応のカードリーダがボトルネックになることを確認する
実行環境
Raspberry Pi 4 Model B (Raspberry Pi 4) は microSDカード経由でRaspberry Pi OSを起動させる。 また、Raspbery Pi 4のUSB3.0ポートにSDカードリーダを接続し、そこから計測対象SDカードを挿入する。
ここで使用するRaspberry Pi 4のスペックについて、必要な情報だけ抜粋したものを下記に示す。
項目 | Raspberry Pi 4 |
---|---|
CPU | Cortex-A72 (ARM v8) 1.5GHz |
メモリ | 4GB LPDDR4-3200 |
OS | Raspberry Pi OS (May 7th 2021) |
OS格納先ストレージ | microSDHC 16GB Class10 UHS-1 |
ケース | 陽極酸化アルミニウム製ヒートシンクケース |
今回は、SDカードリーダによる性能の差を図るために下記の二つを用意した。
- BSCR27U3BK: UHS-IIに対応していないSDカードリーダ
- MRW-S1: UHS-IIに対応したSDカードリーダ
上記の環境に対して、下記4種類のSDカードを計測する。(カタログに記載されていないものは、空欄としている)
ELITE SDXC UHS-I | SanDisk Extreme Pro(並行輸入品) | SF-E64 | SF-M64T | |
---|---|---|---|---|
SDスピードクラス | CLASS10 | CLASS10 | CLASS10 | |
UHSスピードクラス | U3 | U3 | U3 | U3 |
ビデオスピードクラス | V30 | V30 | V30 | V60 |
インタフェース | UHS-I | UHS-I | UHS-II | UHS-II |
容量 | 64GB | 64GB | 64GB | 64GB |
最大読み出し速度 | 90 MB/s | 170 MB/s | 270 MB/s | 277 MB/s |
最大書き込み速度 | 45MB/s | 90 MB/s | 70 MB/s | 150 MB/s |
計測方法
計測には、Flexible I/O tester-3.12 (fio) を用いて、読み込みと書き込みの性能を計測する。
fioでは、パラメータを指定することで様々な計測を実施することができる。
本実験では、bs
、numjobs
とfilename
の値を変更するような計測を実施する。
bs
: ユーザプログラムから読み込み・書き込みをするの一回当たりのサイズ。4KB・1MB・256MBに変更して確認する。numjobs
: 計測プログラムを並列して複数個のプロセス/スレッドで実行する。1・4・8に変更して確認する。filename
: 計測プログラムの読み込み・書き込み先のファイルを指定する。「ファイルシステム以下のファイル」と「デバイスファイル」の二つを確認する。
そこで、下記のようなパラメータファイルを用意し、これらの値を書き換えながら計測することにした。
[global] size=1G directory=/mnt runtime=300 invalidate=1 group_reporting=1 numjobs=1 # FIXME [write] name=write description="WRITE TEST" unlink=0 rw=randwrite # randread ioengine=sync exec_prerun="./prerun.sh" #exec_postrun="./postrun.sh" #filename=/dev/sda1 time_based bs=4K # FIXME
// 1: #!/bin/sh echo 3 > /proc/sys/vm/drop_caches
また、SDカードの状態による測定値のブレを最小限に抑えるために、測定前にSDカードをSD Card Formatter 5.0.1の上書きフォーマットを実施しておく。
実験結果
ファイルシステムによるオーバーヘッド
SDカードの違い
- 一部例外はあったが、カタログに載っている最大書き込み速度と傾向は同じになっている。
- SF-M64Tは、ブロックサイズが小さい場合に性能が出ていない傾向にあった。
- 一部例外はあったが、カタログに載っている最大読み込み速度と傾向は同じになっている。
- SF-E64はブロックサイズが小さい場合に性能が出ていない傾向にあった。
ブロックサイズの違い
- ブロックサイズが大きくすれば、書き込み性能は向上した (~256MB)
- ブロックサイズが大きくすれば、読み込み性能は向上した (~256MB)
UHS-II 非対応によるオーバーヘッド
- 読み込み性能・書き込み性能の双方、UHS-II非対応のカードリーダでは UHS-Iの転送速度104MB/sより下回っている
並列処理によるオーバーヘッド
- 基本的に並列処理数を増やすことで性能が落ちている。
結論
- ファイルシステムを介することによる書き込み性能が大きく低下する傾向がある
- SDカードの違いによってパフォーマンスは異なる
- また、SDカードによって性能が最も発揮できるブロックサイズが異なる
- Raspberry Pi 4の場合だと、並列処理によりパフォーマンスは低下する
- UHS-II 非対応のカードリーダの場合、UHS-II対応のSDカードの性能を発揮できない
おわりに
本記事では、さまざまな環境で読み込み書き込み性能を測定した。
SDカード・ブロックサイズ・並列処理といった要因がパフォーマンスに大きく影響を与えていた。
変更履歴
- 2021/9/11: 記事公開
- 2023/3/5: 記事タイトル「様々なSDカードの読み込み/書き込み性能の実測値を計測する」から変更
参考
補足
実験で得られたデータを本章に残す。
SD card | Card Reader | Block size | jobs | io | File | performance |
---|---|---|---|---|---|---|
ELITE SDXC UHS-I | MRW-S1 | 4KB | 1 | randwrite | Default | 1409KB/s |
ELITE SDXC UHS-I | MRW-S1 | 4KB | 4 | randwrite | Default | 483KB/s |
ELITE SDXC UHS-I | MRW-S1 | 4KB | 8 | randwrite | Default | 567B/s |
ELITE SDXC UHS-I | MRW-S1 | 1MB | 1 | randwrite | Default | 23.1MB/s |
ELITE SDXC UHS-I | MRW-S1 | 1MB | 4 | randwrite | Default | 9877KB/s |
ELITE SDXC UHS-I | MRW-S1 | 1MB | 8 | randwrite | Default | 148KB/s |
ELITE SDXC UHS-I | MRW-S1 | 256MB | 1 | randwrite | Default | 32.0MB/s |
ELITE SDXC UHS-I | MRW-S1 | 256MB | 4 | randwrite | Default | 19.4MB/s |
ELITE SDXC UHS-I | MRW-S1 | 256MB | 8 | randwrite | Default | 12.8MB/s |
ELITE SDXC UHS-I | BSCR27U3BK | 256MB | 1 | randwrite | Default | 31.2MB/s |
ELITE SDXC UHS-I | BSCR27U3BK | 256MB | 4 | randwrite | Default | 20.2MB/s |
ELITE SDXC UHS-I | BSCR27U3BK | 256MB | 8 | randwrite | Default | 13.4MB/s |
ELITE SDXC UHS-I | MRW-S1 | 4KB | 1 | randwrite | /dev/sda1 |
1556KB/s |
ELITE SDXC UHS-I | MRW-S1 | 4KB | 4 | randwrite | /dev/sda1 |
1523KB/s |
ELITE SDXC UHS-I | MRW-S1 | 4KB | 8 | randwrite | /dev/sda1 |
1573MB/s |
ELITE SDXC UHS-I | MRW-S1 | 1MB | 1 | randwrite | /dev/sda1 |
29.1MB/s |
ELITE SDXC UHS-I | MRW-S1 | 1MB | 4 | randwrite | /dev/sda1 |
26.9MB/s |
ELITE SDXC UHS-I | MRW-S1 | 1MB | 8 | randwrite | /dev/sda1 |
25.7MB/s |
ELITE SDXC UHS-I | MRW-S1 | 256MB | 1 | randwrite | /dev/sda1 |
32.0MB/s |
ELITE SDXC UHS-I | MRW-S1 | 256MB | 4 | randwrite | /dev/sda1 |
27.0MB/s |
ELITE SDXC UHS-I | MRW-S1 | 256MB | 8 | randwrite | /dev/sda1 |
24.9MB/s |
ELITE SDXC UHS-I | MRW-S1 | 4KB | 1 | randread | Default | 4685KB/s |
ELITE SDXC UHS-I | MRW-S1 | 4KB | 4 | randread | Default | 4906KB/s |
ELITE SDXC UHS-I | MRW-S1 | 4KB | 8 | randread | Default | 4862KB/s |
ELITE SDXC UHS-I | MRW-S1 | 1MB | 1 | randread | Default | 71.4MB/s |
ELITE SDXC UHS-I | MRW-S1 | 1MB | 4 | randread | Default | 59.3MB/s |
ELITE SDXC UHS-I | MRW-S1 | 1MB | 8 | randread | Default | 61.0MB/s |
ELITE SDXC UHS-I | MRW-S1 | 256MB | 1 | randread | Default | 79.7MB/s |
ELITE SDXC UHS-I | MRW-S1 | 256MB | 4 | randread | Default | 66.6MB/s |
ELITE SDXC UHS-I | MRW-S1 | 256MB | 8 | randread | Default | 65.5MB/s |
ELITE SDXC UHS-I | BSCR27U3BK | 256MB | 1 | randread | Default | 60.2MB/s |
ELITE SDXC UHS-I | BSCR27U3BK | 256MB | 4 | randread | Default | 58.0MB/s |
ELITE SDXC UHS-I | BSCR27U3BK | 256MB | 8 | randread | Default | 58.2MB/s |
ELITE SDXC UHS-I | MRW-S1 | 4KB | 1 | randread | /dev/sda1 |
4644KB/s |
ELITE SDXC UHS-I | MRW-S1 | 4KB | 4 | randread | /dev/sda1 |
4668KB/s |
ELITE SDXC UHS-I | MRW-S1 | 4KB | 8 | randread | /dev/sda1 |
4850MB/s |
ELITE SDXC UHS-I | MRW-S1 | 1MB | 1 | randread | /dev/sda1 |
68.8MB/s |
ELITE SDXC UHS-I | MRW-S1 | 1MB | 4 | randread | /dev/sda1 |
54.8MB/s |
ELITE SDXC UHS-I | MRW-S1 | 1MB | 8 | randread | /dev/sda1 |
54.1MB/s |
ELITE SDXC UHS-I | MRW-S1 | 256MB | 1 | randread | /dev/sda1 |
83.1MB/s |
ELITE SDXC UHS-I | MRW-S1 | 256MB | 4 | randread | /dev/sda1 |
65.0MB/s |
ELITE SDXC UHS-I | MRW-S1 | 256MB | 8 | randread | /dev/sda1 |
62.8MB/s |
SanDisk Extreme Pro | MRW-S1 | 4KB | 1 | randwrite | Default | 1950KB/s |
SanDisk Extreme Pro | MRW-S1 | 4KB | 4 | randwrite | Default | 462KB/s |
SanDisk Extreme Pro | MRW-S1 | 4KB | 8 | randwrite | Default | 369B/s |
SanDisk Extreme Pro | MRW-S1 | 1MB | 1 | randwrite | Default | 49.7MB/s |
SanDisk Extreme Pro | MRW-S1 | 1MB | 4 | randwrite | Default | 7411KB/s |
SanDisk Extreme Pro | MRW-S1 | 1MB | 8 | randwrite | Default | 85.4KB/s |
SanDisk Extreme Pro | MRW-S1 | 256MB | 1 | randwrite | Default | 72.9MB/s |
SanDisk Extreme Pro | MRW-S1 | 256MB | 4 | randwrite | Default | 17.5KB/s |
SanDisk Extreme Pro | MRW-S1 | 256MB | 8 | randwrite | Default | 9782KB/s |
SanDisk Extreme Pro | MRW-S1 | 4KB | 1 | randwrite | /dev/sda1 |
1907KB/s |
SanDisk Extreme Pro | MRW-S1 | 4KB | 4 | randwrite | /dev/sda1 |
1466KB/s |
SanDisk Extreme Pro | MRW-S1 | 4KB | 8 | randwrite | /dev/sda1 |
2005KB/s |
SanDisk Extreme Pro | MRW-S1 | 1MB | 1 | randwrite | /dev/sda1 |
85.1MB/s |
SanDisk Extreme Pro | MRW-S1 | 1MB | 4 | randwrite | /dev/sda1 |
66.0MB/s |
SanDisk Extreme Pro | MRW-S1 | 1MB | 8 | randwrite | /dev/sda1 |
62.1MB/s |
SanDisk Extreme Pro | MRW-S1 | 256MB | 1 | randwrite | /dev/sda1 |
73.6MB/s |
SanDisk Extreme Pro | MRW-S1 | 256MB | 4 | randwrite | /dev/sda1 |
35.6MB/s |
SanDisk Extreme Pro | MRW-S1 | 256MB | 8 | randwrite | /dev/sda1 |
31.6MB/s |
SanDisk Extreme Pro | MRW-S1 | 4KB | 1 | randread | Default | 5513KB/s |
SanDisk Extreme Pro | MRW-S1 | 4KB | 4 | randread | Default | 5753KB/s |
SanDisk Extreme Pro | MRW-S1 | 4KB | 8 | randread | Default | 5720KB/s |
SanDisk Extreme Pro | MRW-S1 | 1MB | 1 | randread | Default | 72MB/s |
SanDisk Extreme Pro | MRW-S1 | 1MB | 4 | randread | Default | 48.1MB/s |
SanDisk Extreme Pro | MRW-S1 | 1MB | 4 | randread | Default | 54.6MB/s |
SanDisk Extreme Pro | MRW-S1 | 256MB | 1 | randread | Default | 83.0MB/s |
SanDisk Extreme Pro | MRW-S1 | 256MB | 4 | randread | Default | 66.1MB/s |
SanDisk Extreme Pro | MRW-S1 | 256MB | 8 | randread | Default | 57.3MB/s |
SanDisk Extreme Pro | MRW-S1 | 4KB | 1 | randread | /dev/sda1 |
5431KB/s |
SanDisk Extreme Pro | MRW-S1 | 4KB | 4 | randread | /dev/sda1 |
5724KB/s |
SanDisk Extreme Pro | MRW-S1 | 4KB | 8 | randread | /dev/sda1 |
5722KB/s |
SanDisk Extreme Pro | MRW-S1 | 1MB | 1 | randread | /dev/sda1 |
64.3MB/s |
SanDisk Extreme Pro | MRW-S1 | 1MB | 4 | randread | /dev/sda1 |
55.0MB/s |
SanDisk Extreme Pro | MRW-S1 | 1MB | 8 | randread | /dev/sda1 |
55.9MB/s |
SanDisk Extreme Pro | MRW-S1 | 256MB | 1 | randread | /dev/sda1 |
80.0MB/s |
SanDisk Extreme Pro | MRW-S1 | 256MB | 4 | randread | /dev/sda1 |
63.2MB/s |
SanDisk Extreme Pro | MRW-S1 | 256MB | 8 | randread | /dev/sda1 |
64.7MB/s |
SF-E64 | MRW-S1 | 4KB | 1 | randwrite | Default | 1456KB/s |
SF-E64 | MRW-S1 | 4KB | 4 | randwrite | Default | 1976KB/s |
SF-E64 | MRW-S1 | 4KB | 8 | randwrite | Default | 5947B/s |
SF-E64 | MRW-S1 | 1MB | 1 | randwrite | Default | 41.3MB/s |
SF-E64 | MRW-S1 | 1MB | 4 | randwrite | Default | 14.2MB/s |
SF-E64 | MRW-S1 | 1MB | 8 | randwrite | Default | 647KB/s |
SF-E64 | MRW-S1 | 256MB | 1 | randwrite | Default | 60.3MB/s |
SF-E64 | MRW-S1 | 256MB | 4 | randwrite | Default | 25.3MB/s |
SF-E64 | MRW-S1 | 256MB | 8 | randwrite | Default | 15.8MB/s |
SF-E64 | MRW-S1 | 4KB | 1 | randread | Default | 14.5MB/s |
SF-E64 | MRW-S1 | 4KB | 4 | randread | Default | 8856KB/s |
SF-E64 | MRW-S1 | 4KB | 8 | randread | Default | 8758KB/s |
SF-E64 | MRW-S1 | 1MB | 1 | randread | Default | 29.1MB/s |
SF-E64 | MRW-S1 | 1MB | 4 | randread | Default | 24.9MB/s |
SF-E64 | MRW-S1 | 1MB | 8 | randread | Default | 23.9MB/s |
SF-E64 | MRW-S1 | 256MB | 1 | randread | Default | 164MB/s |
SF-E64 | MRW-S1 | 256MB | 4 | randread | Default | 132MB/s |
SF-E64 | MRW-S1 | 256MB | 8 | randread | Default | 130MB/s |
SF-M64T | MRW-S1 | 4KB | 1 | randwrite | Default | 920KB/s |
SF-M64T | MRW-S1 | 4KB | 4 | randwrite | Default | 67B/s |
SF-M64T | MRW-S1 | 4KB | 8 | randwrite | Default | 44B/s |
SF-M64T | MRW-S1 | 1MB | 1 | randwrite | Default | 10.8MB/s |
SF-M64T | MRW-S1 | 1MB | 4 | randwrite | Default | 19.1KB/s |
SF-M64T | MRW-S1 | 1MB | 8 | randwrite | Default | 11.0KB/s |
SF-M64T | MRW-S1 | 256MB | 1 | randwrite | Default | 129MB/s |
SF-M64T | MRW-S1 | 256MB | 4 | randwrite | Default | 3281KB/s |
SF-M64T | MRW-S1 | 256MB | 8 | randwrite | Default | 2738 KB/s |
SF-M64T | BSCR27U3BK | 256MB | 1 | randwrite | Default | 69.6MB/s |
SF-M64T | BSCR27U3BK | 256MB | 4 | randwrite | Default | 2786KB/s |
SF-M64T | BSCR27U3BK | 256MB | 8 | randwrite | Default | 2867KB/s |
SF-M64T | MRW-S1 | 4KB | 1 | randread | Default | 7760KB/s |
SF-M64T | MRW-S1 | 4KB | 4 | randread | Default | 8418KB/s |
SF-M64T | MRW-S1 | 4KB | 4 | randread | Default | 8394KB/s |
SF-M64T | MRW-S1 | 1MB | 1 | randread | Default | 128MB/s |
SF-M64T | MRW-S1 | 1MB | 4 | randread | Default | 131MB/s |
SF-M64T | MRW-S1 | 1MB | 8 | randread | Default | 128MB/s |
SF-M64T | MRW-S1 | 256MB | 1 | randread | Default | 177MB/s |
SF-M64T | MRW-S1 | 256MB | 4 | randread | Default | 140MB/s |
SF-M64T | MRW-S1 | 256MB | 8 | randread | Default | 141MB/s |
SF-M64T | BSCR27U3BK | 256MB | 1 | randread | Default | 74.9MB/s |
SF-M64T | BSCR27U3BK | 256MB | 4 | randread | Default | 69.3MB/s |
SF-M64T | BSCR27U3BK | 256MB | 8 | randread | Default | 72.0MB/s |