Відповіді:
Я зазвичай використовую 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 ++ .
hdparm
також швидкі орієнтири. Єдиним недоліком є те, що лише орієнтири зчитування смуги пропускання та продуктивність багатьох типів блокових пристроїв (наприклад, RAID, iSCSI) можуть бути дуже асиметричними. Для порівняння продуктивності "до" та "після" в одному і тому ж боксі також dd
добре працює.
hdparm
+ dd
або просто bonnie++
або всі 3.
(Це дуже популярне питання - його варіанти можна побачити на https://stackoverflow.com/q/1198691 , https://serverfault.com/q/219739/203726 та https://askubuntu.com/q / 87035/740413 )
Чи є кращі методи [ніж dd] для [орієнтирів дисків]?
Так, але для запуску вони знадобляться довше і знають, як інтерпретувати результати - не існує єдиного номера, яке розповість вам все за один раз, оскільки наступний вплив впливає на тип тесту, який ви повинні запустити:
І так далі.
Ось короткий список інструментів, які найпростіше запускати вгорі та важче / більш ретельно / краще ближче до низу:
Грег - отримай FIO-код Jens. Це робить все правильно, включаючи запис фактичного псевдовипадкового вмісту, який показує, чи диск виконує якесь «дедублювання» (він же «оптимізує для орієнтирів):
[ https://github.com/axboe/fio/ ]
Все інше підозрює - забудьте про боні чи інші традиційні інструменти.
Джерело: коментар, залишений в Google Plus Грегу Кроа-Хартману Лінусом Торвальдом .
Якщо ви не можете заважати читати все це, я просто рекомендую інструмент IOPS . Він підкаже вам швидкість у реальному світі в залежності від розміру блоку.
В іншому випадку - при виконанні IO-еталону я б розглядав наступні речі:
Використання процесора
Який розмір блоку ви будете використовувати : Якщо ви хочете прочитати / записати 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 може дати точну оцінку використання процесора вашими операціями вводу- виводу.
Якщо ви встановили PostgreSQL, ви можете використовувати їх відмінний орієнтир pg_test_fsync . Це в основному тестує продуктивність синхронізації запису.
У Ubuntu ви знайдете його тут: /usr/lib/postgresql/9.5/bin/pg_test_fsync
Найголовніша річ у тому, що цей інструмент покаже вам, чому фірмові SSD коштують додаткових доларів.
postgresql-contrib
пакеті.
Ви можете використовувати 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 швидкості тоді).
Як зазначено тут , ви можете використовувати gnome-disks
(якщо ви використовуєте Gnome).
Клацніть на накопичувач, який ви хочете протестувати, і натисніть «Додаткові параметри розділів» (колеса). Потім Benchmark Partition
. Ви отримаєте середнє читання / запис у МБ / с, а середній час доступу в мілісекундах. Я вважав це дуже зручним.
Це трохи сиро, але це працює в крайній мірі:
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
для отримання вибірки файлів.)