SSD Nodes Learn 8GB RAM — $66/год
Руководства Matt ConnorАвтор: Matt Connor · Обновлено 2026-08-01

Как правильно тестировать VPS: yabs.sh, fio, sysbench

Запустите yabs.sh, затем отдельно fio, sysbench и iperf3. Разберите CPU, память, IOPS и сеть и не делайте выводов по одному запуску: нагрузка соседей меняет результат.

Verified Every command ran end-to-end on a fresh Ubuntu 24.04 server, July 30, 2026.

Что означает тестирование VPS

При тестировании VPS измеряют 4 параметра: скорость работы одного ядра CPU, пропускную способность памяти, количество мелких случайных операций с диском, которые хранилище выполняет в секунду, и пропускную способность сетевого соединения. Один запуск yabs.sh позволяет получить все 4 показателя примерно за десять минут. Сложнее интерпретировать результат, поскольку VPS (виртуальный частный сервер) использует физическое оборудование совместно с другими клиентами. Поэтому один и тот же сервер может показать одно значение в 03:00 и совершенно другое в 20:00.

Сначала запустите yabs.sh, чтобы получить общую картину, затем вручную запустите используемые им инструменты. Самостоятельный запуск позволяет изменить один флаг, наблюдать за изменением показателя и понять, что именно он измеряет. Выполняйте это после настройки сервера, а не до нее. Сначала выполните шаги из раздела первые десять минут на новом VPS, поскольку сервер, который еще устанавливает первую серию обновлений, показывает плохие результаты тестирования по причинам, не связанным с оборудованием.

Изучите машину до начала измерений

Половина всех плохих результатов тестов связана с тем, что автор не разобрался в характеристиках машины.

nproc
lscpu | grep -E 'Model name|Hypervisor|Thread'
free -h
df -hT /
uname -r
systemd-detect-virt

Hypervisor vendor: KVM означает полную виртуализацию, поэтому используется собственное ядро. Вывод lxc или openvz в systemd-detect-virt означает контейнерную виртуализацию: используется общее ядро хоста, а ограничения CPU и памяти задаются параметрами cgroup (control group), а не виртуальным оборудованием. В системе с cgroup v2 ограничение CPU можно прочитать напрямую.

cat /sys/fs/cgroup/cpu.max

max 100000 означает отсутствие квоты. 200000 100000 означает, что можно использовать 200000 микросекунд CPU в каждом периоде длительностью 100000 микросекунд, то есть квота соответствует двум ядрам. Тариф с заявленными 4 vCPU и квотой в два ядра никогда не покажет результат на уровне четырех ядер, а ни один инструмент тестирования не выведет строку с объяснением причины.

df -hT / важен по другой причине: из-за столбца Type. Если в нем указано overlay, вы находитесь внутри контейнера, и приведенный ниже тест диска требует изменения. Отметьте это сейчас.

Постоянно отслеживайте steal time

Steal time — это доля времени, когда ваш виртуальный CPU был готов выполнять задачи, но гипервизор передал физическое ядро другому пользователю. Это самый полезный отдельный показатель, позволяющий понять, связана ли проблема с соседними виртуальными машинами, а не с оборудованием.

vmstat 1 10

Справа найдите столбец st. Стабильное значение 0 или 1 является нормальным. Устойчивые значения выше 5 означают, что в этот момент хост перегружен виртуальными машинами. Поэтому все записанные за этот период показатели CPU будут занижены не по вине вашей машины. top показывает то же значение, что и %st в строке CPU. Во время тестирования производительности запустите vmstat 1 во втором сеансе SSH и записывайте значение steal рядом с каждым результатом.

Начните с yabs.sh

yabs.sh (Yet Another Bench Script) — это shell-скрипт, который скачивает статические двоичные файлы fio, iperf3 и Geekbench, запускает их и выводит сводные результаты. Это общий инструмент для обсуждения производительности VPS. Поэтому вывод yabs — самый быстрый способ сравнить результаты с другим пользователем.

В проекте используется следующая однострочная команда.

curl -sL yabs.sh | bash

Эта команда передаёт содержимое URL, доступное в текущий момент, непосредственно в shell. Сначала скачайте скрипт и прочитайте его. Затем запустите его.

curl -sLo yabs.sh https://raw.githubusercontent.com/masonr/yet-another-bench-script/master/yabs.sh
less yabs.sh
bash yabs.sh

При передаче через канал флаги указываются после -s --. При запуске локальной копии они указываются непосредственно после имени файла. Полезные флаги: -f пропускает тест диска, -i пропускает сетевой тест, -g пропускает Geekbench, -r сокращает число расположений iperf3 до двух, -j выводит результаты в формате JSON, а -w results.json записывает этот JSON в файл.

bash yabs.sh -r -w yabs-run1.json

Перед первым запуском необходимо учесть два момента. Geekbench загружает результаты и выводит общедоступный URL на browser.geekbench.com. Любой пользователь, у которого есть эта ссылка, может просмотреть модель процессора и результаты теста. Флаг -g полностью отключает этот тест. Кроме того, на этапе iperf3 передаётся реальный сетевой трафик на серверы в нескольких регионах. Этот трафик учитывается в месячном лимите. При скорости соединения 1 Gbit/s полный сетевой этап может передать десятки гигабайт. Поэтому при небольшом лимите используйте -r, а при тарификации по объёму — -i.

Что означает каждая часть вывода yabs

В разделе диска fio выполняет тесты с соотношением операций чтения и записи 50/50 и четырьмя размерами блоков: 4k, 64k, 512k и 1m. Для каждого размера он показывает IOPS (количество операций ввода-вывода в секунду) и пропускную способность. Для базы данных, почтового сервера и других систем, выполняющих множество небольших операций записи, важна строка 4k. Большинство операций ввода-вывода на серверах выполняется с небольшими блоками и в разрозненных областях. Строка 1m важна для резервного копирования и работы с видео, где передаются длинные последовательности байтов.

В сетевом разделе iperf3 выполняет тесты с общедоступными серверами в нескольких регионах, в обоих направлениях и с использованием параллельных потоков. Низкое значение следует рассматривать как повод для проверки, а не как окончательный результат. Общедоступные серверы iperf3 используются совместно и часто перегружены. Поэтому причиной низкого результата может быть удалённая сторона.

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

Диск: запустите fio самостоятельно

fio (flexible IO tester) — это инструмент, который используется в разделе диска yabs. При непосредственном запуске его флаги начинают иметь практический смысл.

sudo apt update && sudo apt install -y fio sysbench iperf3

Тест случайного чтения блоками по 4k с глубиной очереди 32 на файловой системе, которая вас действительно интересует:

fio --name=randread4k --filename=./fio-testfile --size=2G --bs=4k \
  --rw=randread --ioengine=libaio --iodepth=32 --direct=1 \
  --runtime=60 --time_based --group_reporting

Строка сводки, которую нужно найти в выводе, выглядит так:

read: IOPS=184k, BW=719MiB/s (754MB/s)(42.1GiB/60001msec)

Ниже fio выводит блок clat percentiles. Стоит приводить значение 99.00-го перцентиля, поскольку оно показывает, сколько ждал самый медленный из 100 запросов. Среднее значение задержки скрывает именно те задержки, которые замечает пользователь.

  • --direct=1 открывает файл с параметром O_DIRECT, поэтому чтение обходит кэш страниц ядра. Без этого второй проход по файлу размером 2G на компьютере с 8G ОЗУ обслуживается из памяти, и fio показывает миллионы IOPS. Это значение действительно, но оно отражает скорость памяти.
  • --ioengine=libaio отправляет асинхронные запросы. Благодаря этому --iodepth=32 может одновременно обрабатывать 32 запроса. При использовании синхронного механизма, например psync, значение iodepth больше 1 ничего не меняет: измеряется только один запрос за раз.
  • --time_based --runtime=60 запускает тест на фиксированные 60 секунд, а не на фиксированный объём работы. Поэтому быстрый и медленный диски работают одинаковое время, и сравнение остаётся корректным.
  • --size=2G задаёт размер тестового файла. Он должен быть больше любого кэша на пути обработки. Сначала проверьте наличие свободного места.

Случайная запись выполняется той же командой с параметром --rw=randwrite. Запустите её отдельно, затем удалите файл.

fio --name=randwrite4k --filename=./fio-testfile --size=2G --bs=4k \
  --rw=randwrite --ioengine=libaio --iodepth=32 --direct=1 \
  --runtime=60 --time_based --group_reporting
rm -f ./fio-testfile

Для сочетания операций, более близкого к реальному сетевому трафику, используйте --rw=randrw --rwmixread=70. Тип хранилища, на котором работает система, влияет на эти результаты сильнее, чем любой флаг. Различия между типами хранилищ рассмотрены в статье о различиях между хранилищами NVMe и SATA SSD на VPS.

Если fio завершается с ошибкой Unknown error -1

Прямой ввод-вывод доступен не во всех файловых системах. overlay, файловая система, которую Docker по умолчанию предоставляет контейнеру, и несколько сетевых файловых систем не поддерживают O_DIRECT. Поэтому libaio отправляет запрос, который ядро не может выполнить, и fio завершает работу:

fio: io_u error on file ./fio-testfile: Unknown error -1: read offset=0, buflen=4096
fio: pid=1234, err=-1/file:ioengines.c:321, func=get_events, error=Unknown error -1

Сначала выполните df -hT .. Если в столбце Type указано overlay, укажите для --filename путь в реальном хранилище, например в подключенном через bind mount томе, или запустите fio на хосте, а не в контейнере. Если доступ к реальному хранилищу невозможен, буферизованный синхронный запуск по крайней мере подтверждает корректность самой команды.

fio --name=randread4k-buffered --filename=./fio-testfile --size=256M --bs=4k \
  --rw=randread --ioengine=psync --direct=0 --numjobs=1 \
  --runtime=15 --time_based --group_reporting
rm -f ./fio-testfile

Учитывайте назначение этого запуска. После первого прохода файл размером 256M находится в кэше страниц, поэтому показатель IOPS описывает производительность оперативной памяти. Используйте этот запуск, чтобы убедиться, что fio установлен и корректно разбирает флаги. Не приводите этот результат как показатель производительности диска.

Почему dd не является тестом диска

dd часто встречается в обсуждениях VPS и отвечает на один узкий вопрос.

dd if=/dev/zero of=./ddtest bs=1M count=1024 oflag=direct conv=fdatasync
rm -f ./ddtest

Эта команда измеряет скорость последовательной записи при одном потоке и одном запросе в обработке. Это разумная базовая проверка. Она ничего не говорит о случайных операциях ввода-вывода и о том, что происходит, когда одновременно поступают 32 запроса. Если убрать oflag=direct, команда в основном измеряет, насколько быстро ядро принимает записи в память. Поэтому значения dd, которые часто приводят на форумах, бывают нереалистично высокими.

CPU: sysbench cpu

sysbench cpu --cpu-max-prime=20000 --threads=1 run
sysbench cpu --cpu-max-prime=20000 --threads=$(nproc) run

Учитывайте значение events per second. Сначала запустите тест в однопоточном режиме. Это значение показывает, насколько быстро завершается один PHP-запрос или одна задача компиляции. При одинаковой цене оно сильнее всего различается между хостами. Затем запустите тест со всеми потоками. Так можно определить, являются ли ваши vCPU отдельными ядрами или частями одного ядра.

Учитывайте, что именно измеряет этот тест: sysbench cpu многократно вычисляет простые числа с использованием 64-разрядной целочисленной арифметики. Он не создает нагрузку на пропускную способность памяти, векторные блоки или кэш так, как это происходит при реальной нагрузке. Поэтому тест подходит для сравнения двух хостов, но плохо прогнозирует работу вашего приложения.

В Ubuntu 24.04 используется sysbench 1.0.20, где сначала указывается имя теста. Если скопировать команду с --test=cpu из старой публикации, вы получите WARNING: the --test option is deprecated. Результаты sysbench 0.4 и sysbench 1.0 вообще нельзя сравнивать. Поэтому не сравнивайте свои результаты с опубликованным значением, если в нем не указана версия.

Память: sysbench memory

sysbench memory --memory-block-size=1M --memory-total-size=20G --memory-oper=write --threads=1 run
sysbench memory --memory-block-size=1M --memory-total-size=20G --memory-oper=read --threads=1 run

Результат указывается в MiB/sec. На всех машинах чтение выполняется быстрее записи. Установите --memory-block-size равным 1M и используйте это же значение на всех сравниваемых хостах. При значении 1K результат резко снижается, поскольку накладные расходы каждой операции возникают в тысячу раз чаще. В итоге измеряется стоимость цикла, а не пропускная способность памяти. Это флаг, значения которого чаще всего не совпадают в опубликованных результатах тестирования памяти.

Сеть: iperf3

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

На удалённой машине:

iperf3 -s

Эта команда прослушивает TCP-порт 5201. Откройте порт только для адреса, с которого выполняется проверка, и закройте его после завершения. В разделе Основные правила настройки ufw на VPS описан соответствующий синтаксис.

На проверяемом VPS:

iperf3 -c 203.0.113.10 -t 30
iperf3 -c 203.0.113.10 -t 30 -R
iperf3 -c 203.0.113.10 -t 30 -P 8

Первая команда измеряет исходящую скорость с проверяемой машины. -R меняет направление и измеряет входящую скорость. -P 8 открывает восемь параллельных потоков.

Выполните как проверку с одним потоком, так и параллельную проверку. Они отвечают на разные вопросы. Одно TCP-соединение может передавать только такой объём неподтверждённых данных, который допускает его окно. Поэтому его предельная скорость примерно равна размеру окна, делённому на время кругового обмена. При задержке 80 ms и окне 4 MB этот предел составляет около 400 Mbit/s независимо от фактической скорости канала. Результат для одного потока показывает скорость, доступную одной загрузке. Результат для параллельных потоков показывает пропускную способность канала.

Следите за доступным объёмом трафика во время проверки. За 30 секунд при скорости 1 Gbit/s передаётся около 3.75 GB. Кроме того, проверку потребуется выполнить несколько раз в каждом направлении.

Эталонные показатели и интерпретация результатов

ChartTypical published 4k random read IOPS by storage class
The data behind this chart
[
  {
    "device": "Local NVMe",
    "iops_4k_read": "180,000"
  },
  {
    "device": "Local SATA SSD",
    "iops_4k_read": "90,000"
  },
  {
    "device": "Network block",
    "iops_4k_read": "12,000"
  },
  {
    "device": "Spinning disk",
    "iops_4k_read": "180"
  }
]

Локальный том NVMe в опубликованных результатах обычно показывает около 180,000 IOPS при случайном чтении блоками 4k. Локальный SSD SATA обычно показывает около 90,000. Сетевое блочное хранилище, где каждый запрос проходит по сети до диска, обычно показывает около 12,000, а HDD — примерно 180, поскольку при каждом случайном запросе перемещает физическую головку.

Это типичные опубликованные показатели для каждого класса хранилищ, а не результаты измерений на одном хосте. Используйте их только для одной цели: чтобы проверить, находится ли ваш результат в правильном порядке величины. Если тариф, заявленный как NVMe, показывает по результатам теста несколько тысяч IOPS при чтении блоками 4k, сначала проверьте, был ли включен --direct=1. Если он был включен, то либо хранилище не соответствует описанию на странице продукта, либо вы используете его совместно с очень загруженным соседним клиентом.

Почему один запуск не является бенчмарком

Один результат показывает состояние общей машины в течение одной минуты. Рассматривайте его как одну выборку.

  • Запускайте каждый тест как минимум 5 раз в разные часы и как минимум в 2 разных дня. Сохраняйте медиану и разброс. Результат без разброса — это маркетинговый показатель.
  • Записывайте значение steal time для каждого запуска. Исключайте запуски, в которых st было высоким, или как минимум отмечайте это.
  • Проводите дисковый тест с двумя значениями длительности. Многие тарифы предоставляют пополняемый запас burst IOPS, поэтому 60-секундный запуск fio измеряет burst, а --runtime=600 — минимальную производительность. Именно ее вы получите в неблагоприятный день.
  • Убедитесь, что ничего другого не запущено. Если unattended-upgrades начнет транзакцию apt во время теста CPU, это напрямую снизит результат, а запуск ps -e -o comm= | grep -E 'apt|dpkg' перед каждым тестом занимает секунду.
  • Изменяйте только одну переменную за раз. Разные версии инструментов, размеры блоков или количества потоков дают несопоставимые числа, даже если они выглядят похожими.

При сравнении двух провайдеров запускайте тесты в один и тот же час одного и того же дня. Иначе вы измерите время суток.

В последнюю очередь тестируйте собственную рабочую нагрузку

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

time tar -czf /tmp/bench.tgz /usr/share
rm -f /tmp/bench.tgz

Эта команда сжимает несколько сотен мегабайт. Поэтому она одновременно нагружает CPU и диск, а результат меняется при изменении любого из них. Предупреждение Removing leading / from member names является нормальным. Еще лучше измерить время собственной сборки, самого медленного запроса или рендеринга страницы. Если сборка занимает 4 минуты на одном хосте и 7 минут на другом, вопрос решен независимо от оценки Geekbench. Это также измерение, которое показывает, в какой момент дополнительная производительность перестает оправдывать затраты. Это стоит узнать до того, как вы прочитаете сколько на самом деле стоит VPS в месяц или перенесете рабочую нагрузку на выделенный сервер.

FAQ

Почему при каждом запуске теста я получаю другой результат?

VPS использует физические CPU, хранилище и сеть совместно с другими клиентами. Поэтому результат зависит от того, чем они занимаются в данный момент. Запустите vmstat 1 во время теста и проверьте столбец st: устойчивое значение steal time выше 5 означает, что хост был занят, а низкий результат CPU вызван причинами за пределами вашей машины. Важна методика, а не настройка. Запустите каждый тест не менее пяти раз в разные часы, затем укажите медиану и диапазон значений.

Почему fio показывает миллионы IOPS?

Почти всегда причина в отсутствии --direct=1. Без этого параметра fio читает данные через page cache ядра. Поэтому после первого прохода тестовый файл размером 2G обслуживается из RAM, и вы измеряете пропускную способность памяти. Добавьте --direct=1 и используйте тестовый файл, размер которого превышает размер любого кэша на пути передачи данных. Если после этого --direct=1 завершится ошибкой err=-1/file:ioengines.c:321, func=get_events, error=Unknown error -1, выполните df -hT .: Type с overlay не поддерживает O_DIRECT, поэтому направьте тест на реальное хранилище.

Достаточно ли одного yabs.sh?

Для первичной оценки — да. Скрипт запускает fio с четырьмя размерами блоков, iperf3 в обоих направлениях и Geekbench, а затем выводит одну сводку, которую могут прочитать другие. Этого недостаточно, если нужно понять причину конкретного результата, поскольку для отдельных тестов нельзя менять его параметры. Если результат yabs выглядит неправильно, воспроизведите тест напрямую с помощью fio или sysbench и изменяйте за один раз только один параметр.

Какое единственное значение лучше всего показывает, насколько отзывчивым будет приложение?

Для большинства веб-приложений и баз данных — скорость одного ядра CPU, а затем задержка случайного чтения 4k. Показатели пропускной способности выглядят впечатляюще, но редко определяют результат, поскольку типичный запрос небольшой. Указывайте 99-й перцентиль из блока fio clat percentiles, а не среднее значение: именно один медленный запрос из ста замечает пользователь.

Нужно ли что-либо устанавливать перед проведением тестов?

fio, sysbench и iperf3 доступны в репозиториях Ubuntu и Debian: sudo apt install -y fio sysbench iperf3. Для yabs.sh требуется только curl, поскольку он загружает статические бинарные файлы для отсутствующих компонентов. После завершения удалите все тестовые файлы. Оставленный на диске размером 20G файл fio размером 2G через несколько недель может вызвать оповещение о заполнении диска.

#benchmarks#fio#sysbench#yabs#iperf3#vps-performance