Оценка производительности блочного хранилища
Cloud Server, VPS | Комментировать запись
Бенчмаркинг позволяет оценить производительность инфраструктуры и определить, может ли конкретная настройка обслуживать ваши потребности в рабочей нагрузке. Это важный компонент поддержки высокой производительности сервера. Бенчмаркинг позволяет отслеживать ресурсы сервера, оптимизировать производительность, управлять использованием ресурсов и прогнозировать проблемы.
В этом мануале мы рассмотрим лучшие практики бенчмаркинга блочных хранилищ, моделируя рабочие нагрузки, имитирующие ваше приложение.
Инструменты и конфигурации бенчмаркинга
Здесь для тестирования производительности мы будем использовать инструмент измерения производительности 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: fio