Test wydajności I/O programem dd w Linuksie
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:~ #