Linux I/O Performance Tests mit dd

Aus Thomas-Krenn-Wiki
Wechseln zu: Navigation, Suche

Unter Linux kann das dd Kommando für einfache sequentielle I/O Performance-Messungen verwendet werden. Dieser Artikel liefert wertvolle Informationen welche Parameter dabei benützt werden sollen. Für detailliertere Tests sowie Tests mit zufälligen I/O Zugriffen eignet sich der Flexible I/O Tester (Fio).

Grundlagen

dd kann für das einfache Kopieren von Daten auf low-level Ebene verwendet werden.[1] Dabei wird oft direkt auf Devicefiles zugegriffen. 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/testfile) schreiben. Die folgenden Beispiele verwenden ein Testdatei, um irrtümlichen Datenverlust zu vermeiden. 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 /root/testfile 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=/root/testfile 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=/root/testfile 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=/root/testfile 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=/root/testfile 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=/root/testfile 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=/root/testfile 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. Dd (Unix) (en.wikipedia.org)
  2. /dev/zero (en.wikipedia.org)


Foto Werner Fischer.jpg

Autor: Werner Fischer

Werner Fischer, tätig im Bereich Communications / Knowledge Transfer bei Thomas-Krenn, hat sein Studium zu Computer- und Mediensicherheit an der FH Hagenberg abgeschlossen. Er ist regelmäßig Autor in Fachzeitschriften und Speaker bei Konferenzen wie LinuxCon, OSDC, OSMC, LinuxTag u.v.m. Seine Freizeit gestaltet er sehr abwechslungsreich. In einem Moment absolviert er seinen Abschluss im Klavierspielen, im anderen läuft er beim Linzmarathon in der Staffel mit oder interessiert sich für OpenStreetMap.


Das könnte Sie auch interessieren

Apache gegen Denial-of-Service schützen
Daten mit rsync unter Linux synchronisieren
Linux Performance Auswertung mit kSar