Ostatnio pisałem o macierzach i dotknąłem tematu ich wydajności. No właśnie, wydajność podsystemu dyskowego. Czy to naprawdę takie ważne? Niezależnie od tego, czy mamy do czynienia z wieloprocesorowym serwerem z terabajtami przestrzeni dyskowej, czy ze zwykłym domowym pecetem z jednym dyskiem SATA, zawsze „coś” jest najwolniejszym elementem całości. I często są to właśnie dyski. Warto więc mieć chociaż ogólne pojęcie co moglibyśmy zyskać po wymianie/modernizacji/rozbudowie tego elementu systemu i jak nasze obecne rozwiązanie wypada w porównaniu z innymi.
Jak więc zmierzyć wydajność naszych dysków? Przede wszystkich dobrze by było zdefiniować, co tak naprawdę chcemy zmierzyć. Nie ma bowiem pojedynczej liczby, która mogłaby nam powiedzieć, które z rozwiązań jest szybsze. Istnieje szereg czynników i parametrów, które należy wziąć pod uwagę przy wyborze konkretnego rozwiązania, a których „waga” jest różna w zależności od przeznaczenia budowanego systemu. Jednak w „domowych warunkach” najczęściej dla dysków określa się dwie pary parametrów (wyrażane w megabajtach na sekundę):
– odczyt i zapis sekwencyjny (ang. sequential read/sequential write) – maksymalna szybkość danego rozwiązania (fizycznego dysku, macierzy, zasobu zdalnego) przy ciągłym odczycie lub zapisie pojedynczego strumienia danych. W wolnym tłumaczeniu: jak szybko system jest w stanie przeczytać lub zapisać jeden duży plik.
– odczyt i zapis swobodny (ang. random read/random write) – w tym wypadku jest trochę mniej jednoznacznie, bo spotkałem się z różnymi definicjami, ale najczęściej określa się to jako dużą ilość małych operacji dyskowych. Najlepszym przykładem jest to, co robi twardy dysk w domowym komputerze podczas normalnej pracy – zapisywanie logów systemowych w jedno miejsce, zapisywanie cookies ze stron internetowych w inne, w międzyczasie autozapis otwartego dokumentu Worda i jeszcze – w miarę szybkości połączenia z Siecią – zapisywanie ściąganego właśnie filmu (oczywiście na wolnej licencji :-)). Jeżeli takie obciążenie ma służyć do pomiarów wydajności, to wszystkie te operacje muszą być oczywiście powtarzalne, więc lepiej posłużyć się specjalnie napisanym do tego celu oprogramowaniem, niż za każdym razem powtarzać te same czynności ;-).
W mowie obcej ładnie jest to wszystko opisane na stronie Microsoftowego TechNetu, o TUTAJ.
Ale dlaczego w ogóle rozgraniczać wydajność przy odczycie/zapisie sekwencyjnym od tej „poszatkowanej”? Ano dlatego, że w zależności od zastosowań ważne są raz jedne, a raz drugie wskaźniki. To, że dla dysków systemowych bardziej wartościowa jest druga grupa parametrów, już napisałem. A ta pierwsza? Choćby dla dysków przechowujących kopie zapasowe ważnych i dużych objętościowo danych lub dla systemów obrabiających duże pliki – graficzne lub wideo. Takie dane zazwyczaj zapisuje i odczytuje się na dyskach liniowo, więc nie ma sensu kombinować, aby osiągnąć jak najmniejszy seek time (nie wiem, jak to przetłumaczyć na polski), za to warto się skupić na wydajności przy dostępie sekwencyjnym.
No dobra, to czym to w końcu można zmierzyć?
Może tym razem zacznijmy od systemów z rodziny Windows:
– Crystal Disk Mark – bardzo prosty w obsłudze program, który dla wskazanego napędu wykona kilka testów. Użycie programu jest naprawdę banalne – wystarczy wybrać interesujący nas napęd, wielkość danych, na których chcemy przeprowadzić testy oraz ilość powtórzeń. Całą reszta zrobi się sama, a my dostaniemy wypełnione zmierzonymi wartościami okienko.
– ATTO Disk Benchmark – program równie prosty w obsłudze, co Crystal Disk Mark, jednak wykonujący tylko jeden jest, ale na paczkach danych o różnej wielkości. Osobiście do „szybkich” testów porównawczych stosuję właśnie to narzędzie.
A co pod Linuksa?
Tutaj jest jednocześnie lepiej i gorzej :-) Lepiej, bo mamy bardzo dużo programów, za pomocą których możemy zmierzyć przeróżne parametry naszego dysku. Gorzej, bo rozwiązania stosują odmienne metodologie i ciężko jest porównywać wyniki między nimi. Ale po kolei…
– dd – Najprostszym sposobem na zmierzenie wydajności przy operacjach sekwencyjnych jest użycie narzędzia dd, na przykład tak:
[kbechler@flame ~]$ sudo dd if=/dev/sda of=/dev/null bs=1024k count=4k
4096+0 records in
4096+0 records out
4294967296 bytes (4.3 GB) copied, 100.358 seconds, 42.8 MB/s
Tutaj jednak warto zwrócić uwagę na dwie rzeczy:
– Rozmiar czytanych lub zapisywanych danych powinien być większy, niż ilość zainstalowanej w systemie pamięci, co zabezpieczy nas przed zaburzeniem wyników poprzez systemowy cache.
– Warto pamiętać, że Linux ma zaimplementowane różne rodzaje „wspomagaczy”, które mają na celu przyspieszenie komunikacji z dyskami, a które trochę przeszkadzają przy testowaniu szybkości sprzętu. Jeżeli zależy nam na porównaniu wyników z innymi komputerami lub serwerami, to warto przeczytać chociażby to i pamiętać, że bez zastosowania dodatkowych parametrów badamy tak naprawdę wydajność całego systemu, a nie samych dysków.
– hdparm – tak właściwie, to hdparm nie jest programem przeznaczonym do określania wydajności urządzeń blokowych, jednak jest do tego całkiem często wykorzystywany. Używamy tutaj tylko jednej opcji, a wynik wygląda tak:
[kbechler@flame ~]$ sudo /sbin/hdparm -t /dev/sda
/dev/sda:
Timing buffered disk reads: 130 MB in 3.04 seconds = 42.70 MB/sec
– bonnie++ – jeden z najpopularniejszych programów do testowania wydajności dysków. Ilość opcji tego programu może na początek przerazić, jednak da się to szybko opanować, jeżeli wiemy, co chcemy osiągnąć. Ja najczęściej robię coś takiego (niestety, test na innym systemie, więc ciężko porównać do wyników powyżej):
[root@lupus s]# bonnie++ -d /mnt/sdb1/konrad -s 16g -f -b -u kbechler
Using uid:500, gid:500.
Writing intelligently...done
Rewriting...done
Reading intelligently...done
start 'em...done...done...done...done...done...
Create files in sequential order...done.
Stat files in sequential order...done.
Delete files in sequential order...done.
Create files in random order...done.
Stat files in random order...done.
Delete files in random order...done.
Version 1.96 ------Sequential Output------ --Sequential Input- --Random-
Concurrency 1 -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Machine Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP /sec %CP
lupus.itbt.eu 16G 37734 15 21668 7 58415 7 153.1 8
Latency 3037ms 42961ms 184ms 163ms
Version 1.96 ------Sequential Create------ --------Random Create--------
lupus.itbt.eu -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
files /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP
16 78 0 +++++ +++ 78 0 79 0 +++++ +++ 78 0
Latency 521ms 1235us 167ms 79465us 46us 150ms
1.96,1.96,lupus.itbt.eu,1,1353399513,16G,,,,37734,15,21668,7,,,58415,7,153.1,8,16,,,,,78,0,+++++,+++,78,0,79,0,+++++,+++,78,0,,3037ms,42961ms,,184ms,163ms,521ms,1235us,167ms,79465us,46us,150ms
[root@lupus s]#
Na koniec jeszcze zestawienie narzędzi do robienia testów wydajności dysków, jakie znalazłem w Sieci. Może ktoś znajdzie coś dla siebie.