Jak sprawdzić wydajność dysku twardego

Odpowiedzi:

425

Metoda terminalowa

hdparm jest dobrym miejscem do rozpoczęcia.

sudo hdparm -Tt /dev/sda

/dev/sda:
Timing cached reads:   12540 MB in  2.00 seconds = 6277.67 MB/sec
Timing buffered disk reads: 234 MB in  3.00 seconds =  77.98 MB/sec

sudo hdparm -v /dev/sda poda również informacje.

dd poda informacje o prędkości zapisu.

Jeśli dysk nie ma systemu plików (i tylko wtedy ), użyj of=/dev/sda.

W przeciwnym razie zamontuj go na / tmp i napisz, a następnie usuń testowy plik wyjściowy.

dd if=/dev/zero of=/tmp/output bs=8k count=10k; rm -f /tmp/output

10240+0 records in
10240+0 records out
83886080 bytes (84 MB) copied, 1.08009 s, 77.7 MB/s

Metoda graficzna

  1. Przejdź do System -> Administracja -> Narzędzie dyskowe.
    • Alternatywnie uruchom narzędzie dyskowe Gnome z wiersza poleceń, uruchamiając gnome-disks
  2. Wybierz dysk twardy w lewym okienku.
  3. Teraz kliknij przycisk „Benchmark - Zmierz wydajność dysku” w prawym okienku.
  4. Otwiera się nowe okno z wykresami. Znajdziesz dwa przyciski. Jeden dotyczy „Rozpocznij test porównawczy tylko do odczytu”, a drugi to „Rozpocznij test porównawczy do odczytu / zapisu”. Kliknięcie dowolnego przycisku powoduje rozpoczęcie testowania dysku twardego.

test

Jak przeprowadzić testy porównawcze dysku I / O

Artykuł

Czy chcesz czegoś więcej?

Pantera
źródło
10
Polecam testowanie, /dev/urandoma także /dev/zerodane wejściowe do ddtestowania dysku SSD, ponieważ kompresja danych może mieć ogromny wpływ na szybkość zapisu.
Ian Mackinnon
3
Na moim Ubuntu 12.04 Unity nie ma takiego „Systemu ->”. A przynajmniej go nie znalazłem. I nie widzę tego narzędzia dyskowego ani w Ustawieniach systemu ... O_o Ale ostatecznie udało mi się go uruchomić: / usr / bin / palimpsest
Fran Marzoa
6
Zauważ, że od 12.10 nazywa się to po prostu Dyskami i można je znaleźć w Unity.
Paul Lammertsma
1
W Gnome zostało to przeniesione do Aplikacje -> Narzędzia systemowe -> Preferencje -> Narzędzie dyskowe. Dla tych, którzy nienawidzą Jedności.
Ken Sharp
2
System /tmpplików często używa ramdysku. Więc pisanie do /tmpwydaje się testować pamięć, a nie podsystem dyskowy.
Zoredache
99

Suominen ma rację, powinniśmy użyć pewnego rodzaju synchronizacji; ale istnieje prostsza metoda, conv = fdatasync wykona zadanie:

dd if=/dev/zero of=/tmp/output conv=fdatasync bs=384k count=1k; rm -f /tmp/output
1024+0records in
1024+0 records out
402653184 bytes (403 MB) copied, 3.19232 s, 126 MB/s
Tele
źródło
28
To odpowiedź przy użyciu innego polecenia / opcji niż inne. Widzę, że jest to odpowiedź godna własnego postu.
Alaa Ali,
2
Dlaczego użyłeś 384k jako rozmiaru bloku?
Diego F. Durán
1
@Diego Nie ma powodu. To był tylko przykład. Możesz użyć wszystkiego innego. (od około 4k ... 1M) Oczywiście większy rozmiar bloku zapewni lepszą wydajność. I oczywiście zmniejsz liczbę zliczeń, gdy używasz dużych bs, albo zajmie to rok.
Tele
nie jest wiarygodny, ponieważ narzędzia wzorcowe, takie jak iozone i sysbench, są znacznie niższe
MSS
1
Zachowaj ostrożność, używając zer do zapisywania danych - niektóre systemy plików i dyski będą miały dla tego specjalną ścieżkę (i inne dane podlegające kompresji), co spowoduje sztucznie wysokie liczby testów ...
Anon
50

Nie zalecałbym używania, /dev/urandomponieważ jest oparty na oprogramowaniu i powolny jak świnia. Lepiej wziąć część losowych danych na ramdysku. Na dysku twardym testowanie losowe nie ma znaczenia, ponieważ każdy bajt jest zapisywany tak, jak jest (również na ssd z dd). Ale jeśli przetestujemy deduplikowaną pulę ZFS przy użyciu czystego zera lub danych losowych, istnieje ogromna różnica wydajności.

Innym punktem widzenia musi być uwzględnienie czasu synchronizacji; wszystkie nowoczesne systemy plików używają buforowania podczas operacji na plikach.

Aby naprawdę zmierzyć szybkość dysku, a nie pamięć, musimy zsynchronizować system plików, aby pozbyć się efektu buforowania. Można to łatwo zrobić:

time sh -c "dd if=/dev/zero of=testfile bs=100k count=1k && sync"

tą metodą otrzymujesz dane wyjściowe:

sync ; time sh -c "dd if=/dev/zero of=testfile bs=100k count=1k  && sync" ; rm testfile 
1024+0 records in
1024+0 records out
104857600 bytes (105 MB) copied, 0.270684 s, 387 MB/s

real    0m0.441s
user    0m0.004s
sys 0m0.124s

więc dane na dysku wynoszą tylko 104857600 / 0,441 = 237772335 B / s -> 237 MB / s

To ponad 100 MB / s mniej niż w przypadku buforowania.

Szczęśliwego testu porównawczego,

Pasi Suominen
źródło
3
Zachowaj ostrożność, używając zer do zapisywania danych - niektóre dyski (takie jak dyski SSD) i niektóre systemy plików będą miały do ​​tego specjalną ścieżkę. Powoduje to sztucznie wysokie liczby testów porównawczych przy użyciu buforów zerowych. Inne wysoce ściśliwe wzorce danych mogą również zniekształcać wyniki ...
Anon,
36

Jeśli chcesz monitorować prędkość odczytu i zapisu dysku w czasie rzeczywistym, możesz użyć narzędzia iotop .

Jest to przydatne, aby uzyskać dokładne informacje o wydajności dysku dla określonej aplikacji lub zadania. Dane wyjściowe pokażą Ci szybkość odczytu / zapisu na proces oraz całkowitą prędkość odczytu / zapisu dla serwera, bardzo podobną do top.

Aby zainstalować iotop:

sudo apt-get install iotop  

Aby uruchomić:

sudo iotop
Lars
źródło
28

Jeśli chcesz dokładności, powinieneś użyć fio. Wymaga przeczytania instrukcji ( man fio), ale da dokładne wyniki. Pamiętaj, że dla dowolnej dokładności musisz dokładnie określić, co chcesz zmierzyć. Kilka przykładów:

Sekwencyjna prędkość odczytu z dużymi blokami (powinna być zbliżona do liczby podanej w specyfikacjach napędu):

fio --name TEST --eta-newline=5s --filename=fio-tempfile.dat --rw=read --size=500m --io_size=10g --blocksize=1024k --ioengine=libaio --fsync=10000 --iodepth=32 --direct=1 --numjobs=1 --runtime=60 --group_reporting

Sekwencyjna prędkość zapisu z dużymi blokami (powinna być zbliżona do liczby podanej w specyfikacjach napędu):

fio --name TEST --eta-newline=5s --filename=fio-tempfile.dat --rw=write --size=500m --io_size=10g --blocksize=1024k --ioengine=libaio --fsync=10000 --iodepth=32 --direct=1 --numjobs=1 --runtime=60 --group_reporting

Losowy odczyt 4K QD1 (jest to liczba, która naprawdę ma znaczenie dla rzeczywistej wydajności, chyba że wiesz na pewno):

fio --name TEST --eta-newline=5s --filename=fio-tempfile.dat --rw=randread --size=500m --io_size=10g --blocksize=4k --ioengine=libaio --fsync=1 --iodepth=1 --direct=1 --numjobs=1 --runtime=60 --group_reporting

Mieszane losowe odczytywanie i zapisywanie QD1 4K z synchronizacją (jest to najgorszy numer, jakiego można się spodziewać po dysku, zwykle mniej niż 1% liczb wymienionych w specyfikacji):

fio --name TEST --eta-newline=5s --filename=fio-tempfile.dat --rw=randrw --size=500m --io_size=10g --blocksize=4k --ioengine=libaio --fsync=1 --iodepth=1 --direct=1 --numjobs=1 --runtime=60 --group_reporting

Zwiększ --sizeargument, aby zwiększyć rozmiar pliku. Korzystanie z większych plików może zmniejszyć liczbę otrzymywanych danych w zależności od technologii napędu i oprogramowania układowego. Małe pliki dadzą „zbyt dobre” wyniki dla nośników rotacyjnych, ponieważ głowica odczytu nie musi się tak bardzo ruszać. Jeśli Twoje urządzenie jest prawie puste, użycie pliku wystarczająco dużego, aby prawie zapełnić dysk, zapewni najgorsze zachowanie przy każdym teście. W przypadku dysku SSD rozmiar pliku nie ma tak dużego znaczenia.

Należy jednak pamiętać, że w przypadku niektórych nośników pamięci rozmiar pliku nie jest tak ważny, jak całkowita liczba bajtów zapisanych w krótkim okresie czasu. Na przykład niektóre dyski SSD mogą mieć znacznie wyższą wydajność z wstępnie usuniętymi blokami lub mogą mieć mały obszar pamięci flash SLC, który jest używany jako pamięć podręczna zapisu, a wydajność zmienia się po zapełnieniu pamięci podręcznej SLC. Jako kolejny przykład dyski twarde SMR Seagate mają około 20 GB pamięci podręcznej PMR, która ma dość wysoką wydajność, ale gdy się zapełni, pisanie bezpośrednio do obszaru SMR może obniżyć wydajność do 10% w stosunku do oryginału. A jedynym sposobem na zobaczenie tego spadku wydajności jest jak najszybsze zapisanie ponad 20 GB. Oczywiście wszystko to zależy od obciążenia: jeśli dostęp do zapisu jest obciążony dużymi opóźnieniami, które pozwalają urządzeniu wyczyścić pamięć podręczną, krótsze sekwencje testowe lepiej odzwierciedlą Twoją rzeczywistą wydajność. Jeśli musisz zrobić dużo IO, musisz zwiększyć oba--io_sizei --runtimeparametry. Należy pamiętać, że niektóre media (np. Większość urządzeń flash) ulegną dodatkowemu zużyciu podczas takich testów. Moim zdaniem, jeśli jakieś urządzenie jest wystarczająco słabe, aby nie poradzić sobie z tego rodzaju testowaniem, w żadnym wypadku nie powinno być używane do przechowywania cennych danych.

Ponadto niektóre wysokiej jakości urządzenia SSD mogą mieć jeszcze bardziej inteligentne algorytmy wyrównywania zużycia, w których wewnętrzna pamięć podręczna SLC ma wystarczającą liczbę inteligentnych danych, aby zastąpić dane, które są ponownie zapisywane podczas testu, jeśli trafią w tę samą przestrzeń adresową (to znaczy plik testowy jest mniejsza niż całkowita pamięć podręczna SLC). W przypadku takich urządzeń rozmiar pliku zaczyna znów mieć znaczenie. Jeśli potrzebujesz rzeczywistego obciążenia, najlepiej przetestować z rozmiarami plików, które zobaczysz w rzeczywistości. W przeciwnym razie Twoje liczby mogą wyglądać zbyt dobrze.

Uwaga: fioprzy pierwszym uruchomieniu utworzy wymagany plik tymczasowy. Zostaną wypełnione losowymi danymi, aby uniknąć uzyskiwania zbyt dobrych liczb z urządzeń, które oszukują, kompresując dane przed zapisaniem ich w pamięci trwałej. Plik tymczasowy zostanie wywołany fio-tempfile.datw powyższych przykładach i zapisany w bieżącym katalogu roboczym. Dlatego najpierw należy przejść do katalogu zamontowanego na urządzeniu, które chcesz przetestować.

Jeśli masz dobry dysk SSD i chcesz zobaczyć jeszcze wyższe liczby, zwiększ --numjobspowyżej. To określa współbieżność odczytów i zapisów. Wszystkie powyższe przykłady zostały numjobsustawione na, 1więc test dotyczy odczytu i zapisu procesu jednowątkowego (być może z zestawem kolejek z iodepth). Dyski SSD klasy wyższej (np. Intel Optane) powinny uzyskiwać wysokie liczby, nawet bez numjobsznacznego wzrostu (np. 4Powinny wystarczyć, aby uzyskać najwyższe liczby specyfikacji), ale niektóre dyski SSD „Enterprise” wymagają 32- 128aby uzyskać numery specyfikacji, ponieważ ich wewnętrzne opóźnienie urządzenia są wyższe, ale ogólna przepustowość jest szalona.

Mikko Rantalainen
źródło
1
Właśnie przetestowałem niektóre urządzenia. Używając powyższego sekwencyjnego testu odczytu (rozmiar bloku 2 MB), otrzymałem 280 MB / s z Samsung SSD 850 EVO i 1070 MB / s z Intel 910 SSD. Przy wielkości bloku 64k i w przeciwnym razie identycznym wierszu poleceń mam 268 MB / s z 850 EVO i 1055 MB / s z 910 SSD. Przynajmniej dla tego rodzaju urządzeń użycie bloku o wielkości 2 MB wydaje się poprawiać wyniki o około 1-5%, chociaż powoduje, że jądro dzieli żądania na sprzęt. Wydaje mi się, że nawet przy optymalizacji jądra obciążenie związane z przesyłaniem większej liczby wywołań systemowych jest gorsze niż dzielenie się wewnątrz jądra.
Mikko Rantalainen
1
Po dalszych testach wydaje się, że uzyskuję najwyższą przepustowość sekwencyjną przy użyciu mocy o wartości 2, która jest mniejsza niż max_sectors_kb. Zmieniłem powyższe przykładowe polecenia, aby użyć rozmiaru bloku 1 MB, ponieważ wydaje się, że działa to na sprzęcie ze świata rzeczywistego. Testowałem też, że fsyncnie ma to znaczenia przy czytaniu.
Mikko Rantalainen
1
W zależności od sposobu podłączenia napędu może się okazać, że twój jododth był zbyt niski. Będziesz musiał obserwować, co Linux wysyła do urządzenia i na jakiej głębokości robi to w ...
Anon
1
Ustawić iodepthsię 1na swobodnym dostępie dokładnie ponieważ programy prawdziwym świecie często uruchamiać algorytmy / logiki, który nie działa z głębi każdy wyższy niż 1. W rezultacie, jeśli taka głębokość jest „zbyt niskie” urządzenie I / O jest źle. Prawdą jest, że niektóre urządzenia SSD skorzystają z głębokości większej niż 32. Czy możesz jednak wskazać na obciążenie pracą w świecie rzeczywistym, które wymaga dostępu do odczytu i jest w stanie utrzymać jododth większy niż 32? TL; DR: jeśli chcesz odtworzyć niesamowicie wysoką liczbę odczytów testu porównawczego z urządzeniem o dużym opóźnieniu, użyj, iodepth=256 --numjobs=4ale nigdy nie oczekuj, że zobaczysz takie liczby w rzeczywistości.
Mikko Rantalainen,
1
Większość programów „w świecie rzeczywistym” nie przesyła bezpośrednio We / Wy (o_) bezpośrednio, a tym bardziej asynchronicznie, więc wszystkie nasze przykłady obciążają obszar testowy limitami (jak mówią, najlepszym testem jest twoje rzeczywiste obciążenie). Powiedziawszy, że wykonywanie takich czynności, jak uruchamianie wielu zajętych maszyn wirtualnych, jest w stanie z łatwością generować obciążenia z szalonymi wysokimi głębokościami, ale gdzie operacje we / wy często wyglądają losowo z perspektywy dysku i jest to prosty przykład, w którym można zobaczyć ogromne przyspieszenie z takich rzeczy, jak NVMe. PS: ustawienie zbyt wysokich liczb zmniejszy przepustowość, więc jest słaby punkt ...
Anon
25

bonnie ++ to najlepsze narzędzie testowe, jakie znam dla systemu Linux.

(Obecnie przygotowuję plik Linux na żywo w pracy z bonnie ++ na nim, aby przetestować na nim naszą maszynę z systemem Windows!)

Zajmuje się buforowaniem, synchronizacją, losowymi danymi, losową lokalizacją na dysku, małymi rozmiarami aktualizacji, dużymi aktualizacjami, odczytami, zapisami itp. Porównywanie klucza usb, dysku twardego (obrotowego), dysku SSD i napędu RAM system plików może być bardzo pouczający dla początkującego.

Nie mam pojęcia, czy jest zawarty w Ubuntu, ale możesz go łatwo skompilować ze źródła.

http://www.coker.com.au/bonnie++/

Corto
źródło
Bonnie ma wady w testowaniu dysków i może z łatwością generować liczby, które faktycznie odzwierciedlają inne niż dyskowe aspekty twojego systemu, więc wymagana jest duża ostrożność, jeśli zdecydujesz się go użyć. Aby uzyskać szczegółowe informacje, zobacz Aktywny test porównawczy Brendana Gregga: Bonnie ++ .
Anon
22

Szybkość pisania

$ dd if=/dev/zero of=./largefile bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 4.82364 s, 223 MB/s

Rozmiar bloku jest w rzeczywistości dość duży. Możesz spróbować z mniejszymi rozmiarami, takimi jak 64k, a nawet 4k.


Czytaj prędkość

Uruchom następujące polecenie, aby wyczyścić pamięć podręczną

$ sudo sh -c "sync && echo 3 > /proc/sys/vm/drop_caches"

Teraz przeczytaj plik, który został utworzony w teście zapisu:

$ dd if=./largefile of=/dev/null bs=4k
165118+0 records in
165118+0 records out
676323328 bytes (676 MB) copied, 3.0114 s, 225 MB/s
Limon Monte
źródło
Zachowaj ostrożność, używając zer do zapisywania danych - niektóre systemy plików i dyski będą miały dla niego specjalną ścieżkę (i inne dane podlegające kompresji), co spowoduje sztucznie wysokie liczby testów ...
Anon
14

kilka wskazówek, jak korzystać z Bonnie ++

bonnie++ -d [TEST_LOCATION] -s [TEST_SIZE] -n 0 -m [TEST_NAME] -f -b -u [TEST_USER] 
bonnie++ -d /tmp -s 4G -n 0 -m TEST -f -b -u james

Trochę więcej na: SIMPLE BONNIE ++ PRZYKŁAD .

nyxee
źródło