SSD Nodes Learn Hosting plans →
Руководства Matt ConnorАвтор: Matt Connor

Можно ли запустить медиасервер на storage VPS

Разбираем пригодность storage VPS для медиасерверов. Узнайте, как рассчитать пропускную способность сети и почему ограничение CPU важнее скорости диска при транскодировании.

Можно ли запустить медиасервер на storage VPS?

Storage VPS подходит для запуска медиасервера, и для прямого воспроизведения (direct play) его ресурсов часто достаточно. Основное ограничение — транскодирование: тарифы, ориентированные на большой объем диска, обычно обладают процессором, мощности которого хватает для чтения и передачи файлов, но недостаточно для перекодирования видео с высоким битрейтом в реальном времени. Передача байтов без изменений — простая задача. Перекодирование каждого кадра — ресурсоемкая.

Ответ для вашей медиатеки зависит от трех ограничений, которые проявляются в строгом порядке.

  1. CPU. Это ограничение срабатывает в тот момент, когда клиент не может воспроизвести файл в исходном виде.
  2. Диск. Редко останавливает воспроизведение. Из-за него сканирование медиатеки происходит медленно, а веб-интерфейс может «тормозить», хотя само видео воспроизводится нормально.
  3. Сетевой порт. Это реальный предел пропускной способности, который можно рассчитать на бумаге до покупки тарифа.

Анализируйте их именно в этом порядке. Последний пункт — это простая арифметика, которая дает точный ответ, а не предположение.

Что на самом деле дает storage VPS

В случае со storage VPS основным продуктом является дисковое пространство. Вы приобретаете терабайты по цене за единицу, недоступной для обычных вычислительных тарифов, при этом процессор, оперативная память и сетевой канал подобраны так, чтобы обеспечить сохранность и доступность файлов. Низкая стоимость терабайта — веская причина для покупки такого сервера. Однако это не повод ожидать от него производительности сервера для транскодирования видео.

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

Ограничение первое: почему транскодирование упирается в возможности CPU

Медиасервер передает файл проигрывателю одним из трех способов.

  • Direct play. Сервер отправляет файл в исходном виде, а клиент декодирует его самостоятельно. Сервер только читает данные с диска и записывает их в сокет, поэтому один vCPU способен обслуживать несколько потоков.
  • Direct stream (также называется remux). Контейнер пересобирается, а видеопоток копируется кадр в кадр. Нагрузка при этом минимальна.
  • Transcode. Каждый кадр декодируется и кодируется заново с использованием другого кодека или битрейта. Это требует значительных ресурсов, которые расходуются для каждого потока отдельно.

Вы не выбираете способ передачи. Его выбирает клиент, и он принудительно включает транскодирование в следующих случаях:

  • Клиент не поддерживает кодек. Типичный пример — HEVC (high efficiency video coding) в устаревшем браузере.
  • Субтитры представлены в виде изображения, а не текста (например, PGS из Blu-ray рипа). В этом случае субтитры нужно «впечатать» в изображение, перекодировав видео вместе с ними.
  • Запрошен битрейт ниже, чем у исходного файла (по умолчанию так делают мобильные приложения при работе через сотовую сеть).
  • Контейнер не поддерживается клиентом.

Оценивайте возможности вашего сервера по результатам тестов, а не по названию модели CPU. Возьмите самый «тяжелый» файл из вашей библиотеки и перекодируйте двухминутный фрагмент.

ffmpeg -hide_banner -y -i /path/to/movie.mkv -map 0:v:0 -c:v libx264 -preset veryfast -b:v 4M -t 120 -f null -

Последняя строка вывода заканчивается полем speed=. Значение speed=1.0x означает, что сервер обрабатывает одну секунду видео за одну секунду реального времени — это предел для одного потока без запаса производительности. Воспроизведение — это не равномерная нагрузка: любое перематывание отменяет результаты работы энкодера и запускает процесс заново, поэтому при показателе ниже 2x во время обычного использования возможна буферизация. Для двух одновременных транскодирований требуется примерно двукратный запас. Обработка 4K-источников сложнее, чем кажется на первый взгляд, так как декодирование масштабируется пропорционально количеству пикселей еще до начала работы энкодера.

Затем проверьте наличие аппаратного ускорения.

ls -l /dev/dri

На большинстве VPS эта команда выведет ls: cannot access '/dev/dri': No such file or directory, так как GPU не пробрасывается в гостевую систему. Без соответствующего устройства VAAPI (video acceleration API) и Intel Quick Sync недоступны, поэтому вся нагрузка от транскодирования ложится на CPU. Аппаратное транскодирование на сервере с NVIDIA GPU — это решение другого уровня и другой ценовой категории, поэтому рассматривайте его как отдельный вариант, а не как способ модернизации текущего плана.

Способ обойти это ограничение — сделать транскодирование ненужным. Храните видео в H.264 в контейнерах MP4 или MKV, используйте текстовые субтитры, чтобы они передавались отдельно от видеопотока, а не «вшивались» в него, и установите на каждое устройство клиентское приложение, способное декодировать ваши файлы. В этом случае нагрузка на CPU будет близка к нулю, а производительность будет зависеть только от пропускной способности порта. Если ваша медиатека еще не создана, начните с пошаговой инструкции по установке Jellyfin на VPS.

Ограничение второе: реальная стоимость общего или вращающегося диска

Воспроизведение файла — это последовательное чтение со скоростью битрейта файла. Ремукс с битрейтом 25 Mbps требует около 3.1 МБ/с. Один медленный вращающийся диск справляется с последовательным чтением в сорок раз быстрее, поэтому воспроизведение не является узким местом для диска.

Диск страдает от мелких случайных операций, а медиасервер выполняет их в большом количестве. Первое сканирование библиотеки открывает каждый файл и считывает его заголовок. Генерация функции Trickplay создает превью-миниатюры, которые вы видите при перемещении ползунка поиска, и декодирует кадры, разбросанные по всему файлу. Это поиск, а не потоковая передача. База данных библиотеки — это SQLite, расположенная по пути /var/lib/jellyfin/data/library.db в пакетах Debian и Ubuntu, и каждое обновление завершается операцией fsync, которая ожидает подтверждения записи от накопителя.

На томе, разделяемом с другими пользователями, эти операции fsync выстраиваются в очередь за задачами других клиентов. Симптом специфичен, и его легко неверно истолковать: фильм воспроизводится идеально, в то время как веб-интерфейс загружает страницу несколько секунд. Это не сеть и не процессор. Это база данных, ожидающая диск.

Измерьте оба шаблона внутри директории, в которой вы действительно будете хранить медиафайлы.

sudo apt install -y fio
fio --name=seq --rw=read --bs=1M --size=2G --ioengine=libaio --direct=1 --runtime=60 --time_based --group_reporting
fio --name=rand --rw=randread --bs=4k --size=1G --iodepth=32 --ioengine=libaio --direct=1 --runtime=60 --time_based --group_reporting

Число последовательных операций показывает, сколько потоков диск может обслуживать одновременно. Число случайных операций показывает, сколько времени займет сканирование десяти тысяч файлов. Если fio выдает OS does not support direct IO, добавьте --direct=1 и читайте результат, учитывая, что кэш страниц теперь влияет на показатели. Удалите файлы seq.0.0 и rand.0.0, которые остаются после теста. Какую скорость диска ожидать от VPS для хранения данных описывает структуру этих чисел, а повторяемый способ тестирования производительности VPS позволяет сравнивать результаты между разными серверами.

Один параметр важнее остальных: временная директория для транскодирования не должна находиться на томе для хранения данных. Транскодирование непрерывно записывает сегменты HLS (HTTP live streaming) во время просмотра, и на медленном или удаленном хранилище эти записи начинают отставать, из-за чего плеер зависает, даже если у процессора есть запас мощности. Укажите в настройках воспроизведения локальный диск.

Ограничение третье: порт и расчеты, определяющие его пропускную способность

ChartTypical stored bitrates and what a 1 Gbit port allows in theory
The data behind this chart
[
  {
    "label": "1080p web rip (H.264)",
    "bitrate_mbps": 5,
    "gb_per_hour": 2.25,
    "streams_per_gigabit": 200
  },
  {
    "label": "1080p Blu-ray remux",
    "bitrate_mbps": 25,
    "gb_per_hour": 11.25,
    "streams_per_gigabit": 40
  },
  {
    "label": "4K HDR remux",
    "bitrate_mbps": 60,
    "gb_per_hour": 27,
    "streams_per_gigabit": 16
  },
  {
    "label": "Transcoded 1080p output",
    "bitrate_mbps": 4,
    "gb_per_hour": 1.8,
    "streams_per_gigabit": 250
  }
]

Это типичные опубликованные значения битрейта для каждого типа файлов, а не замеры по конкретным тарифным планам провайдеров. Правило простое: количество одновременных потоков, умноженное на битрейт, должно быть меньше скорости порта. Web-рип в 1080p с битрейтом 5 Мбит/с теоретически позволяет запустить 200 потоков на гигабитном порту. Blu-ray remux с битрейтом 25 Мбит/с дает 40 потоков. 4K HDR remux с битрейтом 60 Мбит/с дает 16 потоков, что означает, что одно домохозяйство с двумя телевизорами будет потреблять почти весь гигабит.

Теоретический расчет оптимистичен по двум причинам. Сетевые накладные расходы протоколов и общая полоса пропускания (uplink) отнимают часть ресурсов, которую вы не видите. Более значимый фактор — буферизация: клиент при прямом воспроизведении (direct play) не скачивает данные с постоянной скоростью битрейта файла, а забирает их так быстро, как позволяет канал, после чего переходит в режим ожидания. Поэтому один пользователь, запускающий фильм, может на несколько секунд полностью загрузить порт. Планируйте нагрузку, не превышающую половину от теоретического значения.

Лимит трафика — это отдельное ограничение, и именно с ним домохозяйства сталкиваются в первую очередь. Скорость порта ограничивает количество одновременных просмотров. Лимит трафика ограничивает общий объем просмотра за месяц.

ChartMonthly outbound traffic by viewing habit, 30 day month
The data behind this chart
[
  {
    "label": "One stream, 1080p at 5 Mbps, 2 h a day",
    "hours_per_month": 60,
    "gb_per_month": 135
  },
  {
    "label": "Two streams, 1080p at 5 Mbps, 3 h a day",
    "hours_per_month": 180,
    "gb_per_month": 405
  },
  {
    "label": "Two streams, 1080p at 5 Mbps, 6 h a day",
    "hours_per_month": 360,
    "gb_per_month": 810
  },
  {
    "label": "Two streams, remux at 25 Mbps, 6 h a day",
    "hours_per_month": 360,
    "gb_per_month": 4050
  }
]

Два человека, смотрящие видео в 1080p по вечерам, потребляют 810 ГБ в месяц при 360 часах просмотра. Если оставить тот же объем просмотра, но перейти на Blu-ray remux, те же 360 часов потребуют 4050 ГБ, что близко к 4 ТБ. Битрейт хранимых файлов напрямую влияет на счет за трафик, и это единственный параметр в данных расчетах, который вы полностью контролируете.

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

Разделение: библиотека на хранилище, приложение на быстром сервере

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

Используйте для монтирования unit-файл automount вместо монтирования при загрузке системы.

10.0.0.10:/srv/media  /mnt/media  nfs4  rw,hard,noatime,rsize=1048576,wsize=1048576,noauto,x-systemd.automount  0 0

noauto,x-systemd.automount монтирует общий ресурс при первом обращении, а не при загрузке. Благодаря этому, если хранилище кратковременно недоступно, задержится только открытие одной директории, а не весь процесс загрузки системы. Проверьте статус через findmnt /mnt/media, затем убедитесь, что сервисная учетная запись может читать данные через sudo -u jellyfin ls /mnt/media. Ошибка permission denied при успешном просмотре пути от имени root указывает на несовпадение ID пользователей: NFS сравнивает числовые ID, поэтому пользователю jellyfin нужен одинаковый UID на обеих машинах, а стандартная опция экспорта root_squash отображает root в nobody.

Храните базу данных на локальном диске. SQLite зависит от блокировки файлов, которую сетевые файловые системы не обеспечивают надежно, и сбои при этом не сопровождаются понятными сообщениями об ошибках. Вы получите database is locked при одновременном доступе и database disk image is malformed после некорректного завершения работы, после чего библиотеку придется восстанавливать из резервной копии. База данных занимает мало места, поэтому использование локального диска не требует затрат.

Держите директорию загрузок и библиотеку на одной файловой системе. Импорт с использованием hardlink происходит мгновенно и не занимает дополнительного места. Импорт между двумя файловыми системами — это полное копирование, которое при работе через сетевой mount заставляет файл дважды передаваться по сети без необходимости. На практике это означает запуск стека arr в Docker Compose на сервере-хранилище рядом с файлами, при этом через mount данные читает только медиасервер.

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

Четыре теста, которые нужно выполнить перед принятием решения
  1. Закодируйте две минуты вашего самого «тяжелого» файла с помощью команды ffmpeg и посмотрите на speed=. Значение ниже 2x означает, что транскодирование этого файла невозможно.
  2. Запустите оба теста fio в медиадиректории. Результат последовательного чтения определяет работу потоков. Результат случайного чтения определяет время сканирования библиотеки.
  3. Запустите iperf3 -s на одной машине и iperf3 -c 10.0.0.10 -R на другой, затем скачайте один реальный файл на устройство в той сети, из которой вы будете смотреть контент. Второй тест учитывает все факторы, которые упускает первый.
  4. Установите vnstat, оставьте его работать на неделю, затем выполните vnstat -m. Это покажет ваш реальный ежемесячный трафик, а не оценочный.

Когда честный ответ — это домашний NAS

Если все зрители живут в одном доме, сервер должен находиться в этом же доме. Локальная сеть обеспечивает скорость в один гигабит или выше без ограничений по трафику и ежемесячных платежей. 4K-ремуксы воспроизводятся без необходимости рассчитывать битрейт, а эксплуатационные расходы сводятся к оплате электроэнергии. VPS оправдывает себя, когда вы смотрите контент вне дома, делитесь им с людьми в других местах, когда исходящая скорость вашего домашнего интернета не позволяет передать даже один поток или когда вы не хотите держать постоянно включенное оборудование дома. Сначала проверьте исходящую скорость: для ремукса с битрейтом 25 Мбит/с требуется большая пропускная способность, чем есть у многих домашних подключений.

Даже если выбран NAS, VPS для хранения данных остается полезным инструментом. Удаленная копия медиатеки — именно то, для чего нужны дешевые терабайты. Использование VPS в качестве цели для удаленного резервного копирования потребляет значительно меньше трафика, чем стриминг, так как резервная копия отправляет каждый файл один раз, а не при каждом просмотре. Рассчитывайте объем на основе честной оценки необходимого дискового пространства, а не округления в большую сторону, и сверьтесь с чек-листом для выбора VPS под хранилище перед оплатой годовой подписки.

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

FAQ

Может ли storage VPS выполнять транскодирование 4K в 1080p?

Обычно нет, если речь идёт о реальном времени. Программное кодирование источника 4K требует декодирования в четыре раза большего количества пикселей по сравнению с 1080p, прежде чем начнётся работа энкодера, а vCPU на тарифах для хранения данных не рассчитаны на такую нагрузку. Не гадайте, а проведите тест: запустите ffmpeg -hide_banner -y -i /path/to/movie.mkv -map 0:v:0 -c:v libx264 -preset veryfast -b:v 4M -t 120 -f null - и посмотрите на значение поля speed= в последней строке. При значении ниже 1.0x поток не успевает обрабатываться, а при значении ниже 2x воспроизведение будет прерываться буферизацией при каждой попытке перемотки. Также выполните ls -l /dev/dri. Если команда вернёт No such file or directory, значит, в гостевой системе нет GPU, и аппаратное кодирование на этом тарифе недоступно.

Сколько потоков выдержит гигабитный порт?

Разделите скорость порта на битрейт файлов, которые вы раздаёте. При 5 Мбит/с для web-рипа 1080p теоретически получается 200 потоков, а при 60 Мбит/с для 4K HDR remux — 16. Планируйте нагрузку с запасом, значительно ниже этих цифр. Порт является общим, а накладные расходы протоколов реальны. Кроме того, клиент при прямом воспроизведении (direct play) старается заполнить буфер на максимально доступной скорости канала, а не ограничивается битрейтом файла, поэтому один пользователь при запуске фильма может на несколько секунд занять весь канал.

Где должна находиться база данных медиасервера при раздельной конфигурации?

На локальном диске машины, где запущено приложение, но ни в коем случае не на сетевом диске. SQLite полагается на блокировку файлов, которую сетевые файловые системы не всегда обеспечивают корректно. Поэтому база данных на NFS-шаре под нагрузкой вызывает ошибки database is locked, а после критического сбоя — database disk image is malformed. В пакетах для Debian и Ubuntu файл находится по пути /var/lib/jellyfin/data/library.db. Храните изображения метаданных и директорию для транскодирования также локально, а через сетевой диск передавайте только медиафайлы.

Потребляет ли транскодирование меньше трафика, чем прямое воспроизведение?

Да, в этом и заключается компромисс. Прямое воспроизведение передаёт файл с исходным битрейтом, поэтому remux со скоростью 25 Мбит/с расходует 25 Мбит/с исходящего трафика на каждого зрителя. Транскодирование того же фильма до 4 Мбит/с позволяет уместить 250 таких потоков в гигабитный порт. Вы платите за экономию трафика ресурсами CPU (по одному разу на каждый поток), а именно этих ресурсов на тарифах для хранения данных обычно не хватает. Хранение файлов с битрейтом, который клиенты могут воспроизводить напрямую, даёт ту же экономию трафика бесплатно.

Стоит ли использовать домашний NAS вместо storage VPS?

Если все зрители находятся в одном доме — да. В локальной сети нет учёта трафика и ежемесячных платежей, поэтому битрейт перестаёт быть ограничением. VPS выигрывает, когда вы смотрите контент вне дома или делитесь им с другими домохозяйствами. В большинстве случаев всё решает скорость исходящего соединения домашнего провайдера: многие подключения не способны передать remux со скоростью 25 Мбит/с даже в один поток. Эти решения также можно использовать совместно: NAS обслуживает дом, а storage VPS хранит удалённую копию.