
私はCardBusアダプタを搭載したラップトップ(カーネル2.6.38)で使用されている古い64MBのCFカードを持っています。このCFカードに64MBの画像を書き込むと、書き込み速度が200MB/sを超えます。
T42 ~ # fdisk -lu
Disk /dev/sda: 40.0 GB, 40007761920 bytes
255 heads, 63 sectors/track, 4864 cylinders, total 78140160 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: 0x00043afc
Device Boot Start End Blocks Id System
/dev/sda1 * 2048 73947135 36972544 83 Linux
/dev/sda2 73949182 78139391 2095105 5 Extended
/dev/sda5 73949184 78139391 2095104 82 Linux swap / Solaris
Disk /dev/sdb: 64 MB, 64225280 bytes
8 heads, 32 sectors/track, 490 cylinders, total 125440 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: 0x00000000
Device Boot Start End Blocks Id System
/dev/sdb1 * 32 125300 62634+ 4 FAT16 <32M
Partition 1 has different physical/logical endings:
phys=(488, 7, 32) logical=(489, 3, 21)
T42 ~ # mount | grep -i sdb
T42 ~ # time dd if=64MB of=/dev/sdb bs=10M
6+1 records in
6+1 records out
64225280 bytes (64 MB) copied, 0.320419 s, 200 MB/s
real 0m0.624s
user 0m0.000s
sys 0m0.304s
T42 ~ #
64MBを0.32秒で転送することは、10年後のCFカードとしては当然非現実的であり、完了後すぐにノートブックからカードを取り外すと、出力にdd if=64MB of=/dev/sdb bs=10M
多くのエラーが見られます<timestamp> end_request: I/O error, dev sdb, sector <sector number>
。dmesg
この動作の原因は何ですか?
答え1
ブロックデバイスの書き込みはカーネルによってバッファリングされます。これはファイルシステムがマウントされているときにはっきりと表示されます(アンマウント時にバッファをフラッシュする必要があるため、返されるまでに長い遅延が発生します)umount
。より多くのRAMが利用可能になると、この遅延はさらに悪化するようです。カーネルがデータ転送を開始する直前に0.5GBを書き込むこともできます。転送が完了した後、数分間カーネルがデバイスに透過的に書き込むことができます。
この機能はいくつかの理由で役立ちます。これにより、デバイスの読み書きに対する応答速度が速くなり、データも透過的に転送できます。読む書き込み後、実際の物理書き込みが完了する前にバッファから読み出されます。長期間取り付けられたハードドライブの場合、カーネルは時間の経過とともに書き込みが行われるようにスケジュールし、ユーザーの観点からデバイスの応答性を向上させます。特に磁気ハードドライブの場合、大きなブロックを順次書き込む方が、ドライブ全体の複数の場所に小さなブロックを書き込むよりも高速です。ブロックは物理デバイスにプッシュされる前にソートおよびグループ化できます(ハードドライブは一部のバッファリングとデータソートも実行します)。ハードウェア内で)。つまり、デバイスがどれくらい遅いのかわからず、ネットワークに搭載されているドライブやハードドライブを休止状態から起動する必要がある場合、初期遅延もわかりません。
ブロックデバイスに直接アクセスすると、呼び出しを行わずにumount
転送が完了した時点を実際に認識できないため、バッファリングはやや残念です。sync
とにかく電話する必要があります。
答え2
オペレーティングシステムがデータdd
(およびその他のコマンド)をキャッシュしているため、sync
CFを削除する前に次のことを行う必要があります。同期が完了するまで待ちます。。
キャッシング/バッファリングはパフォーマンス上の理由で重要であり、たとえば、HDのシングルトラックへのすべての書き込みが一度に正しい順序で完了するように、カーネル/ドライバが基本ハードウェアへの書き込みを並べ替えることができます(ヘッドの移動数を減らす)。