06Mai

Festplattendurchsatz messen unter Linux



Unter Linux kann das dd Kommando für einfache I/O Performance-Messungen verwendet werden. Dieser Artikel liefert wertvolle Informationen welche Parameter dabei benützt werden sollen.

Grundlagen

dd kann für das einfache Kopieren von Daten auf low-level Ebene verwendet werden[1]. Dabei wird oft direkt auf Devicefiles zugegriffen. Da beim Zugriff keine weiteren Abfragen kommen, kann die fehlerhafte Verwendung von dd schnell zu einem Datenverlust führen. Wir empfehlen unbedingt die beschriebenen Schritte zuvor auf Testsystemen durchzuführen. Bei einer fehlerhaften Anwendung von dd droht Datenverlust!

 

Messung der Schreibperformance

Normale Schreibzugriffe auf Dateien werden von modernen Betriebssystemen nicht unmittelbar auf das RAID-System bzw. die Festplatte durchgeführt. Ungenützter Arbeitsspeicher wird als Cache für Schreib- und Lesezugriffe verwendet (siehe dazu auch Cache im Betriebssystem).

Damit I/O Performance-Messungen nicht durch diesen Cache (Arbeitsspeicher) beeinflußt werden, kann der oflag Parameter verwendet werden. Dabei sind folgende beiden FLAGs interessant (Details siehe dd --help sowie Dd mit direct oder synchronized I/O):

  • direct (use direct I/O for data)
  • dsync (use synchronized I/O for data)
  • sync (likewise, but also for metadata)

Zum Messen der Schreibperformance liest man die zu Schreibenden Daten am besten aus /dev/zero[2] und schreibt diese idealerweise auf ein leeres RAID-Volume oder eine leere Festplatte bzw. Partition (z.B. mit of=/dev/sda für die erste Festplatte oder of=/dev/sda2 für die zweite Parition auf der ersten Festplatte) . Falls dies nicht möglich ist, kann man alternativ auch in eine normale Datei im Filesystem (z.B. mit of=/root/testdatei1GB) schreiben. Die dabei erzielbare Schreibperformance ist etwas geringer (da dadurch auch Metadaten im Filesystem geschrieben werden).

Wichtig: Wenn Sie auf ein Device schreiben (z.B. /dev/sda) gehen die darin enthalten Daten verloren! Verwenden Sie daher nur leere RAID-Volumes/Festplatten/Partitionen.

Hinweise:

  • Bei Verwendung von if=/dev/zero und bs=1G benötigt das Linuxsystem 1GB freien Platz im RAM. Falls Ihr Testsystem nicht ausreichend RAM zur Verfügung hat, verwenden Sie einen kleineren bs Parameter (z.B. 512MB).
  • Um praxisnahe Ergebnisse zu erhalten empfehlen wir die beschrieben Tests mehrmals (z.B. 3 bis 10x) durchzuführen. Damit können Sie Ausreißer rechtzeitig erkennen. Zu solchen Ausreißern kann es etwa durch Cronjobs, Interrupts oder allgemein durch parallel laufende Prozesse kommen, die kurzzeitig die Performance beeinflussen. Ein Extrembeispiel, das diesen Sachverhalt verdeutlicht, wäre etwa die parallele Ausführung von updatedb durch einen Cronjob.

Beispiel Laptop

In diesem Beispiel werden die Test-Daten nach /dev/sda2 geschrieben. Das Testsystem (ein Thinkpad T43 Type 2668-4GG) verfügt über 1,5 GByte RAM und eine Fujitsu MHT2060AH Festplatte mit 5400 upm.

Laptop Durchsatz (Streaming I/O)

Für den Test werden 1 GB geschrieben. Zuerst mit aktiviertem Cache (hdparm -W1 /dev/sda):

root@grml ~ # dd if=/dev/zero of=/dev/sda2 bs=1G count=1 oflag=direct
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB) copied, 32.474 s, 33.1 MB/s
root@grml ~ # 

Und mit deaktiviertem Cache (hdparm -W0 /dev/sda):

root@grml ~ # dd if=/dev/zero of=/dev/sda2 bs=1G count=1 oflag=direct    
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB) copied, 123.37 s, 8.7 MB/s
root@grml ~ # 

Laptop Latenz

In diesem Test werden 1.000 Mal 512 Byte geschrieben. Zuerst mit aktiviertem Cache (hdparm -W1 /dev/sda):

root@grml ~ # dd if=/dev/zero of=/dev/sda2 bs=512 count=1000 oflag=direct
1000+0 records in
1000+0 records out
512000 bytes (512 kB) copied, 0.36084 s, 1.4 MB/s
root@grml ~ #

Und mit deaktiviertem Cache (hdparm -W0 /dev/sda). 1000 Zugriffe benötigen 11,18 Sekunden, d.h. ein Zugriff benötigt 11,18 ms.

root@grml ~ # dd if=/dev/zero of=/dev/sda2 bs=512 count=1000 oflag=direct
1000+0 records in
1000+0 records out
512000 bytes (512 kB) copied, 11.1865 s, 45.8 kB/s
root@grml ~ # 

Beispiel Server mit RAID10

In diesem Beispiel werden die Test-Daten in eine leere Partition geschrieben. Beim Testsystem handelt es sich um einen 2HE Intel Dual-CPU SC823 Server mit 6 Stück 147 GB SAS Fujitsu MBA3147RC (15000 U/min) Festplatten und einem Adaptec 5805 RAID-Controller mit aktiviertem Cache und BBU.

Server Durchsatz (Streaming I/O)

Für den Test wird 1 GB geschrieben:

test-sles10sp2:~ # dd if=/dev/zero of=/dev/sda6 bs=1G count=1 oflag=dsync
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB) copied, 5.11273 seconds, 210 MB/s
test-sles10sp2:~ 

Server Latenz

In diesem Test werden 1.000 Mal 512 Byte geschrieben. Damit entsprechen die gemessenen 0,084 Sekunden für 1000 Zugriffe genau 0,084 ms für einen Zugriff. Dieser Wert ist aufgrund des Caches des RAID-Controllers so gering:

test-sles10sp2:~ # dd if=/dev/zero of=/dev/sda6 bs=512 count=1000 oflag=dsync
1000+0 records in
1000+0 records out
512000 bytes (512 kB) copied, 0.083902 seconds, 6.1 MB/s
test-sles10sp2:~ #

Referenzen

  1. http://en.wikipedia.org/wiki/Dd_(Unix)
  2. http://en.wikipedia.org/wiki//dev/zero

Written by tegknet|de, Posted in Linux

About the Author

 


Info´s

template-joomspirit