23.2. ユーザー空間アクセス
適切にアライメントおよびサイズ設定された I/O を使用するように常に注意してください。これは、ダイレクト I/O アクセスでは特に重要です。ダイレクト I/O は、logical_block_size 境界と、logical_block_size の倍数で整列する必要があります。
ネイティブ 4K デバイス( logical_block_size が 4K)の場合は、アプリケーションがデバイスの logical_block_size の倍数でダイレクト I/O を実行することが重要です。つまり、アプリケーションは、4k 境界で整列された I/O ではなく 512 バイトで整列された I/O を実行するネイティブの 4k デバイスでは失敗します。
これを回避するには、アプリケーションでデバイスの I/O パラメーターを調べて、適切な I/O アライメントとサイズが使用されていることを確認する必要があります。前述のように、I/O パラメーターは、sysfs インターフェイスおよびブロックデバイス ioctl インターフェイスの両方で公開されています。
詳細は、man libblkid を参照してください。この man ページは、
libblkid-devel
パッケージで提供されます。
sysfs インターフェイス
- /sys/block/
disk
/alignment_offsetまたは/sys/block/disk
/partition
/alignment_offset注記ファイルの場所は、ディスクが物理ディスク (ローカルディスク、ローカル RAID、またはマルチパス LUN) か、仮想ディスクかによって異なります。最初のファイルの場所は物理ディスクに適用され、2 番目のファイルの場所は仮想ディスクに適用されます。これは、virtio-blk がパーティションのアラインメント値を常に報告するためです。物理ディスクは、アライメント値を報告する場合と報告しない場合があります。 - /sys/block/
disk
/queue/physical_block_size - /sys/block/
disk
/queue/logical_block_size - /sys/block/
disk
/queue/minimum_io_size - /sys/block/
disk
/queue/optimal_io_size
カーネルは、I/O パラメーター情報を提供しないレガシーデバイスに、この sysfs 属性をエクスポートします。以下に例を示します。
例23.1 sysfs インターフェイス
alignment_offset: 0 physical_block_size: 512 logical_block_size: 512 minimum_io_size: 512 optimal_io_size: 0
ブロックデバイス ioctls
- BLKALIGNOFF:
alignment_offset
- BLKPBSZGET:
physical_block_size
- BLKSSZGET:
logical_block_size
- BLKIOMIN:
minimum_io_size
- BLKIOOPT:
optimal_io_size