Как измерить реальную скорость диска на Storage VPS
Последовательная скорость и IOPS сильно различаются на дешевых VPS. Узнайте, как протестировать ваш диск утилитой fio, чтобы понять реальную производительность перед переносом данных.
Краткий ответ
Диск на storage VPS быстро выполняет одну задачу и медленно — другую, и эти два типа нагрузки постоянно конфликтуют. Последовательная пропускная способность (скорость передачи одного большого файла) обычно высокая. Случайные IOPS (количество операций ввода-вывода в секунду) — мелкие разрозненные операции чтения и записи, характерные для баз данных — обычно низкие. Это разделение не является дефектом. Это именно то, что вы приобрели, выбрав терабайты вместо скорости, и это определяет, какие задачи подходят для данного сервера.
Никакие опубликованные характеристики не дадут ответа применительно к вашему тому. Планы по хранению данных различаются типом дисков, конфигурацией массива и тем, находится ли хранилище внутри физической машины, на которой работает ваша VM. Поэтому вторая часть этого руководства — это измерение, которое вы проводите самостоятельно с помощью fio на приобретенном вами томе, прежде чем переносить на него какие-либо важные данные.
Последовательная пропускная способность и случайные IOPS измеряют разные показатели
Последовательная нагрузка предполагает чтение или запись длинного непрерывного блока данных. Случайная нагрузка подразумевает переходы между несвязанными областями накопителя. На механическом диске эта разница обусловлена физически: головке необходимо переместиться на нужную дорожку, а пластине — повернуться, прежде чем начнётся передача данных. При последовательной операции затраты на позиционирование происходят один раз, после чего данные передаются потоком. При случайном доступе эти затраты возникают при каждой операции, поэтому диск тратит большую часть времени на позиционирование, а не на передачу данных. В результате один и тот же диск выдаёт два показателя, которые выглядят так, будто они получены на разном оборудовании.
Итоговое значение определяют две настройки, поэтому цифра IOPS сама по себе не имеет смысла. Первая — размер блока: случайное чтение блоками по 4k и последовательное чтение по 1M — это разные задачи для одного устройства. Вторая — глубина очереди (queue depth). Программа, которая ожидает завершения каждого чтения перед отправкой следующего, ограничена только задержкой (latency), тогда как большая глубина очереди позволяет массиву обрабатывать множество запросов одновременно. Если вам называют значение IOPS, уточните размер блока и глубину очереди, иначе эти данные бесполезны.
Конфигурация массива также влияет на оба показателя. Большее количество независимых дисков означает больше головок, которые могут выполнять поиск одновременно. Именно поэтому то, как RAID 10 массив строится из зеркальных пар, гораздо важнее для случайных операций, чем для потоковой передачи. Массивы с контролем чётности (parity) добавляют этап «чтение-модификация-запись» к каждой мелкой операции записи, поэтому случайная запись мелкими блоками является для них худшим сценарием.
Почему storage VPS подходит для restic, rsync и медиа-серверов
Целевые хранилища для резервных копий и медиа-серверы требуют именно тех характеристик, которыми обладают данные диски.
restic группирует ваши данные в файлы-паки размером в несколько мегабайт, вместо того чтобы записывать по одному объекту на каждый исходный файл. Поэтому резервная копия миллиона мелких файлов поступает на целевой сервер как поток крупных операций записи. Случайная часть этой работы — разбиение на чанки и дедупликация — выполняется на машине, где хранятся исходные данные, а не на сервере хранения.
Потоковое воспроизведение считывает файл последовательно от начала до конца, а плеер заранее буферизирует контент, поэтому дополнительные задержки при чтении не влияют на просмотр. Именно поэтому запуск Jellyfin с большой библиотекой хорошо работает на емких хранилищах. Важное предостережение: транскодирование — это нагрузка на CPU, а не на диск. Тарифы с упором на объем хранилища обычно имеют слабый CPU, поэтому библиотека, которая воспроизводится без транскодирования, будет работать нормально, а та, что требует транскодирования для каждого клиента — нет.
rsync — это случай, зависящий от ваших данных. Копирование образов дисков или видеофайлов происходит последовательно. Копирование дерева исходного кода, Maildir или директории node_modules — нет. rsync обходит дерево, запрашивает метаданные каждого файла и по умолчанию записывает каждый целевой файл под временным именем, а затем переименовывает его. Это тысячи мелких операций с метаданными, а операции с метаданными — это случайная нагрузка. Передаваемый объем данных может казаться незначительным, в то время как процесс занимает часы. Если ваш источник для rsync состоит из множества мелких файлов, будьте готовы к тому, что сервер хранения станет «узким местом».
Почему это плохо для базы данных, почтового спула или сервера сборки
Фиксация транзакции (commit) в базе данных не является проблемой пропускной способности. PostgreSQL записывает транзакцию в свой журнал предзаписи (write-ahead log) и вызывает fsync, прежде чем сообщить клиенту об успешном завершении. Клиент ожидает подтверждения записи, которая должна стать энергонезависимой. Таким образом, скорость фиксации ограничена задержкой записи (latency), и увеличение последовательной пропускной способности не ускорит этот процесс. В состав PostgreSQL входит утилита pg_test_fsync, которая показывает, сколько таких операций записи в секунду может выполнить том. Запустите её на целевом томе и на диске вашего основного сервера. Разрыв в показателях — причина, по которой не стоит переносить базу данных.
Почтовый спул имеет схожий профиль нагрузки. Формат Maildir хранит по одному файлу на каждое сообщение, и агент доставки синхронизирует каждый из них, поэтому диск обрабатывает поток мелких синхронных записей. Установка пакетов, загрузка образов контейнеров, операции git в больших репозиториях и распаковка архивов создают аналогичную нагрузку: тысячи мелких файлов, каждый из которых требует операций с метаданными.
Симптомы легко распознать. Система не загружена, но всё работает медленно. top показывает высокое значение wa — это доля времени, в течение которого процессор ожидал завершения операций ввода-вывода. Утилита iostat -x 1 из пакета sysstat показывает высокий показатель в столбце await и значение %util, близкое к предельному, в то время как r/s и w/s остаются низкими. Устройство, которое занято, но при этом передает малый объем данных, — это признак случайного доступа к накопителю, предназначенному для хранения больших объемов данных.
Является ли том моего VPS сетевым хранилищем?
Часто это именно так, и это меняет суть дела. При планировании емкости терабайты данных нередко размещаются в отдельной системе хранения, доступной по сети, а не на диске внутри машины, где запущена ваша виртуальная машина. Каждая операция чтения проходит через канал связи, который используют и другие клиенты. К времени обращения к диску добавляется сетевая задержка, а пропускная способность канала ограничена лимитом, который вы не контролируете.
Начните с того, что сообщает ядро системы.
findmnt -T /mnt/storage -o SOURCE,FSTYPE,OPTIONS
lsblk -d -o NAME,ROTA,SIZE,TRAN,MODEL
df -hT /mnt/storageЗначение FSTYPE, равное nfs4 или cifs, однозначно указывает на сетевое хранилище. Блочное устройство virtio почти ничего не говорит, так как один и тот же узел устройства может быть локальным разделом NVMe, массивом жестких дисков в соседней стойке или распределенным кластером, и гостевое ядро не видит разницы. ROTA также малоинформативен: он сообщает то, что заявляет гипервизор, поэтому 0 в этом поле не является доказательством использования flash-памяти.
Поскольку вы не можете получить ответ напрямую от системы, измерьте задержку.
sudo apt update && sudo apt install -y ioping
ioping -c 20 -D /mnt/storage
ioping -c 20 -D /-D запрашивает прямой ввод-вывод (direct I/O), поэтому кэш страниц не может ответить вместо диска. Сравните показатели тома с корневой файловой системой на машине, которая в остальном простаивает. Значительный и постоянный разрыв в показателях указывает на влияние сети. Затем повторите тот же тест вечером. Если задержка меняется в зависимости от времени суток, значит, ресурс является общим, и вы — один из тех, кто его делит.
Снапшот на той же платформе не является удаленной резервной копией
Снапшоты полезны, но они не являются резервными копиями. Снапшот провайдера находится в той же учетной записи, на той же платформе и защищен теми же учетными данными. Он защищает от случайного удаления файла. Он не защищает от закрытия учетной записи из-за неоплаты, кражи пароля от панели управления или инцидента на платформе, при котором пострадает как хранилище, так и его снапшоты. Такие копии выходят из строя одновременно, так как изначально не были независимыми.
Храните хотя бы одну копию на инфраструктуре, которая не имеет ничего общего с основной, в чем и заключается смысл использования второго VPS в качестве удаленного хранилища резервных копий. VPS для хранения данных отлично подходит для размещения такой копии. Это плохой вариант для хранения единственной копии.
Как измерить скорость диска на VPS с помощью fio
Все приведенные ниже действия проверены в Ubuntu 24.04 в сентябре 2026 года. fio, ioping и sysstat доступны в стандартных репозиториях, поэтому сторонние источники не требуются.
sudo apt update && sudo apt install -y fio
sudo install -d -o "$USER" -g "$USER" /mnt/storage/fio
df -h /mnt/storage
free -gДва правила перед первым запуском. Используйте --direct=1 в каждом задании, так как этот флаг обходит страничное кэширование; в противном случае тест измерит скорость оперативной памяти, а не диска. Установите --size больше объема оперативной памяти, который показывает free -g, по той же причине. Сначала проверьте df -h, чтобы тестовые файлы гарантированно поместились на диске.
Последовательная запись — показатель, важный для хранилища резервных копий:
fio --name=seqwrite --directory=/mnt/storage/fio --rw=write \
--bs=1M --size=8G --numjobs=1 --iodepth=8 --ioengine=libaio \
--direct=1 --end_fsync=1 --group_reportingПоследовательное чтение — показатель, важный для потоковой передачи данных:
fio --name=seqread --directory=/mnt/storage/fio --rw=read \
--bs=1M --size=8G --numjobs=1 --iodepth=8 --ioengine=libaio \
--direct=1 --group_reportingfio создает тестовый файл при первом использовании имени задания, поэтому задание на чтение сначала запишет файл, а затем прочитает его. Это ожидаемое поведение, фаза подготовки файла не учитывается в итоговом результате.
Случайное чтение блоками 4k — показатель, определяющий производительность баз данных:
fio --name=randread --directory=/mnt/storage/fio --rw=randread \
--bs=4k --size=8G --numjobs=1 --iodepth=32 --ioengine=libaio \
--direct=1 --runtime=300 --time_based --group_reportingСмешанная случайная нагрузка, которая ближе к реальной работе приложений:
fio --name=randrw --directory=/mnt/storage/fio --rw=randrw --rwmixread=70 \
--bs=4k --size=4G --numjobs=4 --iodepth=16 --ioengine=libaio \
--direct=1 --runtime=300 --time_based --group_reportingСледите за --numjobs в последнем примере. fio создает по одному файлу на каждое задание, поэтому четыре задания с --size=4G запишут в сумме 16G, а не 4G. Проверьте свободное место перед запуском, так как заполнение раздела до нуля приведет к сбою в работе системы.
В выводе программы обращайте внимание на три параметра. bw= — это пропускная способность. IOPS= — количество операций в секунду, этот показатель имеет смысл только в контексте заданных bs и iodepth. Блок clat percentiles — это то, что многие пропускают, хотя именно он показывает реальную отзывчивость системы: 99-й перцентиль задержки отражает время ожидания для самых медленных запросов. Если медианное значение хорошее, а 99-й перцентиль очень высокий, значит, очередь запросов блокируется под нагрузкой.
Сохраняйте результаты в текстовый файл, а не делайте скриншоты терминала.
fio --output-format=json --output=/mnt/storage/fio/randread-1.json \
--name=randread --directory=/mnt/storage/fio --rw=randread \
--bs=4k --size=8G --numjobs=1 --iodepth=32 --ioengine=libaio \
--direct=1 --runtime=300 --time_based --group_reportingТестовые файлы занимают много места, поэтому удалите их после завершения работы. rm -rf /mnt/storage/fio удалит только созданную вами директорию.
Не публикуйте результаты одного запуска
Один запуск fio — это лишь частный случай. Различные обычные факторы, влияющие на общую инфраструктуру, изменят результат.
- Первая запись в блоки, которые ранее не использовались, может отличаться от перезаписи на хранилищах с thin provisioning, поэтому отбрасывайте первый запуск и сохраняйте последующие.
- Уровень кэширования или лимит burst-производительности могут сделать первые секунды работы отличными, в то время как установившееся состояние будет обычным.
--time_based --runtime=300запускайте тест достаточно долго, чтобы понять, с чем именно вы имеете дело. - Соседи по серверу используют общий массив и канал связи. Результаты в 03:00 и в 20:00 могут различаться, поэтому учитывайте оба.
Выполняйте каждое задание не менее трёх раз в разное время суток и указывайте медианное значение вместе с диапазоном отклонений. Если этот диапазон велик, то именно разброс значений является самым полезным результатом, так как он показывает разницу между предсказуемым томом и тем, на который нельзя полагаться. Эта дисциплина применима к любым показателям VPS, которые вы собираете, а более широкий метод честного тестирования VPS охватывает те же проблемы применительно к CPU и сети.
Типовое решение: быстрый компактный сервер и вместительный медленный
Когда у вас есть два целевых показателя, архитектура системы определяется почти сама собой, и редко когда это одна машина. Разместите рабочие нагрузки на небольшом сервере с быстрой локальной дисковой подсистемой: базу данных, приложение, сборку контейнеров, очередь почты. Данные перенесите на сервер большой емкости: медиабиблиотеку, архивы, репозиторий restic, логи, к которым никто не обращается. Соедините их через частную сеть провайдера, если она есть, или через туннель, если её нет.
Такая схема — это то, для чего нужно использование хранилища VPS в паре с основным VPS. Это эффективнее, чем покупка одной большой и быстрой машины, так как вы платите за скорость только для той части данных, которой она действительно нужна. Если вы всё ещё выбираете, разница между хранилищем VPS и обычным VPS — это то же самое соотношение, представленное как рыночное решение; что дают NVMe по сравнению с SATA SSD описывает быструю часть связки, а расчет необходимого объема в терабайтах поможет не покупать лишнее место, которое вы никогда не заполните. Перед оформлением подписки используйте чек-лист для выбора хранилища VPS и прямо спросите провайдера, является ли том локальным или сетевым. Провайдер, который не отвечает на этот вопрос, уже дал вам важную информацию.
FAQ
Достаточно ли быстр storage VPS для работы базы данных?
Обычно нет, если речь о самой базе данных. Операция фиксации (commit) ожидает завершения синхронной записи на диск, поэтому пропускная способность не имеет значения, а скорость транзакций определяется задержкой записи. Запустите pg_test_fsync на томе хранилища и на обычном серверном диске, а затем сравните полученные показатели. Храните базу данных на быстром локальном накопителе, а storage VPS используйте для дампов и архивированных журналов предзаписи (write-ahead logs).
Как узнать, является ли том моего storage VPS сетевым?
findmnt -T /mnt/storage -o SOURCE,FSTYPE,OPTIONS прямо указывает на это, если используется NFS или SMB. Блочное устройство virtio скрывает этот факт, так как ядро гостевой системы видит одинаковое устройство независимо от того, находится ли хранилище локально или в другой стойке. Вместо этого проведите измерения: запустите ioping -c 20 -D /mnt/storage и сравните результат с той же командой для /, повторив тест в разное время суток. Задержка, меняющаяся в зависимости от времени, указывает на использование общей инфраструктуры.
Почему результаты fio намного лучше, чем производительность в реальной задаче?
Обычно причина кроется в отсутствии --direct=1, из-за чего кэш страниц (page cache) обрабатывает операции чтения, и тест фактически измеряет скорость оперативной памяти. Параметр --size, меньший объема RAM сервера, приводит к тому же результату по той же причине. Короткие тесты также завышают показатели, так как кэширующий уровень или лимит burst-производительности могут покрыть первые секунды работы, а затем исчерпаться. Используйте прямой ввод-вывод (direct I/O), рабочий набор данных, превышающий объем RAM, и --time_based --runtime=300.
Является ли снапшот от провайдера резервной копией?
Нет. Снапшот хранится в той же учетной записи на той же платформе, поэтому он защищает только от ваших собственных ошибок при работе с файлами, но не от инцидентов, затрагивающих аккаунт или платформу целиком. Блокировка аккаунта, кража доступа к панели управления или сбой на стороне провайдера приведут к потере и оригинала, и снапшота. Храните одну копию на инфраструктуре, которая не имеет общих точек отказа с основной системой.
Можно ли транслировать 4K-видео со storage VPS?
Чтение файла происходит последовательно, а плеер использует буферизацию, поэтому ограничением редко становится диск. Обычно узким местом выступают два других фактора. Сетевой лимит тарифного плана определяет количество одновременных потоков, которые могут покинуть сервер, а транскодирование — это нагрузка на CPU, для которой подобные тарифы не предназначены. Измерьте скорость последовательного чтения с помощью указанного выше теста fio, а затем проверьте возможности CPU и политику использования полосы пропускания, прежде чем рассчитывать количество потоков.