💾

Raspberry Pi Zero2WのSDカードの速度を改善する

2024/02/01に公開

Raspberry Pi Zero2WでSDカードの読み書きがいまいち遅いなと思っていたところ、config.txtの設定を変えると高速化できるという話を見かけたので試してみました。

測定環境

  • デバイス Raspberry Pi Zero2W
  • OS : Raspberry Pi OS Lite(64bit) 2023-12-05版
  • SDカード:SanDisk SDSQXAH-064G-GH3MA(64Gbyte, Read 170MByte/Write 80MBytes)

効果測定の方法

こちら(https://www.tomoyan.net/hardware/raspberry_pi/sdcard_overclock) のベンチマーク(sdbench.sh)を使い、Read/Writeの速度を測定しました。

変更する場所

/boot/config.txtに以下の行を追加します。機種ごとによって指定方法が異なるようです。

dtparam=sd_overclock=100

測定結果

変更前(デフォルト)

CONFIG: default
CLOCK : SD Bus: 50.000 MHz, CPU: 1000.104 MHz, CPU Temp: 42.932 ℃, SDRAM: 500 MHz
VOLTS : core: 1.2563V, sdram(controller, I/O, physical): 1.2500V, 1.2500V, 1.3000V
CORE  : 400 MHz(400 MHz), turbo=1
DATA  : 512 MB, /root/test.dat

HDPARM:
======
 Timing O_DIRECT disk reads:  68 MB in  3.04 seconds =  22.36 MB/sec
 Timing O_DIRECT disk reads:  68 MB in  3.04 seconds =  22.40 MB/sec
 Timing O_DIRECT disk reads:  68 MB in  3.06 seconds =  22.24 MB/sec

WRITE:
=====
536870912 bytes (537 MB, 512 MiB) copied, 24.9747 s, 21.5 MB/s
536870912 bytes (537 MB, 512 MiB) copied, 24.6402 s, 21.8 MB/s
536870912 bytes (537 MB, 512 MiB) copied, 24.7736 s, 21.7 MB/s

READ:
====
536870912 bytes (537 MB, 512 MiB) copied, 22.8346 s, 23.5 MB/s
536870912 bytes (537 MB, 512 MiB) copied, 22.7905 s, 23.6 MB/s
536870912 bytes (537 MB, 512 MiB) copied, 22.7791 s, 23.6 MB/s

RESULT (AVG):
============
core_freq   turbo     sd clock       WRITE        READ        HDPARM
   400        1      50.000 MHz   20.65 MB/s   22.46 MB/s   22.32 MB/s

microSD card benchmark complete!
CPU Temp: 45.084 ℃

変更後

CONFIG: dtparam=sd_overclock=100
CLOCK : SD Bus: 100.000 MHz, CPU: 1000.104 MHz, CPU Temp: 40.780 ℃, SDRAM: 500 MHz
VOLTS : core: 1.2563V, sdram(controller, I/O, physical): 1.2500V, 1.2500V, 1.3000V
CORE  : 400 MHz(400 MHz), turbo=1
DATA  : 512 MB, /root/test.dat

HDPARM:
======
 Timing O_DIRECT disk reads: 128 MB in  3.03 seconds =  42.18 MB/sec
 Timing O_DIRECT disk reads: 128 MB in  3.04 seconds =  42.15 MB/sec
 Timing O_DIRECT disk reads: 128 MB in  3.03 seconds =  42.20 MB/sec

WRITE:
=====
536870912 bytes (537 MB, 512 MiB) copied, 17.3742 s, 30.9 MB/s
536870912 bytes (537 MB, 512 MiB) copied, 17.3469 s, 30.9 MB/s
536870912 bytes (537 MB, 512 MiB) copied, 17.3208 s, 31.0 MB/s

READ:
====
536870912 bytes (537 MB, 512 MiB) copied, 11.7896 s, 45.5 MB/s
536870912 bytes (537 MB, 512 MiB) copied, 11.7866 s, 45.5 MB/s
536870912 bytes (537 MB, 512 MiB) copied, 11.7991 s, 45.5 MB/s

RESULT (AVG):
============
core_freq   turbo     sd clock       WRITE        READ        HDPARM
   400        1     100.000 MHz   29.52 MB/s   43.42 MB/s   42.20 MB/s

microSD card benchmark complete!
CPU Temp: 45.084 ℃

Writeで20MBytes/sec→39MBytes/secと約1.5倍、Readで22MBytes/sec→43MBytes/secと約2倍高速化できました。

参考:Raspberry Pi 4Bではどうか?

Raspberry Pi 4B以降ではBCM2711のEMMC2/SDインターフェイスを使用しており、これはDDR50インターフェイスに対応しています。(その前のはSDRのみ対応)で、SDR104とDDR50の転送速度は結果的にほとんど変わらないので、標準でもそれなりの速度が出ています。
ドライバも違うのでdtparamを設定しても高速化できません。やるならドライバから手を入れないといけません。参考(https://github.com/raspberrypi/linux/issues/5126)

Raspberry Pi zero2Wでのカードの認識

clock:          50000000 Hz
actual clock:   100000000 Hz
vdd:            21 (3.3 ~ 3.4 V)
bus mode:       2 (push-pull)
chip select:    0 (don't care)
power mode:     2 (on)
bus width:      2 (4 bits)
timing spec:    2 (sd high-speed)
signal voltage: 0 (3.30 V)
driver type:    0 (driver type B)

Raspberry Pi 4Bでのカードの認識

clock:          50000000 Hz
actual clock:   50000000 Hz
vdd:            21 (3.3 ~ 3.4 V)
bus mode:       2 (push-pull)
chip select:    0 (don't care)
power mode:     2 (on)
bus width:      2 (4 bits)
timing spec:    7 (sd uhs DDR50)
signal voltage: 1 (1.80 V)
driver type:    0 (driver type B)

Raspberry pi 4Bでの結果

CONFIG: default
CLOCK : SD Bus: 50.000 MHz, CPU: 1800.404 MHz, CPU Temp: 40.894 ℃, SDRAM:  MHz
VOLTS : core: 0.9360V, sdram(controller, I/O, physical): 1.1000V, 1.1000V, 1.1000V
CORE  : 500
200 MHz(500.001 MHz), turbo=0
DATA  : 512 MB, /root/test.dat

HDPARM:
======
 Timing O_DIRECT disk reads: 120 MB in  3.01 seconds =  39.90 MB/sec
 Timing O_DIRECT disk reads: 120 MB in  3.00 seconds =  40.00 MB/sec
 Timing O_DIRECT disk reads: 124 MB in  3.05 seconds =  40.72 MB/sec

WRITE:
=====
536870912 bytes (537 MB, 512 MiB) copied, 14.9028 s, 36.0 MB/s
536870912 bytes (537 MB, 512 MiB) copied, 14.9604 s, 35.9 MB/s
536870912 bytes (537 MB, 512 MiB) copied, 14.9442 s, 35.9 MB/s

READ:
====
536870912 bytes (537 MB, 512 MiB) copied, 12.5047 s, 42.9 MB/s
536870912 bytes (537 MB, 512 MiB) copied, 12.2759 s, 43.7 MB/s
536870912 bytes (537 MB, 512 MiB) copied, 11.7129 s, 45.8 MB/s

RESULT (AVG):
============
core_freq   turbo     sd clock       WRITE        READ        HDPARM
./sdbench.sh: line 108: printf: 500
200: invalid number
   500        0      50.000 MHz   34.28 MB/s   42.12 MB/s   40.18 MB/s

microSD card benchmark complete!
CPU Temp: 42.355 ℃

まとめ

SDカードを適切なものを選んで設定を変えると大幅に高速化できることがわかりました。
SDカードによってはなぜかクロックを上げられない場合もあります。(Apacer 32GのClass10、UHS-I、U1だとクロックが25MHz以上で認識しませんでした)

Raspberry Pi 3/2/zeroでも行えて、それぞれ以下のように設定すればよいようです。

モデル 追加する設定
Raspberry Pi 2 dtoverlay=sdhost,overclock_50=100
Raspberry Pi 3 dtoverlay=sdtweak,overclock_50=100
Raspberry Pi Zero/Zero W dtoverlay=sdhost,overclock_50=100
Raspberry Pi Zero2W dtparam=sd_overclock=100

Raspberry Pi 4でももう少し早くしたいので、少し残念。。。

Raspberry Pi 5ではSDR104に対応したそうなので、SDカードを選べば2倍以上の速度が出そうです。なので体感的にはかなり早くなるかもしれませんね。

Discussion