Raspberry Pi Zero2WのSDカードの速度を改善する
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