forked from vitalif/vitastor
66 lines
6.3 KiB
Markdown
66 lines
6.3 KiB
Markdown
[Документация](../../README-ru.md#документация) → Производительность → Понимание сути производительности систем хранения
|
||
|
||
-----
|
||
|
||
[Read in English](understanding.en.md)
|
||
|
||
# Понимание сути производительности систем хранения
|
||
|
||
Вкратце: для быстрой хранилки задержки важнее, чем пиковые iops-ы.
|
||
|
||
Лучшая возможная задержка достигается при тестировании в 1 поток с глубиной очереди 1,
|
||
что приблизительно означает минимально нагруженное состояние кластера. В данном случае
|
||
IOPS = 1/задержка. Ни числом серверов, ни дисков, ни серверных процессов/потоков
|
||
задержка не масштабируется... Она зависит только от того, насколько быстро один
|
||
серверный процесс (и клиент) обрабатывают одну операцию.
|
||
|
||
Почему задержки важны? Потому, что некоторые приложения *не могут* использовать глубину
|
||
очереди больше 1, ибо их задача не параллелизуется. Важный пример - это все СУБД
|
||
с поддержкой консистентности (ACID), потому что все они обеспечивают её через
|
||
журналирование, а журналы пишутся последовательно и с fsync() после каждой операции.
|
||
|
||
fsync, кстати - это ещё одна очень важная вещь, про которую почти всегда забывают в тестах.
|
||
Смысл в том, что все современные диски имеют кэши/буферы записи и не гарантируют, что
|
||
данные реально физически записываются на носитель до того, как вы делаете fsync(),
|
||
который транслируется в команду сброса кэша операционной системой.
|
||
|
||
Дешёвые SSD для настольных ПК и ноутбуков очень быстрые без fsync - NVMe диски, например,
|
||
могут обработать порядка 80000 операций записи в секунду с глубиной очереди 1 без fsync.
|
||
Однако с fsync, когда они реально вынуждены писать каждый блок данных во флеш-память,
|
||
они выжимают лишь 1000-2000 операций записи в секунду (число практически постоянное
|
||
для всех моделей SSD).
|
||
|
||
Серверные SSD часто имеют суперконденсаторы, работающие как встроенный источник
|
||
бесперебойного питания и дающие дискам успеть сбросить их DRAM-кэш в постоянную
|
||
флеш-память при отключении питания. Благодаря этому диски с чистой совестью
|
||
*игнорируют fsync*, так как точно знают, что данные из кэша доедут до постоянной
|
||
памяти.
|
||
|
||
Все наиболее известные программные СХД, например, Ceph и внутренние СХД, используемые
|
||
такими облачными провайдерами, как Amazon, Google, Яндекс, медленные в смысле задержки.
|
||
В лучшем случае они дают задержки от 0.3мс на чтение и 0.6мс на запись 4 КБ блоками
|
||
даже при условии использования наилучшего возможного железа.
|
||
|
||
И это в эпоху SSD, когда вы можете пойти на рынок и купить там SSD, задержка которого
|
||
на чтение будет 0.1мс, а на запись - 0.04мс, за 100$ или даже дешевле.
|
||
|
||
## Команды fio
|
||
|
||
Когда мне нужно быстро протестировать производительность блочного устройства, я
|
||
использую следующие 6 команд, с небольшими вариациями:
|
||
|
||
- Линейная запись (результаты в МБ/с):
|
||
`fio -ioengine=libaio -direct=1 -invalidate=1 -name=test -bs=4M -iodepth=32 -rw=write -runtime=60 -filename=/dev/sdX`
|
||
- Линейное чтение (результаты в МБ/с):
|
||
`fio -ioengine=libaio -direct=1 -invalidate=1 -name=test -bs=4M -iodepth=32 -rw=read -runtime=60 -filename=/dev/sdX`
|
||
- Запись в 1 поток (T1Q1) (результаты в iops или миллисекундах задержки):
|
||
`fio -ioengine=libaio -direct=1 -invalidate=1 -name=test -bs=4k -iodepth=1 -fsync=1 -rw=randwrite -runtime=60 -filename=/dev/sdX`
|
||
- Чтение в 1 поток (T1Q1) (результаты в iops или миллисекундах задержки):
|
||
`fio -ioengine=libaio -direct=1 -invalidate=1 -name=test -bs=4k -iodepth=1 -rw=randread -runtime=60 -filename=/dev/sdX`
|
||
- Параллельная запись (numjobs=4 использовать, когда 1 ядро CPU не может насытить диск) (результаты только в iops):
|
||
`fio -ioengine=libaio -direct=1 -invalidate=1 -name=test -bs=4k -iodepth=128 [-numjobs=4 -group_reporting] -rw=randwrite -runtime=60 -filename=/dev/sdX`
|
||
- Параллельное чтение (numjobs - аналогично) (результаты только в iops):
|
||
`fio -ioengine=libaio -direct=1 -invalidate=1 -name=test -bs=4k -iodepth=128 [-numjobs=4 -group_reporting] -rw=randread -runtime=60 -filename=/dev/sdX`
|
||
|
||
Почему нужно тестировать именно так - см. [тут](https://yourcmc.ru/wiki/Производительность_Ceph#.D0.9B.D0.B8.D1.80.D0.B8.D1.87.D0.B5.D1.81.D0.BA.D0.BE.D0.B5_.D0.BE.D1.82.D1.81.D1.82.D1.83.D0.BF.D0.BB.D0.B5.D0.BD.D0.B8.D0.B5).
|