Як можна порівняти свій жорсткий диск?


51

Я бачив команди, щоб орієнтувати свій жорсткий диск на зразок цієї, використовуючи dd:

$ time sh -c "dd if=/dev/zero of=ddfile bs=8k count=250000 && sync"

Чи є кращі методи для цього, ніж це?


Відповіді:


62

Я зазвичай використовую hdparmдля порівняння своїх жорстких дисків. Ви можете орієнтувати як прямі читання, так і кешовані. Вам потрібно буде запустити команди кілька разів, щоб встановити середнє значення.

Приклади

Ось пряме читання.

$ sudo hdparm -t /dev/sda2

/dev/sda2:
 Timing buffered disk reads: 302 MB in  3.00 seconds = 100.58 MB/sec

І ось прочитане кешоване прочитання.

$ sudo hdparm -T /dev/sda2

/dev/sda2:
 Timing cached reads:   4636 MB in  2.00 seconds = 2318.89 MB/sec

Деталі

-t     Perform  timings  of  device reads for benchmark and comparison 
       purposes.  For meaningful results, this operation should be repeated
       2-3 times on an otherwise inactive system (no other active processes) 
       with at least a couple of megabytes of free memory.  This displays  
       the  speed of reading through the buffer cache to the disk without 
       any prior caching of data.  This measurement is an indication of how 
       fast the drive can sustain sequential data reads under Linux, without 
       any filesystem overhead.  To ensure accurate  measurements, the 
       buffer cache is flushed during the processing of -t using the 
       BLKFLSBUF ioctl.

-T     Perform timings of cache reads for benchmark and comparison purposes.
       For meaningful results, this operation should be repeated 2-3
       times on an otherwise inactive system (no other active processes) 
       with at least a couple of megabytes of free memory.  This displays
       the speed of reading directly from the Linux buffer cache without 
       disk access.  This measurement is essentially an indication of the
       throughput of the processor, cache, and memory of the system under 
       test.

Використання дд

Я теж використовував ddдля цього виду тестування. Одна з модифікацій я хотів би зробити в команді вище, щоб додати цей біт в кінці вашої команди, ; rm ddfile.

$ time sh -c "dd if=/dev/zero of=ddfile bs=8k count=250000 && sync"; rm ddfile

Це буде видалено ddfileпісля завершення команди. ПРИМІТКА: ddfile це тимчасовий файл, який вам не потрібно зберігати, це файл, який ddзаписується в ( of=ddfile), коли він завантажує ваш жорсткий диск.

Вихід за межі

Якщо вам потрібно більш жорстке тестування ваших жорстких дисків, ви можете використовувати Bonnie ++ .

Список літератури


1
Мені подобається hdparmтакож швидкі орієнтири. Єдиним недоліком є ​​те, що лише орієнтири зчитування смуги пропускання та продуктивність багатьох типів блокових пристроїв (наприклад, RAID, iSCSI) можуть бути дуже асиметричними. Для порівняння продуктивності "до" та "після" в одному і тому ж боксі також ddдобре працює.
Олексій

@ Алексіос - так, дякую, що згадуєте про це. Так, вам зазвичай доводиться використовувати принаймні hdparm+ ddабо просто bonnie++або всі 3.
slm

Замість синхронізації, що викликає сумніви, використовуйте iflag = direct oflag = direct, коли це передбачається (наприклад, Linux з файловою системою, яка підтримує пряме io).

22

(Це дуже популярне питання - його варіанти можна побачити на https://stackoverflow.com/q/1198691 , https://serverfault.com/q/219739/203726 та https://askubuntu.com/q / 87035/740413 )

Чи є кращі методи [ніж dd] для [орієнтирів дисків]?

Так, але для запуску вони знадобляться довше і знають, як інтерпретувати результати - не існує єдиного номера, яке розповість вам все за один раз, оскільки наступний вплив впливає на тип тесту, який ви повинні запустити:

  • Вас цікавить виконання I / O, яке є випадковим, послідовним чи деяким поєднанням цих двох?
  • Читаєте ви чи записуєте на диск (чи якусь суміш двох)?
  • Вас турбує затримка, пропускна здатність чи те й інше?
  • Ви намагаєтесь зрозуміти, як виконують різні частини одного і того ж жорсткого диска (як правило, швидше, ближче до центру спінінг-дисків)?
  • Вас цікавить, як буде працювати певна файлова система при використанні вашого диска, чи хочете, щоб результати наближалися до вихідної продуктивності диска, роблячи введення-виведення прямо на блоковий пристрій?
  • Вас цікавить, як працює певний розмір вводу-виводу?
  • Ви подаєте введення / виведення синхронно чи асинхронно?
  • Скільки вводу-виводу ви подаєте (надсилаєте занадто мало неправильного шляху, і всі введення-виведення можуть бути кешовані, щоб ви завершили тестування швидкості оперативної пам’яті, а не швидкості диска)?
  • Наскільки стисливим є вміст даних, які ви записуєте (наприклад, дані, що стосуються лише нуля, є надзвичайно стислими, а деякі файлові системи / диски навіть мають спеціальний швидкий шлях до даних, що стосуються лише нуля, що призводить до цифр, які неможливо отримати з іншим вмістом)?

І так далі.

Ось короткий список інструментів, які найпростіше запускати вгорі та важче / більш ретельно / краще ближче до низу:

  1. dd (послідовне зчитування або запис, показує лише пропускну здатність, може бути налаштовано на використання файлової системи або блокового пристрою, може бути налаштовано на обхід кеш-пам'яті блоків / очікування дійсно завершеного вводу / виводу)
  2. hdparm (лише послідовне зчитування, показує лише пропускну здатність, ніколи не використовує файлову систему, може бути налаштований так, щоб обходити кеш-пам'ять блоку, тест кешу лише перечитує початкові 2 Мбайт)
  3. Базовий показник утиліти GNOME Disk Utility (простий у запуску, ніколи не використовує файлову систему, графічну, але вимагає повної установки GNOME, дає затримку та пропускну здатність для різних типів вводу-виводу, але навантаження запису насправді робить читання / запис / fsync за розміром вибірки).
  4. fio (може робити майже все, що дає детальні результати, але вимагає конфігурації та розуміння способів інтерпретації зазначених результатів). Ось що про це говорить Лінус:

    Грег - отримай FIO-код Jens. Це робить все правильно, включаючи запис фактичного псевдовипадкового вмісту, який показує, чи диск виконує якесь «дедублювання» (він же «оптимізує для орієнтирів):

    [ https://github.com/axboe/fio/ ]

    Все інше підозрює - забудьте про боні чи інші традиційні інструменти.

Джерело: коментар, залишений в Google Plus Грегу Кроа-Хартману Лінусом Торвальдом .


11

за допомогою інструменту IOPS

Якщо ви не можете заважати читати все це, я просто рекомендую інструмент IOPS . Він підкаже вам швидкість у реальному світі в залежності від розміру блоку.


В іншому випадку - при виконанні IO-еталону я б розглядав наступні речі:

  • блокчейн / кеш / IOPS / прямий проти буферного / асинхронний та синхронізований
  • читати писати
  • нитки
  • затримка
  • Використання процесора

  • Який розмір блоку ви будете використовувати : Якщо ви хочете прочитати / записати 1 Гб з / на диск, це буде швидко, якщо ви зробите одну операцію вводу / виводу. Але якщо вашій програмі потрібно записати в 512 байтових фрагментах по всьому жорсткому диску в не послідовних фрагментах (називається випадковим введенням-виведенням, хоча це не випадково), це буде виглядати інакше. Тепер, бази даних будуть робити випадкові введення-виведення для обсягу даних та послідовні введення-виведення для обсягу журналу в залежності від їх природи . Отже, спочатку потрібно зрозуміти, що ви хочете виміряти. Якщо ви хочете скопіювати великі відеофайли, які відрізняються, ніж якщо ви хочете встановити Linux.

    Цей розмір блоків впливає на кількість операцій вводу / виводу, які ви виконуєте. Якщо ви робите, наприклад, 8 послідовних операцій читання (або запису, просто не змішаних), планувальник вводу-виводу в ОС об'єднає їх. Якщо цього не зробити, кеш контролера зробить злиття. Різниці практично немає, якщо ви прочитаєте 8 послідовних блоків з 512 байт або один шматок 4096 байт. Один виняток - якщо вам вдасться зробити IO прямої синхронізації і чекати 512 байт, перш ніж запитати наступні 512 байти. У цьому випадку збільшення розміру блоку схоже на додавання кешу.

    Також слід пам’ятати, що існує синхронізація та асинхронізація IO: З синхронізацією IO ви не видасте наступного запиту вводу-виводу до повернення поточного. За допомогою програми async IO ви можете запитати, наприклад, 10 фрагментів даних, а потім чекати, коли вони надійдуть. Нитки баз даних дезінфікують, як правило, використовують синхронізуючий IO для журналу та асинхронізований IO для даних. Інструмент IOPS переймається цим, вимірюючи всі відповідні розміри блоків, починаючи з 512 байт.

  • Чи будете ви читати чи писати : Зазвичай читання швидше, ніж письмове. Але зауважте, що кешування працює зовсім по-іншому для читання та запису:

    • Для запису дані будуть передані контролеру, і якщо вони кешуються, він підтвердить, перш ніж дані будуть на диску, якщо кеш не заповнений. Використовуючи інструмент іозону , можна намалювати красиві графіки плато кеш-ефектів (ефект кешу процесора та ефект кефіру буфера). Кеші стають менш ефективними, тим більше написано.

    • Для читання дані зчитування зберігаються в кеші після першого читання. Перші читання займають найдовше, а кешування стає все більш ефективним під час оновлення. Помітними кешами є кеш процесора, кеш файлової системи ОС, кеш-пам'ять контролера IO та кеш-пам’яті. Інструмент IOPS вимірює лише зчитування. Це дозволяє йому "читати всюди", і ви не хочете, щоб він писав замість прочитаного.

  • Скільки потоків ви будете використовувати : Якщо ви використовуєте один потік ( використовуючи dd для дискових орієнтирів ), ви, ймовірно, отримаєте набагато гірші показники, ніж у кількох потоків. Інструмент IOPS враховує це і читає в декількох потоках.

  • Наскільки важлива затримка для вас : Переглядаючи бази даних, затримка вводу-виводу стає надзвичайно важливою. Будь-яка команда вставлення / оновлення / видалення SQL буде записана в журнал бази даних ("журнал" у лінзі бази даних) на фіксацію до її визнання. Це означає, що повна база даних може чекати завершення цієї операції вводу-виводу. Я показую тут, як вимірювати середній час очікування (очікування) за допомогою інструменту iostat .

  • Наскільки важливо використання процесора для вас : ваш процесор може легко стати вузьким місцем для роботи вашої програми. У цьому випадку ви повинні знати, скільки циклів процесора спалюються за прочитаний / записаний байт та оптимізуєте його в цьому напрямку. Це може означати вибір / проти флеш-пам’яті PCIe залежно від результатів вимірювань. Знову ж інструмент iostat може дати точну оцінку використання процесора вашими операціями вводу- виводу.


1
Сценарій iops приємний, я дуже збентежився, що він не був підхожим або піп, хоча. Це все-таки працює.
ThorSummoner

Інструмент iops, здається, покинутий. Крім того, він просто вимірює зчитування і не друкує будь-яких статистичних цифр (наприклад, stddev / кількісні).
maxschlepzig

Інструмент iops простий, і це те, що вам потрібно для порівняння. Це в основному обгортка для системного виклику читання, зробленого випадковим чином у файлі (все - це файл). Повірте чи прочитайте джерело - воно закінчено і код не потребує оновлення. Подумайте над цим - чи справді ви хочете іншого інструменту, як IOMeter, з 1000-ти рядками коду, де кожен з них є дискусійним? А що ви робите з новою версією? Чи доведеться повторно виконувати всі орієнтири?
Thorsten Staerk

8

Якщо ви встановили PostgreSQL, ви можете використовувати їх відмінний орієнтир pg_test_fsync . Це в основному тестує продуктивність синхронізації запису.

У Ubuntu ви знайдете його тут: /usr/lib/postgresql/9.5/bin/pg_test_fsync

Найголовніша річ у тому, що цей інструмент покаже вам, чому фірмові SSD коштують додаткових доларів.


2
На Debian він доступний в postgresql-contribпакеті.
TranslucentCloud

5

Ви можете використовувати fio- багатопотоковий інструмент генерації IO . Він упакований кількома дистрибутивами, наприклад, Fedora 25, Debian і OpenCSW.

Інструмент fio є дуже гнучким, його можна легко використовувати для порівняння різних сценаріїв вводу-виводу, включаючи одночасні. У комплекті є кілька прикладних файлів конфігурації (див. Наприклад /usr/share/doc/fio/examples). Він правильно вимірює речі, тобто також друкує стандартне відхилення та кількісну статистику для деяких цифр. Те, про що не цікавлять інші популярні інструменти бенчмаркінгу.

Простий приклад (послідовність простих сценаріїв: послідовне / випадкове X читання / запис):

$ cat fio.cfg
[global]
size=1g
filename=/dev/sdz

[randwrite]
rw=randwrite

[randread]
wait_for=randwrite
rw=randread
size=256m

[seqread]
wait_for=randread
rw=read

[seqwrite]
wait_for=seqread
rw=write

Виклик:

# fio -o fio-seagate-usb-xyz.log fio.cfg
$ cat fio-seagate-usb-xyz.log
[..]
randwrite: (groupid=0, jobs=1): err= 0: pid=11858: Sun Apr  2 21:23:30 2017
  write: io=1024.0MB, bw=16499KB/s, iops=4124, runt= 63552msec
clat (usec): min=1, max=148280, avg=240.21, stdev=2216.91
 lat (usec): min=1, max=148280, avg=240.49, stdev=2216.91
clat percentiles (usec):
 |  1.00th=[    2],  5.00th=[    2], 10.00th=[    2], 20.00th=[    7],
 | 30.00th=[   10], 40.00th=[   11], 50.00th=[   11], 60.00th=[   12],
 | 70.00th=[   14], 80.00th=[   16], 90.00th=[   19], 95.00th=[   25],
 | 99.00th=[ 9408], 99.50th=[10432], 99.90th=[21888], 99.95th=[38144],
 | 99.99th=[92672]
bw (KB  /s): min= 7143, max=371874, per=45.77%, avg=15104.53, stdev=32105.17
lat (usec) : 2=0.20%, 4=15.36%, 10=6.58%, 20=69.35%, 50=6.07%
lat (usec) : 100=0.49%, 250=0.07%, 500=0.01%, 750=0.01%
lat (msec) : 4=0.01%, 10=1.20%, 20=0.54%, 50=0.08%, 100=0.03%
lat (msec) : 250=0.01%
  cpu          : usr=1.04%, sys=4.79%, ctx=4977, majf=0, minf=11
  IO depths    : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
 submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
 complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
 issued    : total=r=0/w=262144/d=0, short=r=0/w=0/d=0, drop=r=0/w=0/d=0
 latency   : target=0, window=0, percentile=100.00%, depth=1
randread: (groupid=0, jobs=1): err= 0: pid=11876: Sun Apr  2 21:23:30 2017
  read : io=262144KB, bw=797863B/s, iops=194, runt=336443msec
[..]
bw (KB  /s): min=  312, max= 4513, per=15.19%, avg=591.51, stdev=222.35
[..]

Зауважте, що в цьому [global]розділі є глобальні параметри за замовчуванням, які можуть бути замінені іншими розділами. Кожен розділ описує завдання, назва розділу - це назва роботи, і його можна вільно обирати. За замовчуванням паралельно запускаються різні завдання, тому вищенаведений приклад явно серіалізує виконання завдання wait_forключем. Також fio використовує блок розміром 4 KiB - який також можна змінити. У прикладі безпосередньо використовується необроблений пристрій для читання і запису завдань, таким чином, переконайтеся, що ви використовуєте правильний пристрій. Інструмент також підтримує використання файлу / каталогу в існуючих файлових системах.

Інші інструменти

hdparmУтиліта надає дуже простий тест для читання, наприклад:

# hdparm -t -T /dev/sdz

Це не заміна для передового інструменту бенчмаркінгу, такого як fio, його просто слід використовувати для першої перевірки правдоподібності. Наприклад, щоб перевірити, чи зовнішній привід USB 3 неправильно розпізнається як пристрій USB 2 (ви побачили б ~ 100 MiB / s проти ~ 30 MiB / s швидкості тоді).


1
Ця відповідь по суті є іншою версією підсумкової відповіді unix.stackexchange.com/a/138516/134856 (але з розширеним розділом фіо ). Я розірваний, тому що він дає резюме фіо, але він досить довгий, і ви зможете піти з посиланням на fio.readthedocs.io/en/latest/fio_doc.html#job-file-format ...
Anon

PS: Я рекомендую додати direct = 1 до глобального розділу вашої роботи, щоб ви обходили кеш сторінки сторінки Linux і бачили тільки швидкість диска (але оскільки ваш iodepth лише 1 ... [вставте дискусію про подачу вводу / виводу диска] ). Також простіше використовувати камеру стін ( fio.readthedocs.io/en/latest/… ) у всьому світі, щоб усі завдання виконувались послідовно.
Анон

1

Як зазначено тут , ви можете використовувати gnome-disks(якщо ви використовуєте Gnome).

Клацніть на накопичувач, який ви хочете протестувати, і натисніть «Додаткові параметри розділів» (колеса). Потім Benchmark Partition. Ви отримаєте середнє читання / запис у МБ / с, а середній час доступу в мілісекундах. Я вважав це дуже зручним.


1

Це трохи сиро, але це працює в крайній мірі:

find <path> -type f -print0 | cpio -0o >/dev/null

За допомогою цієї методики ви можете зробити кілька цікавих речей, включаючи кешування всіх файлів /libта /usr/binфайлів. Ви також можете використати це як частину тестування:

find / -xdev -type f -print0 | 
sort -R --from0-file=- | 
timeout "5m" cpio -0o >/dev/null

Усі назви файлів у корені знаходять, сортують випадковим чином та копіюють їх у кеш до 1 хвилини. Вихід із cpio говорить про те, скільки блоків було скопійовано. Повторіть 3 рази, щоб отримати в середньому блоки за хвилину. (Зауважте, операція пошуку / сортування може зайняти багато часу - набагато довше, ніж копія. Краще буде кешувати пошук / сортування та використовувати splitдля отримання вибірки файлів.)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.