Partition Alignment Guide¶
The easiest way¶
A commonly used and very simple alternative to partition alignment
is to create the file system directly on the storage device without
any paritions. To do this, you would just use mkfs
without any
partition number, e.g., for XFS
:
$ mkfs.xfs /dev/sdb
Thus, you would easily avoid the misalignment, which is introduced by a partition table. However, even in this case, you should still have a look at the section Create RAID-optimized File System at the bottom of this page.
Partition Alignment - Example¶
By default, Linux uses a 512 bytes alignment (to be more specific: 63*512 bytes) for the first primary partition on a device. This is fine for single disks, at least the traditional ones, that use 512 byte blocks. For RAID arrays or SSDs, you want to set a different alignment to avoid the overhead of read-modify-write operations and enable the internal XFS or ext4 RAID optimizations. Note that if you are using other software layers like LVM on a RAID, these can also introduce another offset and thus need to be taken into account for proper alignment.
In our example, we use a 600GB volume on:
- an array of 11 disks
- in RAID-6 mode
- with a stripe size of 64KB
- as device /dev/sdc
With RAID-6, we effectively have 9 disks for user data, so we want to align to 9 * 64KB. (For SSDs, you probably want to align to the erase block size, which is typically 512KB or a multiple of that.)
Partition Alignment - Check current¶
Note
The example below is based on fdisk
. Not all versions of fdisk
are compatible with
GPT partition tables. For GPT partitions you can use parted
or gdisk
instead.
If you already created a partition on your drive, you can check its alignment with the following command:
$ fdisk -lu /dev/sdc
Disk /dev/sdc: 599.9 GB, 599999905792 bytes
255 heads, 63 sectors/track, 72945 cylinders, total 1171874816 sectors
Units = sectors of 1 * 512 = 512 bytes
Device Boot Start End Blocks Id System
/dev/sdc1 63 1171861424 585930681 83 Linux
As you can see above, the start of the partition is currently at position 63*512 bytes, which is inappropriate for our use case.
Partition Alignment - Create aligned¶
Note
The example below is based on fdisk
, which is not compatible with GPT partition
tables. To create aligned GPT partitions, use parted
, e.g.:
$ parted /dev/sdc mklabel gpt
$ parted --align=opt /dev/sdc unit KiB mkpart pri $((9*64)) 100%
If you already have a partition on your device, make sure to delete it first:
$ fdisk /dev/sdc
Command (m for help): d
Selected partition 1
Command (m for help): w
The partition table has been altered!
As mentioned above, we want to align to 9*64KB. We will use the fdisk
arguments “-H 8 -S
16
” to manually specify the (logical) number of heads and sectors. These arguments allow us to
create a partition that is aligned to 64KB or any multiple of 64KB. Our settings are based on 64KB
cylinders and we want our partition to start right after the first stripe set (9 cylinders), so we
will set the first cylinder to 10.
$ fdisk -H 8 -S 16 /dev/sdc
The number of cylinders for this disk is set to 9155272.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-9155272, default 1): 10
Last cylinder or +size or +sizeM or +sizeK (10-9155272, default 9155272):
Using default value 9155272
Command (m for help): w
The partition table has been altered!
If you want to verify the new alignment:
$ fdisk -l /dev/sdc
Disk /dev/sdc: 599.9 GB, 599999905792 bytes
8 heads, 16 sectors/track, 9155272 cylinders
Units = cylinders of 128 * 512 = 65536 bytes
Device Boot Start End Blocks Id Type
/dev/sdc1 10 9155272 585936832 83 Linux
We can see above that the partition starts at cylinder 10 and cylinders have a size of 64KB. Now it’s time to create a file system on the new partition.
Create RAID-optimized File System¶
XFS and ext4 allow you to specify RAID settings. This enables the file system to optimize its read and write access for RAID alignment, e.g. by committing data as complete stripe sets for maximum throughput. These settings can be made at file system creation time or, in the case of XFS, also later at mount time.
Note that these RAID optimizations can significantly improve performance, but only if your partition is properly aligned or of you are avoiding misalignment by creating the xfs on a device without partitions.
To create a new XFS file system for 9 disks (where the number 9 does not include the number of RAID-5 or RAID-6 parity disks) and 64KB chunk size, use:
$ mkfs.xfs -d su=64k,sw=9 -l version=2,su=64k /dev/sdc1
Note
If your data is stored on a RAID-5 or RAID-6 volume, you might want to consider putting the file system journal on a separate RAID-1 volume, due to the read-modify-write overhead of RAID-5 and RAID-6.