Оценка производительности блочного хранилища

Бенчмаркинг позволяет оценить производительность инфраструктуры и определить, может ли конкретная настройка обслуживать ваши потребности в рабочей нагрузке. Это важный компонент поддержки высокой производительности сервера. Бенчмаркинг позволяет отслеживать ресурсы сервера, оптимизировать производительность, управлять использованием ресурсов и прогнозировать проблемы.

В этом мануале мы рассмотрим лучшие практики бенчмаркинга блочных хранилищ, моделируя рабочие нагрузки, имитирующие ваше приложение.

Инструменты и конфигурации бенчмаркинга

Здесь для тестирования производительности мы будем использовать инструмент измерения производительности fio , поскольку он чрезвычайно гибкий и поддерживается большинством дистрибутивов. Альтернативные инструменты для бенчмаркинга, которые вы можете исследовать и использовать – Bonnie++btest и Filebench.

Чтобы установить fio на сервер Ubuntu, нужно сначала обновить индекс пакетов, а затем ввести следующую команду.

sudo apt update
sudo apt install fio

Каждый инструмент бенчмаркинга поставляется с различными параметрами, с помощью которых можно получить оптимальную производительность для вашего теста.

Одним из параметров, который стоит настроить, является глубина очереди. Этот параметр определяет, сколько операций ввода-вывода может одновременно обрабатывать сервер. Обычно глубина очереди в 1 указывает, что сервер не может начать другую транзакцию до тех пор, пока предыдущая транзакция не будет завершена. Используйте низкую глубину очереди в тестировании, только если вы хотите имитировать приложение с высокой степенью параллелизма. В противном случае попробуйте поднять глубину очереди, пока не получите требуемую производительность для своего приложения.

Инструмент fio предлагает следующие опции:

Опция Рекомендации
iodepth Глубина очереди, которую fio выдает в файл. Для достижения наилучшей скорости ввода/вывода (I/O) рекомендуется установить значение не менее iodepth=64.
bs Размер блока в байтах для ввода/вывода. Файловые системы используют 4K для метаданных, но склонны хранить файлы с гораздо большими размерами блоков. Базы данных обычно используют 8-16K для ввода-вывода. Для тестов максимальной пропускной способности мы рекомендуем размер блока bs=64k или больше.
runtime Время в секундах для запуска теста. Рекомендуемое время выполнения – более 60 секунд, обычно в диапазоне от runtime=20s до runtime=300s.
ioengine Определяет, как задание вызывает ввод/вывод в файл. Рекомендуется использовать значение ioengine=libaio, которое ссылается на собственный асинхронный ввод-вывод Linux.
direct Принимает логическое значение: 0 использует кэш файловой системы, возвращающий значение, наиболее близкое к поведению приложения, которое может привести к более высоким результатам тестов; 1 отключает кэширование файловой системы, возвращая самую близкую производительность, которую может обеспечить том. Мы рекомендуем direct=1.
sync Использует синхронный ввод-вывод для буферизованных записей. Эта опция принимает логическое значение: 0 позволяет работать с кэшем обратной записи, как на обычных дисках, причем fio ведет себя скорее как файловая система; 1 значит, что ввод/вывод не завершится до тех пор, пока на диске не будет физического размещения. Рекомендуется использовать значение 0.
size Размер тестового файла, выражается целым числом. Обычно рекомендуется использовать не менее 20 гигабайт.

Тестирование производительности томов

В этом разделе вы найдете пару примеров бенчмаркинга.

В следующих командах указывается файл fio.test в томе, что находится в центре обработки данных NYC3. Эти условные данные нужно заменить на определенную файловую систему, которую вы хотели бы использовать.

Производительность операций записи

Этот тест выполняет случайную запись 1 МБ в томе.

fio --filename=/mnt/volume-nyc3-04/fio.test \
--direct=1 \
--rw=randwrite \
--ioengine=libaio \
--bs=1024K \
--iodepth=32 \
--name=bw-test \
--runtime=120s \

Для стандартного сервера 200MB/sec – нормальный результат. Сервер с повышенным объемом CPU должен вернуть 300MB/sec.

Случайная операция чтения

Это позволяет определить, как быстро устройство может читать маленькие файлы.

fio --filename=/mnt/volume-nyc3-04/fio.test \
--direct=1 \
--rw=randread \
--ioengine=libaio \
--bs=4K \
--iodepth=128 \
--name=rand-r \
--runtime=120s \

Стандартный сервер должен вернуть 5000 операций I/O в секунду (IOPS). Сервер с повышенным объемом CPU должен вернуть 6000 IOPS.

Случайная операция записи

Это позволяет определить, как быстро устройство может записывать маленькие файлы.

fio --filename=/mnt/volume-nyc3-04/fio.test \
--direct=1 \
--rw=randwrite \
--ioengine=libaio \
--bs=4K \
--iodepth=128 \
--name=rand-w \
--runtime=120s \

Стандартный сервер должен вернуть 5000 IOPS. Сервер с повышенным объемом CPU должен вернуть 6000 IOPS.

Задержка чтения

Этот тест определяет время, необходимое для поиска и доступа к соответствующим блокам данных на диске.

fio --filename=/mnt/volume-nyc3-04/fio.test \
--direct=1 \
--rw=randread \
--ioengine=libaio \
--bs=4K \
--iodepth=1 \
--name=lat-read \
--runtime=120s \

Вывод должен быть менее 5ms.

Задержка записи

Этот тест измеряет задержку с момента создания запроса на запись и до его завершения.

fio --filename=/mnt/volume-nyc3-04/fio.test \
--direct=1 \
--rw=randwrite \
--ioengine=libaio \
--bs=4K \
--iodepth=1 \
--name=lat-write \
--runtime=120s \

Вывод снова должен быть менее 5ms.

Как читать вывод fio

После запуска тестов нужно проверить полученный результат, чтобы узнать, сколько операций чтения и записи обслуживал ваш том. Здесь нужно обратить внимание на то, сколько времени потребовалось для завершения каждого теста.

Ниже приведен пример вывода теста производительности операций записи.

fio --filename=/mnt/volume-nyc3-04/test.fio --direct=1 --rw=randwrite --ioengine=libaio --bs=1024k --iodepth=32  --name=bw-test --runtime=120s
bw-test: (groupid=0, jobs=1): err= 0: pid=2584: Fri Apr 20 17:14:19 2018
write: io=22937MB, bw=195468KB/s, iops=190, runt=120160msec
slat (usec): min=54, max=622, avg=135.46, stdev=23.21
clat (msec): min=7, max=779, avg=167.48, stdev=26.28
lat (msec): min=7, max=779, avg=167.62, stdev=26.28
clat percentiles (msec):
|  1.00th=[  101],  5.00th=[  155], 10.00th=[  159], 20.00th=[  163],
| 30.00th=[  165], 40.00th=[  167], 50.00th=[  167], 60.00th=[  167],
| 70.00th=[  169], 80.00th=[  169], 90.00th=[  172], 95.00th=[  178],
| 99.00th=[  306], 99.50th=[  363], 99.90th=[  420], 99.95th=[  474],
| 99.99th=[  545]
bw (KB  /s): min=137730, max=254485, per=100.00%, avg=195681.88, stdev=9590.24
lat (msec) : 10=0.01%, 20=0.03%, 50=0.37%, 100=0.58%, 250=97.55%
lat (msec) : 500=1.44%, 750=0.03%, 1000=0.01%
cpu          : usr=1.76%, sys=1.83%, ctx=22777, majf=0, minf=11
IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=99.9%, >=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.1%, 64=0.0%, >=64=0.0%
issued    : total=r=0/w=22937/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=32
Run status group 0 (all jobs):
WRITE: io=22937MB, aggrb=195468KB/s, minb=195468KB/s, maxb=195468KB/s, mint=120160msec, maxt=120160msec

Выделенная строка в этом выводе показывает среднюю полосу пропускания bw=195468 КБ / с, а операции ввода/вывода в секунду (IOPS) iops=190. В этом конкретном сценарии IOPS является низким, потому что 1 МБ записи выполняется с пиковой скоростью 200 МБ в секунду (190iops * 1M =~ 190MB/sec).

При выполнении теста задержки операций чтения вы получите примерно следующий результат:

lat-read: (groupid=0, jobs=1): err= 0: pid=2628: Fri Apr 20 17:32:51 2018
read : io=855740KB, bw=7131.2KB/s, iops=1782, runt=120001msec
slat (usec): min=8, max=434, avg=16.77, stdev= 5.92
clat (usec): min=2, max=450994, avg=539.15, stdev=2188.85
lat (usec): min=53, max=451010, avg=556.61, stdev=2188.91

В приведенном выше примере мы видим, что время задержки ввода-вывода составляет 556 микросекунд (или 0,5 мс). Это время, необходимое для выполнения одного 4K ввода-вывода в томе блочного хранилища.

На задержку влияют несколько факторов, в том числе производительность системы хранения, размер ввода-вывода, глубина очереди и т.д.

Заключение

В этом мануале вы узнали, как выполнить бенчмаркинг ваших томов и имитировать ожидаемые рабочие процессы на сервере. Регулярный бенчмаркинг в рамках вашего рабочего процесса помогает поддерживать соответствующую производительность приложений и предсказывать проблемы до их возникновения.

Читайте также: Создание зашифрованной файловой системы в томе блочного хранилища

Tags: