Test wydajności I/O programem dd w Linuksie

Z Thomas-Krenn-Wiki
Przejdź do nawigacji Przejdź do wyszukiwania

Polecenie dd może zostać w Linuksie wykorzystane do prostego pomiaru wydajności I/O. Ten artykuł zawiera cenne informacje, które parametry powinny przy tym zostać zastosowane.

Podstawy

dd może zostać wykorzystane do prostego kopiowania danych w warstwie niskiego poziomu (low-level)[1]. Często jest to bezpośredni dostęp do plików urządzenia. W trakcie uzyskiwania dostępu nie występują żadne dalsze zapytania co w przypadku błędnego zastosowania polecenia dd może szybko doprowadzić do utraty danych. Koniecznie zalecamy uprzednie przeprowadzenie opisanej tu procedury w środowisku testowym. Błędne zastosowanie polecenia dd grozi utratą danych!

Pomiar wydajności zapisu

Normalny zapis danych nie jest w nowoczesnych systemach operacyjnych bezpośrednio przeprowadzany w systemach RAID bądź dyskach twardych. Niewykorzystywana pamięć RAM jest wykorzystywana jako cache zapisu i odczytu (vide Cache systemu operacyjnego).

Aby wspomniany cache (pamięć RAM) nie miał wpływu na wynik pomiaru wydajności I/O może zostać użyty parametr oflag. Przy czym iteresujące są obie FLAGs (szczegóły dd --help i 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)

Do pomiaru wydajności zapisu dane do zapisu najlepiej pozyskiwać z /dev/zero[2] i zapisywać na pustym volumenie RAID lub pustym dysku bądź partycji (np. przez of=/dev/sda na pierwszym dysku lub of=/dev/sda2 na drugiej partycji pierwszego dysku). W przypadku kiedy nie jest to możliwe jako alternatywę można zapisać dane w normalnym pliku w systemie (np. przez of=/root/testdatei1GB). Osiągnięty w ten sposób wynik pomiaru jest nieco niższy (przez zapis metadanych w systemie plików).

Ważne: Jeżeli dane są zapisywane na device (np. /dev/sda) zawarte na min dane ulegną utracie! Dlatego zalecane jest stosowanie tylko pustych volumenów RAID/dysków/partycji.

Wskazówka:

  • Przy zastosowaniu if=/dev/zero i bs=1G system Linuks wymaga 1GB wolnej pamięci RAM. W przypadku gdy system testowy nie posiada wystarczajacej ilości wolnej pamięci to należy użyć mniejszego parametru bs (np. 512MB).
  • W celu uzyskania rezultatów, które najbardziej odpowiadają praktyce zalecamy przeprowadzenie testu zapisu kilkakrotnie (np. 3 do 10x). W ten sposób możliwe jest rozpoznanie elementu odstającego. Wyniki takie mogą być spowodowane przez Cronjobs, Interrupts lub ogólnie przez równoległe działające procesy, które mogą krótkotrwale powodować spadek wydajności.

Przykład laptop

W tym przykładzie pliki testowe zapisywane są w /dev/sda2. System testowy (Thinkpad T43 Type 2668-4GG) z 1,5 GByte RAM i dyskiem Fujitsu MHT2060AH 5400 obr/min.

Przepustowość laptop (streaming I/O)

W tym teście zapisywany jest 1 GB. Wpierw z aktywnym cachem (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 ~ # 

Z wyłączonym cachem (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 ~ # 

Opóźnienia laptop

W tym teście zapisywane jest 1.000 x 512 Byte. Wpierw z aktywnym cachem (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 ~ #

Z wyłączonym cachem (hdparm -W0 /dev/sda). 1000-krotne uzyskania dostępu wymaga 11,18 sekund, co oznacza jedna próba 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 ~ # 

Przykład serwer z macierzą RAID10

W tym przykładzie pliki testowe zapisywane są na pustej partycji. System testowy to serwer 2U Intel dual CPU SC823 z 6 dyskami 147 GB SAS Fujitsu MBA3147RC (15000 obr/min) i kontrolerem Adaptec 5805 z aktywnym cachem i BBU.

Przepustowość serwer (Streaming I/O)

W teście zapisywany jest 1 GB:

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:~ 

Opóźnienia serwer

W tym teście zapisywane jest 1.000 x 512 Byte. Pomiar wykazał odpowiednio 0,084 sekund dla 1000 dostępów co daje dokładnie 0,084 ms dla jednego. Wartość ta jest tak niewielka z powodu na aktywny cache kontrolera:

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:~ #

Referencje

Powiązane artykuły

Konfiguracja podstawowa multipathing-u z EMC iSCSI AX4-5i pod SLES10 SP2
Określenie zużycia miejsca z konsoli przez df i du na zamontowanych partycjach w Linuksie
Program Mcelog