ソフトウェアを書く方は、「やーそれラズパイ買ってきてちゃちゃっとデモしちゃいましょうよ」というようなことを一度や二度は口にしたことがあるんじゃないでしょうか?僕はあります。でもいざやってみると、SD Card に乗ってるシステムって怖いんですよね。いつ飛んじゃうのかと。そして、近頃もラズパイで楽しく遊んでみようと思ったらやはりシステムが飛んでしまいました。まあただの設定ミスかもしれないんですけど。それで、本格的に遊んでみる前に、以前からかねての疑問「そもそもラズパイには何の SD Card を使ったらいいの?」についてまじめに取り組んでみました。
SD Card の規格、超わかりくくないですか?こんなのとか。
「え?class 10? V30? U3? A1? なにそれ?」と思ってしまいます。買うとき毎回です。
調べた結論から書いてしまうと僕の考えは「SD Card を使うなら A2 クラスが良い。ほかのあれこれは無視してOK」です。でも「むしろ SD Card は使わないで SSD を使った方がいい」とも思うんですけれども。なんでそう思うのか興味があったら続きを読んでいってください。
class10 とか V30 とか U3 とか何のことでしょうか?そもそも SD Card にはなんでこんなにあれこれタグがついているんでしょうか?これについて調べてみました。すごく大雑把にまとめると、A1/A2 のアプリケーションクラスだけ少し毛色が違いますが他は「スピードクラス」といってカメラやオーディオなどのメディア記録用デバイスに使うときの目安にする性能指標で、SD Card の性能が指標の想定を超えて向上したため乱立してしまったようです。詳しくは こちらに SD カード協会から出ている解説記事があります。後ほど述べますがスピードクラスはラズパイに使うときにはあまり気にしなくて良いなと思いました。A1/A2 のアプリケーションクラスのほうがラズパイにはずっと重要に思えます。
A1 / A2 はアプリケーションクラスといって指標の対象が異なっています。スマホなど、アプリ用途として使われることを想定した場合の「規格」的なものでその性能基準もバンド幅だけを挙げるスピードクラスよりも細分化されています。これは SD Card 利用の多様化がかかわっていると思います。カメラやオーディオなどのデバイスでは利用方法が写真や音楽を読み書きするというある意味「ワンパターン」で、それを想定した性能の測定方法も一種類で十分でしたが、アプリのような多様な使い方を考えるとただ「スピードいくつ」という一次元的な評価では曖昧過ぎるのです。A1/A2 ではそこを考慮して、こういうアクセスに対してはいくつ、という風により細かく性能基準を設定しています。そして、肝心な点は A1 と A2 のどちらを選んだら良いのかです。ネットを見ると「ラズパイに使うなら A1 でも A2 でも大差ないよ」という意見が大勢を占めています。でもラズパイをこれからまじめに使うにあたって「なんかそうだっていう話だよ」で片づけたくはないです。それに SD Card ってたくさん出回っていて価格もまちまち、同じ A1 / A2 でも同列に扱っていいの?という疑問もあります。実測して確かめてみましょう。
今回計測する記憶媒体は以下の通り。SanDisk は今システムに使っているカードです。他は 1000 円を切るものを選んでみました。びっくりするぐらい安いですね。Kioxia のカードはアプリクラスでは無印でしたけれども、安かったので参考に入れてみました。これで結構高価な SanDisk の A2 クラスと「大差ない」ならお財布に優しくてうれしいです。もう一つ参考に、サンワサプライの SSD USB メモリも比較対象として測ってみました。SSD とは「ソリッド・ステート・ディスク」のこと、名前からして強そうです。強敵に違いない。
メーカー | 名前 | タイプ | アプリクラス | スピードクラス | 容量 |
---|---|---|---|---|---|
SanDisk | Extreme | SD Card | A2 | U3 | 128 GB |
Axe | micsSDXC UHS-I Card | SD Card | A1 | U3 | 64 GB |
SiliconPower | Superior | SD Card | A1 | U3 | 64 GB |
Kioxia | Exceria | SD Card | なし | U1 | 64 GB |
サンワサプライ | SSD | USB SSD | 250 GB |
どうやって測るのか?fio というツールを使います
非常に柔軟に設定ができる I/O ベンチマークツールでしかも詳細に性能データが取れる優れものです。このツールを使って、以下の性能指標を集めました
- バンド幅 (MiB/sec)
- 応答時間 (マイクロ秒)
- p70
- p99
- p99.99
pNN というのは、quantile といってその応答時間に全体の Nパーセントが収まっている、という数字です。p70 は「70パーセンタイル」と読んで 70% の応答がこの時間に収まっているということです。パーセントが高いほど最悪値に近いところをカバーしていることになり、quantile の値の上がり方で、その応答速度がどれぐらい「予想可能」かを示しています。ゲームとか楽器とかそういうリアルタイム性の高い用途では、実はバンド幅より応答速度の quantile のほうがはるかに重要です。普段はそこそこ動いていても、「一回でももたついたらアウト」だからです。quantile は低いほうが良いですが、ディスクやネットワークなどいわゆる I/O の応答時間は一般に 100% に近いところで跳ね上がる傾向があります。
あと、計測を行うにあたって、記憶媒体にアクセスするパタンも重要です。大事な点は二点で、「順次アクセスとランダムアクセスを両方テストすること」と「キャッシュの影響を極力避ける」ことです。順次アクセスとは、ストリーミングのようにダラーっとデータを流すこと、ランダムアクセスは任意の場所をピンポイントで触ることです。リアルタイム目的では後者が特に重要です。キャッシュは記憶媒体に速い揮発性のメモリをかぶせて記憶媒体の速度を見かけ上高める技術ですが計測の邪魔でもあります。その影響を小さくするためには、テストの読み書きの範囲をキャッシュが追従できないように十分大きくとります。今回は 10 GB としました。実は、あと一つ「ディスクを十分に汚しておくこと」も重要なんですけど、これは準備にすごく時間がかかるので今回は目をつぶります。
fio の設定ファイル例の中に SSD テスト用というのがあってまさに上記のテストをしてくれるのでそのまま使いました。というか上記は見つけた設定の説明をしただけなんですけれどもね。専門家が考えてくれた知恵をそのまま借りることにします。
https://github.com/axboe/fio/blob/master/examples/ssd-test.fio
結果がこちら。バンド幅の単位は MByte/sec、応答時間は全部マイクロ秒です。
色々と面白いことが判りました。
- バンド幅は SD Card 間ではクラスが違ってもあまり差がない
- 応答時間はクラスで違う。A2 とそれ以外の差は大きい
- Kioxia がんばってる。実は一番安かったのに。でもなんか性能の傾向が予想付かない感じで謎。謎の仕組みでも入ってるのかな?
安いカードで事足りたらハッピー、と思ってましたけど、僕はこれはよしとできないと考えました。現実は甘くないです。いやそれより、SSD と SD Card の性能差が圧倒的じゃないですか?丈夫さとか総合的に考えたら SD Card あたりをウロチョロするよりばーんと SSD に取り換えてしまうほうが現実的に思えてきました。
でも、それでもあえて SD Card を使うなら A2 が良いと思います。ネットでは「大差ない」という意見がほぼ「共通見解」みたいになってますが、p99 と p99.99 にはっきり違いが出ています。あ、リアルタイム用途での応答時間が重要ではなくてスループットだけが重要なら「大差ない」で正しいと思います。ディスクの性能は数字を語るとき「何の`用途で?」と枕を付ける必要があるのが難しいけど面白いところです。
A2 のほうがいいはず、という僕の考えには、実は 仕組み的な根拠もあるんです。これは SD 協会から発表されている「アプリクラスって何?」という記事
この記事は A2 の仕組み的な特徴についても触れていますが、A2 では新たに「Command Queue」という仕組みが導入されているとのこと。他にもキャッシュのことが書いてありますがそれはここでは重要ではなく。
これは、僕の理解が正しければ、アプリが読み書きを命令を出して SD がそれを順次こなしてゆく今までの動きに対して、アプリがキューに命令を入れて SD の中の「動ける人」がどんどんそれを拾ってゆく仕組みが導入されたということだと思います。記憶媒体のインタフェースでは常套手段なので、今までなかったのも意外で誤解していないかよく確認する必要もありますけど、もし理解した通りなら応答時間が以前より良くなっているのは納得できます。ディスクが忙しくなってきたときに特に威力を発揮する仕組みだからです。
面白いなあ。こういう風に仕組みと実測データの関連を見つけたりするとちょっとエンジニアの喜びを感じたりするのです