Partition Alignment

Aus Thomas Krenn Wiki
Wechseln zu: Navigation, Suche

Unter Partition Alignment versteht man das richtige Ausrichten von Partitionen an sinnvollen Grenzen eines Datenträgers (z.B. Festplatte, SSD, RAID-Volume). Ein korrektes Partition Alignment gewährleistet eine optimale Performance bei Datenzugriffen. Speziell bei SSDs (mit internen Page-Größen von beispielsweise 4.096 oder 8.192 Bytes), Festplatten mit 4 KiB (4.096 Bytes) Sektoren und RAID Volumes führt eine fehlerhafte Ausrichtung von Partitionen zu verminderter Performance.

Inhaltsverzeichnis

Partitionen in der Vergangenheit

In der Vergangenheit begann die erste Partition stets auf LBA-Adresse 63 (entspricht dem 64. Sektor) - siehe dazu auch CHS und LBA Adressierung von Festplatten. Die Größe eines solchen (logischen) Sektors beträgt 512 Byte. Bei normalen Festplatten (mit einer physischen Sektorgröße von 512 Byte) ist das auch ok. Neuere Festplatten mit einer physischen Sektorgröße von 4.096 Byte (4 KiB) emulieren zwar nach außen hin eine Sektorgröße von 512 Byte, arbeiten intern aber mit 4.096 Byte. Auch SSDs arbeiten mit einer Pagegröße von 4 KiB bzw. 8 KiB. Bei diesen neuen Festplatten bzw. SSDs ist eine solche Partitionierung beginnend bei LBA-Adresse 63 sehr problematisch.

Wenn Sie nämlich diese Partition mit einem Dateisystem mit einer typischen Blockgröße von 4 KiB formatieren, passen die 4 KiB Dateisystem-Blöcke nicht direkt in die 4 KiB Sektoren der Festplatte bzw. 4 KiB / 8 KiB Pages der SSDs. Beim Schreiben eines einzelnen 4 KiB Dateisystem-Blockes müssen dann zwei 4 KiB Sektoren bzw. Pages verändert werden. Erschwerend kommt dabei hinzu, dass die jeweiligen 512 Byte Blöcke erhalten bleiben müssen - es kommt damit zu einem Read/Modify/Write. Die Folge ist eine bis zu 25fach schlechtere Schreibperformance bei kleinen Dateizugriffen.[1]

Probleme bei einem fehlerhaften Partition Alignment

Korrekte Partitionierung

Um diese Probleme zu vermeiden empfiehlt sich ein Alignment auf 1 MiB - damit ist man auf lange Sicht auf der sicheren Seite. Mit der aktuellen Adressierung in 512 Byte großen logischen Sektoren entspricht das 2048 Sektoren.

Ein richtiges Partition Alignment sorgt für höhrere Performance etwa bei SSDs.

Virtualisierte Systeme

Informationen für virtualisierte Systeme finden Sie im Artikel File System Alignment in virtualisierten Umgebungen.

Windows

Neuere Windows Versionen (Windows Vista, Windows 7, Windows Server 2008) führen folgendes sinnvolles Alignment durch:[2][3]

  • Disk Size <=4GiB -> align at 64KiB
  • Disk size >4GiB -> align at 1MiB

Ältere Versionen benötigen ein manuelles Alignment.[4]

Linux

fdisk (ältere Versionen)

Bei älteren fdisk Versionen können Sie manuell über die Paramater -S und -H ein Alignment erreichen. Bezüglich der konkreten Number of Sectors per Track (S) und Number of Head (H) Zahlen finden sich unterschiedliche Empfehlungen.[5][6][7] Mit -S 32 -H 64 sind die Partitionen aber jedenfalls auf 1 MiB aligned (32 Sektoren pro Track * 64 Heads * 512 Byte = 1.048.576 Byte = 1 MiB). Beim Erstellen der ersten Partition beginnen Sie dabei bei Zylinder 2. Ohne spezielle Parameter kommt es zu einem Misalignment durch fdisk.

fdisk ab Version 2.17.1

fdisk nutzt ein 1MiB Alignment ab util-linux-ng Version >= 2.17.1 sofern der DOS-Kompatibilitätsmodus deaktiviert wird.[8]

Die Empfehlung bei neueren fdisk Versionen lautet:[9]

  • verwenden Sie fdisk von util-linux-ng >= 2.17.2
  • lesen Sie Warnungen von fdisk
  • deaktivieren Sie den DOS-compatible mode (-c Option)
  • verwenden Sie Sektoren als Display Units (-u Option)
  • verwenden Sie +size{M,G} um das Ende einer Partition anzugeben

Beispiel fehlerhaftes Alignment

Im folgenden Beispiel zeigen wir ein fehlerhaftes Alignment. Dies entsteht durch den DOS-compatible mode:

root@ubuntu-10-04:~# fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0xe4909079.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Command (m for help): p

Disk /dev/sdb: 160.0 GB, 160041885696 bytes
255 heads, 63 sectors/track, 19457 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xe4909079

   Device Boot      Start         End      Blocks   Id  System

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-19457, default 1): 
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-19457, default 19457): +10G

Command (m for help): u
Changing display/entry units to sectors

Command (m for help): p

Disk /dev/sdb: 160.0 GB, 160041885696 bytes
255 heads, 63 sectors/track, 19457 cylinders, total 312581808 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: 0xe4909079

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1              63    20980889    10490413+  83  Linux

Command (m for help): 

Beispiel richtiges Alignment fdisk ältere Version

Mit den Parametern -S 32 -H 64 erhält man ein richtiges Partition Alignment wenn man bei Zylinder 2 die Partition beginnen lässt:

debian:~# fdisk -S 32 -H 64 /dev/sdc

The number of cylinders for this disk is set to 65536.
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): p

Disk /dev/sdc: 68.7 GB, 68719476736 bytes
64 heads, 32 sectors/track, 65536 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes
Disk identifier: 0x5a3b93b6

   Device Boot      Start         End      Blocks   Id  System

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-65536, default 1): 2
Last cylinder or +size or +sizeM or +sizeK (2-65536, default 65536): 
Using default value 65536

Command (m for help): p

Disk /dev/sdc: 68.7 GB, 68719476736 bytes
64 heads, 32 sectors/track, 65536 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes
Disk identifier: 0x5a3b93b6

   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1               2       65536    67107840   83  Linux

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
debian:~# fdisk -lu /dev/sdc

Disk /dev/sdc: 68.7 GB, 68719476736 bytes
64 heads, 32 sectors/track, 65536 cylinders, total 134217728 sectors
Units = sectors of 1 * 512 = 512 bytes
Disk identifier: 0x5a3b93b6

   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1            2048   134217727    67107840   83  Linux
debian:~# 

Beispiel richtiges Alignment fdisk ab Version 2.17.1

Bei abgeschaltetem DOS-compatible mode und der Sektor-Einheit bekommen wir ein richtiges Alignment (Partition beginnt an LBA Adresse 2048 - in diesem Fall mit einer SSD mit 4 KiB Pagegröße liegen damit 256 leere Pages zu Beginn, die Partition beginnt genau am Anfang der 257. Page):

root@ubuntu-10-04:~# fdisk -c -u /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0xfae13403.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

Command (m for help): p

Disk /dev/sdb: 160.0 GB, 160041885696 bytes
255 heads, 63 sectors/track, 19457 cylinders, total 312581808 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: 0xfae13403

   Device Boot      Start         End      Blocks   Id  System

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First sector (2048-312581807, default 2048): 
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-312581807, default 312581807): +10G

Command (m for help): p

Disk /dev/sdb: 160.0 GB, 160041885696 bytes
255 heads, 63 sectors/track, 19457 cylinders, total 312581808 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: 0xfae13403

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    20973567    10485760   83  Linux

Command (m for help): 

Alignment überprüfen

Unter Linux können Sie mit einem der beiden folgenden Kommandos das Alignment überprüfen (ersetzen Sie /dev/sdX durch das Device, z.B. /dev/sda):

  • sfdisk -d /dev/sdX
  • fdisk -l -u /dev/sdX

Das Beispiel hier zeigt ein System, das mit Ubuntu 10.04 installiert wurde. Der Installer von Ubuntu 10.04 hat dabei sowohl die primären, als auch die logischen Partitionen auf 1 MiB ausgerichtet. Dies erkennen Sie daran, dass Sie die Nummer des Start-Sektors der Partition durch 2048 dividieren können (2048 Sektoren * 512 Byte pro Sektor = 1.048.576 Bytes = 1 MiB). Die erweiterte Partition (in diesem Beispiel /dev/sda2) ist nicht auf 1 MiB ausgerichtet - dies ist allerdings auch nicht nötig, da diese nur als Container für die logischen Partitionen dient und die logischen Partitionen selbst schon auf 1 MiB ausgerichtet sind.

user@ubuntu-test:~$ sudo sfdisk -d /dev/sda
Warning: extended partition does not start at a cylinder boundary.
DOS and Linux will interpret the contents differently.
# partition table of /dev/sda
unit: sectors

/dev/sda1 : start=     2048, size= 39061504, Id=83, bootable
/dev/sda2 : start= 39065598, size=1761810434, Id= 5
/dev/sda3 : start=        0, size=        0, Id= 0
/dev/sda4 : start=        0, size=        0, Id= 0
/dev/sda5 : start= 39065600, size=  3997696, Id=82
/dev/sda6 : start= 43065344, size=1757810688, Id=83
user@ubuntu-test:~$ sudo fdisk -l -u /dev/sda

Disk /dev/sda: 1000.2 GB, 1000204886016 bytes
255 heads, 63 sectors/track, 121601 cylinders, total 1953525168 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: 0x000d8343

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048    39063551    19530752   83  Linux
/dev/sda2        39065598  1800876031   880905217    5  Extended
/dev/sda5        39065600    43063295     1998848   82  Linux swap / Solaris
/dev/sda6        43065344  1800876031   878905344   83  Linux
user@ubuntu-test:~$ 

LVM

Wenn Sie LVM verwenden, ist auch hier ein richtiges Alignment wichtig.

In der Regel sollte das Alignment aber automatisch passen. Ältere LVM Versionen führen ein Alignment auf 64KiB aus - somit ist der Beginn eines Physical Extents auch am Beginn einer Page der SSD. Ein Patch vom August 2010 sorgt nun für ein Alignment auf 1 MiB. Der Patch ist in LVM Version Version 2.02.73 - 18th August 2010 eingeflossen:

Software RAID

Ein Linux Software RAID hat in der Regel ein richtiges Alignment. Bei RAID Volumes mit dem der älteren Superblock Metadaten-Version 0.90 liegt der Superblock am hinteren Ende des Devices (in einem 64 KiB aligned Block), die RAID Daten beginnen am Anfang des Devices. Und Software RAID mit der neueren Superblock Metadaten-Version 1.* aligned die Daten auf 1 MiB (siehe Linux Software RAID - Alignment überprüfen).

Einzelnachweise

  1. http://www.ibm.com/developerworks/linux/library/l-4kb-sector-disks/#benchmarks
  2. Disk Partition Alignment Best Practices for SQL Server (msdn.microsoft.com, May 2009) In Windows Vista as well as Windows Server 2008, partition alignment is usually performed by default. The default for disks larger than 4 GB is 1 MB; the setting is configurable and is found in the registry at the following location: HKLM\SYSTEM\CurrentControlSet\Services\VDS\Alignment
  3. LUN Types and Linux partition alignment (blogs.netapp.com)
  4. Disk performance may be slower than expected when you use multiple disks in Windows Server 2003, in Windows XP, and in Windows 2000 (Microsoft KB)
  5. http://www.thinkpad-forum.de/software/linux/88045-umzug-von-hdd-zu-ssd-mit-minimalen-arbeitsaufwand/#post807878
  6. http://www.nuclex.org/blog/personal/80-aligning-an-ssd-on-linux
  7. http://www.ocztechnologyforum.com/forum/showthread.php?54379-Linux-Tips-tweaks-and-alignment&p=373224#post373224
  8. https://ata.wiki.kernel.org/index.php/ATA_4_KiB_sector_issues#L-2._Userspace_tools_status_.28thanks_to_Karel_Zak.5B13.5D.29
  9. http://karelzak.blogspot.com/2010/05/4096-byte-sector-hard-drives.html

Weitere Informationen


Autor: Werner Fischer


Share/Save/Bookmark  Feedback zu diesem Artikel geben