ランダム書き込みのSDカードのパフォーマンスを確認すると、4 KBのレコードサイズではパフォーマンスが非常に悪いことがわかります(これは驚くことではありません)が、いくつかのカードでは、レコードサイズが大きくなると低下してから増加します。iozone v3.430でランダム書き込みのパフォーマンスを測定し、異なるメーカーのいくつかのフラッシュカードをテストしました。これはiozoneコマンドで、ファイルサイズ50 MBで測定していました。
iozone -RaeI -i 0 -i 1 -i 2 -y 4k -q 1M -s 50m -o -f /tmp/testfile
これは、ファイルサイズが50 MBの場合の結果です。
質問:レコードサイズが8、16、32、64、128 kBのランダム書き込みパフォーマンスが4 kBのレコードサイズと比べて遅い理由は何ですか?
Peter Brittainはより大きなファイルサイズでテストすることを提案したので、ファイルサイズ500 MBでも試してみました。これが結果です:
全体的なパフォーマンスは悪化しましたが、現象は引き続き発生します。
パーティションは4 MBの境界に揃えられます。ファイルシステムは4 kBブロックサイズのext4です。テストの開始に使用されるパーティションはmmcblk0p2です。
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 953.7M 0 loop /mnt/sdb1
mmcblk0 179:0 0 14.9G 0 disk
├─mmcblk0p1 179:1 0 56M 0 part /boot
├─mmcblk0p2 179:2 0 7.8G 0 part /
└─mmcblk0p3 179:3 0 7G 0 part /mnt/mmcblk0p3
$ cat /etc/fstab | grep mmcblk0p2
/dev/mmcblk0p2 / ext4 defaults,noatime 0 1
$ sudo fdisk -l /dev/mmcblk0
Disk /dev/mmcblk0: 15.9 GB, 15931539456 bytes
4 heads, 16 sectors/track, 486192 cylinders, total 31116288 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000981cb
Device Boot Start End Blocks Id System
/dev/mmcblk0p1 8192 122879 57344 c W95 FAT32 (LBA)
/dev/mmcblk0p2 122880 16506879 8192000 83 Linux
/dev/mmcblk0p3 16506880 31115263 7304192 83 Linux
$ mount | grep ext4 | grep root
/dev/root on / type ext4 (rw,noatime,data=ordered)
# tune2fs -l /dev/mmcblk0p2 | grep Block
Block count: 2048000
Block size: 4096
Blocks per group: 32768
更新1:ランダム書き込みのパフォーマンスは、特に小さいレコードサイズの場合、シーケンシャル書き込みに比べて著しく低いことが明らかです。NANDフラッシュストレージのメモリセルはページにグループ化され、いわゆる消去ブロックと呼ばれます。通常のページサイズは4、8、または16 kBです。コントローラーが単一ページを書き込むことは可能ですが、データは最初に消去されなければ上書きできません。消去ブロックは、NANDフラッシュストレージが消去できる最小単位です。消去ブロックサイズは通常、128 kB〜2 MBです。最新のSDカードでは、少数の消去ブロックが、割り当てグループまたは割り当てユニットまたはセグメントと呼ばれる同じサイズの大きなユニットに結合されます。通常のセグメントサイズは4 MBです。ストレージに対する各書き込み操作は、セグメント全体の読み取り-変更-書き込み操作になります。たとえば、セグメントサイズが4 MBのSDカードでは、4 kBのデータをランダムな場所に書き込むと、書き込み増幅率は1024 になります。SDカードのコントローラーは、変換レイヤーを実装します。I / O操作では、仮想アドレスから物理アドレスへの変換がコントローラーによって実行されます。セグメント内のデータが上書きされる場合、変換レイヤーはセグメントの仮想アドレスを別の消去された物理アドレスに再マッピングします。古い物理セグメントはダーティとしてマークされ、消去のキューに入れられます。後で消去されると、再利用できます。通常、SDカードのコントローラーは、ランダム書き込み操作のパフォーマンスを向上させるために、1つ以上のセグメントをキャッシュします。SDカードにルートファイルシステムが保存されている場合、カードのコントローラーが書き込み操作が行われるセグメント、ファイルシステムのメタデータを保存するセグメント、利用可能)ファイルシステムのジャーナル。その結果、SDカードのランダム書き込みパフォーマンスは、消去ブロックサイズ、セグメントサイズ、およびセグメントの数、コントローラーキャッシュに依存します。しかし、これは、レコードサイズが8、16、32、64、128 kBのランダム書き込みパフォーマンスが4 kBのレコードサイズほど遅い理由を説明していません。
更新2(myautへの回答):表のスクリーンショットは私自身の作品です。現在、私はシングルボードコンピューターのクラスターに関する記事/論文を書いています。なぜなら、それらは学生プロジェクトや研究者にリソースを提供するための興味深い選択肢だからです。このコンテキストでは、単一ノードのCPU、ストレージ、およびネットワークインターフェイスのパフォーマンスも調査しました。すべてのテスト済みSDカードを購入しました。私がインストールしたカードの1つ(dd経由でコピー)Raspian Wheezy(バージョン2014-06-20)。ネットワーク設定を構成し、いくつかの追加パッケージ(iozoneなど)をインストールした後、SDカード全体を他のすべてのSDカードにコピーしました。
更新3(Gabriel Southernへの回答):結果はシングルランからのものです。手順は次のとおりです。
- Raspberry Pi Model Bにカードを挿入します
- システムを起動します
- SSH経由でログイン
- iozoneテスト実行を開始
- システムを停止し、別のSDカードで試してください
何度か試したカードのいくつかを再確認してみました。わずかな変動がありました。この現象は、2枚のSamsungカードと1枚のVerbatimカードを除いて、常に発生します。
更新4:現在、NANDフラッシュclontrollers(Samsung、SanDisk、Toshiba ...)を製造している会社への連絡先を見つけて、そこに明確な回答を求めています。SanDiskにはフォーラムがあります。私はそこで説明を求めました。キングストンの技術サポート部門にもリクエストを送りました。
更新5:消去ブロックサイズとアロケーションユニット(セグメント)サイズは、現象の原因ではありません。ThinkPad X240ノートブックの内部カードリーダーのpritcsd.pyツール拳で、最後にRaspberry Pi Model B ですべてのSDカードの消去ブロックサイズをテストしました。すべてのカードの出力は次のとおりErase block size of mmcblk0 is 65536 bytes
です。また、テストされたすべてのSDカードのセグメントサイズは同じです。4 MBです。この情報はファイル にあります/sys/class/mmc_host/mmc0/mmc0*/preferred_erase_size
。私の意見では、これらのカードはすべて同じ消去ブロックサイズとセグメントサイズを持っているというのは非常に珍しいことです。その間、テスト済みのカードのパッケージから製品ID /アイテム番号を収集しました。どうぞ。
更新6: Kingstonの技術サポートは、テスト済みのKingstonカード(および他のほとんどのカード)のコントローラーがサイズ4 kBのファイル用に最適化されていると書いています。正確なコントローラーの実装は機密です。キングストンからの答えは私が得た最高のものです。SanDiskが私のサポートリクエストに応答せず、Sony、SamsungまたはVerbatimから連絡先を見つけることができませんでした