Always take care to use properly aligned and sized I/O. This is especially important for Direct I/O access. Direct I/O should be aligned on a logical_block_size
boundary, and in multiples of the logical_block_size
.
With native 4K devices (i.e. logical_block_size
is 4K) it is now critical that applications perform direct I/O in multiples of the device's logical_block_size
. This means that applications will fail with native 4k devices that perform 512-byte aligned I/O rather than 4k-aligned I/O.
To avoid this, an application should consult the I/O parameters of a device to ensure it is using the proper I/O alignment and size. As mentioned earlier, I/O parameters are exposed through the both sysfs
and block device ioctl
interfaces.
For more details, refer to man libblkid
. This man
page is provided by the libblkid-devel
package.
/sys/block/disk
/alignment_offset
/sys/block/disk
/partition
/alignment_offset
/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
The kernel will still export these sysfs
attributes for "legacy" devices that do not provide I/O parameters information, for example:
alignment_offset: 0
physical_block_size: 512
logical_block_size: 512
minimum_io_size: 512
optimal_io_size: 0
BLKALIGNOFF
: alignment_offset
BLKPBSZGET
: physical_block_size
BLKSSZGET
: logical_block_size
BLKIOMIN
: minimum_io_size
BLKIOOPT
: optimal_io_size