raspberry pi の sdcard 書き換え回数寿命を考える

Page content

raspberry pi でローカルサーバを立ち上げているが、 この sdcard 寿命が気になったので調べてみた。

sdcard はでなく、 hdd や ssd で運用する方法もあるが、 sdcard で運用できる方がランニングコストが良いので、できれば sdcard で運用したい。

sdcard の寿命の見積り

iostat -h で sdcard への書き込み量を調べると、 1日約 1GB の書き込み がある。

この書き込みが sdcard の 何ブロックを書き換えているのか不明 なので、 とりあえず 10 倍の 10GB 相当 のブロックを書き換えたとする。

次に sdcard が SLC か MLC か TLC かだが、 パッケージも何も残っていないので予測でしかないが、 数年前にアキバの最安値のものを買ったはずなので TLC と予想する。

そして 16GB の sdcard なので、TLC ならば 約 16TB の書き込みが可能だとすると、 1 日 10GB の書き換えで 約 4 年間 で寿命を越えることになる。

ほとんどが予想でしかないが、少なくとも 1 年は寿命を気にせずに使用できるだろう。

そんな訳で、このままの構成で1年程度運用してから、 来年あたりに MLC の高耐久モデルの sdcard に入れ替えて運用しようと思う。 そうすれば、10 年程度は運用できるだろう。

もちろん 10 年間も運用するとは思えないので、 今のサーバ構成で MLC の sdcard を使用すれば、 実質的に寿命を気にする必要はないだろう。

もしも 1 年の運用中に sdcard の寿命を越えるようなことがあれば、 sdcard のブロック書き換え数の見積りが想定以上だったか、 ハズれの sdcard を引いたかになる。

ブロック書き換え数の見積りが想定以上なのだとしたら、 sdcard の容量を大きめのサイズにすることで対応できるだろう。

ちなみに現状の sdcard の書き込みサイズ情報は以下の通り。

約 185 GB (+ 129 56)

$ sudo dumpe2fs -h /dev/mmcblk0p2 | grep "Lifetime writes"
dumpe2fs 1.44.5 (15-Dec-2018)
Lifetime writes:          129 GB
$ iostat -h
Linux 5.10.4-v8+ (raspberrypi4) 	17/02/21 	_aarch64_	(4 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           2.9%    3.8%    1.6%    0.3%    0.0%   91.5%

      tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn Device
     0.41         3.4k        24.8k       7.7G      56.3G mmcblk0

パフォーマンス計測

寿命を予測する方法として、 定期的(月に一度程度)に SD card への書き込みパフォーマンスを記録することにした。

パフォーマンスは dd コマンドによる 200MB 書き込みの時間とする。

ただし、書き込み時間はかなりばらつく。 特に初回の dd コマンドの書き込みはバッファリングが効くためか異様に早いので、 3回目、4回目を記録する。

2021/04/17

$ sudo dd if=/dev/zero of=/tmp/dump bs=1M count=200
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 42.9515 s, 4.9 MB/s
$ sudo dd if=/dev/zero of=/tmp/dump bs=1M count=200
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 30.8832 s, 6.8 MB/s

この時点で既にめちゃくちゃ遅い。

今後どれほど変っていくのか興味深い。

2021/05/30

$ sudo dd if=/dev/zero of=/tmp/dump bs=1M count=200
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 28.4992 s, 7.4 MB/s
4$ sudo dd if=/dev/zero of=/tmp/dump bs=1M count=200
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 60.2642 s, 3.5 MB/s
$ iostat -h
      tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn Device
     0.41         3.1k        36.6k      15.9G     187.0G mmcblk0
$ sudo dumpe2fs -h /dev/mmcblk0p2 | grep "Lifetime writes"
Lifetime writes:          261 GB

予想よりもだいぶ多い書き込みが発生している。

次回も書き込み速度がさらに下るようなら、 実験を停止して新しい SD カードに移行した方が良いかもしれない。

2021/07/04

$ sudo dd if=/dev/zero of=/tmp/dump bs=1M count=200
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 47.6562 s, 4.4 MB/s
$ sudo dd if=/dev/zero of=/tmp/dump bs=1M count=200
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 38.4939 s, 5.4 MB/s
$ iostat -h
Linux 5.10.4-v8+ (raspberrypi4) 	04/07/21 	_aarch64_	(4 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           2.9%    3.6%    1.5%    0.2%    0.0%   91.7%

      tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn Device
     0.16         2.5k         2.5k       6.9G       6.7G mmcblk0
     0.24         0.1k        32.6k     147.1M      88.2G sdb

$ sudo dumpe2fs -h /dev/mmcblk0p2 | grep "Lifetime writes"
Lifetime writes:          454 GB

2021/08/01

$ sudo dd if=/dev/zero of=/tmp/dump bs=1M count=200
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 32.3397 s, 6.5 MB/s
$ sudo dd if=/dev/zero of=/tmp/dump bs=1M count=200
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 34.3965 s, 6.1 MB/s
$ iostat -h
Linux 5.10.4-v8+ (raspberrypi4) 	01/08/21 	_aarch64_	(4 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           3.0%    3.5%    1.5%    0.2%    0.0%   91.8%

      tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn Device
     0.16         2.5k         2.3k      12.3G      11.7G mmcblk0
     0.24         0.0k        33.3k     236.0M     166.7G sdb

2022/01/02

$ sudo dd if=/dev/zero of=/tmp/dump bs=1M count=200
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 39.4435 s, 5.3 MB/s
$ sudo dd if=/dev/zero of=/tmp/dump bs=1M count=200
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 46.9338 s, 4.5 MB/s
$ iostat -h

Linux 5.10.4-v8+ (raspberrypi4) 	02/01/22 	_aarch64_	(4 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           3.0%    0.3%    1.2%    0.1%    0.0%   95.3%

      tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn Device
     0.15         3.0k         2.4k      12.4G      10.2G mmcblk0
     0.24         0.0k        32.7k     148.3M     136.2G sdb