LeavaTailの日記

LeavaTailの日記

Linuxエンジニアを目指した技術者の備忘録

様々なSDカードの読み込み/書き込み性能の実測値を計測する

変更履歴

  • 2021/9/11: 記事公開

概要

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対応カードリーダとの組み合わせも考慮する。

目的

  1. ファイルシステムを介することによるオーバーヘッドを計測する
  2. SDカードの違いによってパフォーマンスが異なることを確認する
  3. ブロックサイズの違いによってパフォーマンスが異なることを確認する
  4. 並列処理させることでパフォーマンスが異なることを確認する
  5. UHS-II 非対応のカードリーダがボトルネックになることを確認する

実行環境

Raspberry Pi 4 Model B (Raspberry Pi 4) は microSDカード経由でRaspberry Pi OSを起動させることとする。 また、Raspbery Pi 4のUBS3.0ポートにSDカードリーダを接続し、そこから計測対象SDカードを挿入する。

f:id:LeavaTail:20210911165944p:plain
計測環境の概要

ここで使用する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では、パラメータを指定することで様々な計測を実施することができる。
本実験では、bsnumjobsfilename の値を変更するような計測を実施する。

  • 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の上書きフォーマットを実施しておく。

実験結果

ファイルシステムによるオーバーヘッド

f:id:LeavaTail:20210906000731p:plain
ファイルシステムを介することによる書き込み性能の比較

  • ファイルシステムへの書き込みは、デバイスファイルに直接書き込む場合と比較して、オーバーヘッドが出ている。
    • さらに、並列処理されている場合のオーバーヘッドは顕著に出ている。

f:id:LeavaTail:20210906000803p:plain
ファイルシステムを介することによる読み込み性能の比較

SDカードの違い

f:id:LeavaTail:20210911123332p:plain
SDカードの違いによる書き込み性能の比較

  • 一部例外はあったが、カタログに載っている最大書き込み速度と傾向は同じになっている。
    • SF-M64Tは、ブロックサイズが小さい場合に性能が出ていない傾向にあった。

f:id:LeavaTail:20210911123340p:plain
SDカードの違いによる読み込み性能の比較

  • 一部例外はあったが、カタログに載っている最大読み込み速度と傾向は同じになっている。
    • SF-E64はブロックサイズが小さい場合に性能が出ていない傾向にあった。

ブロックサイズの違い

f:id:LeavaTail:20210911124618p:plain
ブロックサイズの違いによる書き込み性能の比較

  • ブロックサイズが大きくすれば、書き込み性能は向上した (~256MB)

f:id:LeavaTail:20210911124642p:plain
ブロックサイズの違いによる読み込み性能の比較

  • ブロックサイズが大きくすれば、読み込み性能は向上した (~256MB)

UHS-II 非対応によるオーバーヘッド

f:id:LeavaTail:20210910233901p:plain
UHS-II非対応カードリーダによる書き込み性能の比較

f:id:LeavaTail:20210910234228p:plain
UHS-II非対応カードリーダによる読み込み性能の比較

  • 読み込み性能・書き込み性能の双方、UHS-II非対応のカードリーダでは UHS-Iの転送速度104MB/sより下回っている

並列処理によるオーバーヘッド

f:id:LeavaTail:20210911002459p:plain
並列処理による書き込み性能の比較

f:id:LeavaTail:20210911002522p:plain
並列処理による読み込み性能の比較

  • 基本的に並列処理数を増やすことで性能が落ちている。

結論

  • ファイルシステムを介することによる書き込み性能が大きく低下する傾向がある
  • SDカードの違いによってパフォーマンスは異なる
    • また、SDカードによって性能が最も発揮できるブロックサイズが異なる
  • Raspberry Pi 4の場合だと、並列処理によりパフォーマンスは低下する
  • UHS-II 非対応のカードリーダの場合、UHS-II対応のSDカードの性能を発揮できない

おわりに

本記事では、さまざまな環境で読み込み書き込み性能を測定した。
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