Нагрузочная проверка InkVault
Отчет для владельцев XMPP-сервера на VPS: будет ли сервер корректно работать с InkVault, сколько пользователей он выдержит и что проверить в настройках.
attributes
- project
- InkVault
- server
- Prosody 13.0.7, Lua 5.4
- storage
- SQLite, журнал delete, synchronous FULL
- dataset
- 100 пользователей по 200 записей, шифротекст записи 900 байт
- rate_limit
- 10 КБ/с на подключение
- date
- 2026-10-20
Вывод
VPS с 1 ядром, 1 ГиБ памяти и каналом 200 Мбит/с справляется с InkVault. Для личного сервера, семьи и небольшой группы, примерно до 100 пользователей, ресурсов хватает с большим запасом.
На проверке сервер не допустил ни одной ошибки и не потерял ни одного уведомления, в том числе при нагрузке, в 10 раз превышающей его возможности. Вывод верен при условиях:
- Prosody хранит данные в SQLite (storage = "sql"), как на стенде проверки
- В хранилище до 256 записей, это лимит по умолчанию
- Диск VPS на SSD
- 0ошибок на 307 977 операций
- 0потерянных уведомлений о новых записях
- 37 мс99% запросов быстрее при 100 операциях в секунду
- 30 МиБпамяти занимает Prosody с 50 подключенными клиентами
Как InkVault работает с сервером
InkVault хранит записи на вашем XMPP-сервере через PEP (XEP-0163), стандартный механизм личных данных учетной записи. Записи шифруются на устройстве, сервер хранит только шифротекст и служебные поля: идентификатор записи и версию ключа. Отдельный сервер или база для InkVault не нужны.
Для сервера это значит следующее. Подключение устройства - самая затратная операция: сервер отдает все записи сразу. Сохранение - одна небольшая запись и одна транзакция в базе с записью на диск. Между подключениями устройство ничего не запрашивает, изменения приходят уведомлениями.
Как проверяли
Генератор нагрузки вел себя как клиенты InkVault: подключался к Prosody по XMPP с TLS, загружал хранилища, сохранял и читал записи. Размер и формат записей такие же, как у InkVault.
| Проверка | Нагрузка | Длительность | Результат |
|---|---|---|---|
| Обычная нагрузка, 2 прогона | 50 клиентов, 100 операций в секунду | по 5 мин | 100 оп/с выдержаны, ошибок 0 |
| Стресс | 500 клиентов, рост до 3000 операций в секунду | 15 мин | предел сервера 260-280 оп/с, ошибок 0 |
Операция - один запрос клиента: загрузка всего хранилища (8% запросов), сохранение записи (20%) или чтение одной записи (72%).
Время ответа и нагрузка
До 180 операций в секунду время ответа почти не меняется. Дальше запросы начинают ждать друг друга, а при 260-280 операциях в секунду сервер выходит на предел: обрабатывать больше он не успевает, и растет только время ответа.
- Медиана: половина запросов быстрее
- 1 из 100: самые медленные запросы
Данные графика
| Нагрузка, оп/с | Обработано, оп/с | Медиана, мс | 1 из 100, мс |
|---|---|---|---|
| 20 | 20 | 3.7 | 44 |
| 60 | 59 | 5.2 | 38 |
| 100 | 100 | 7.1 | 78 |
| 140 | 138 | 7.5 | 79 |
| 180 | 180 | 18.7 | 131 |
| 220 | 220 | 87 | 219 |
| 260 | 253 | 79 | 285 |
| 300 | 263 | 263 | 395 |
| 340 | 274 | 863 | 1168 |
- 0.9 мсмедиана при 100 операциях в секунду
- 37 мс99% запросов быстрее
- 117 мссамый долгий запрос за 5 минут
- не растетвремя ответа за 5 минут работы
Что нагружает сервер
Prosody обрабатывает запросы всех пользователей по одному, в одном потоке. Пока выполняется долгая операция, остальные запросы ждут.
Самая долгая операция - загрузка всего хранилища при подключении устройства. В тесте это 8% запросов, но половина времени работы сервера.
- Загрузка хранилища
- Сохранение записи
- Чтение одной записи
Данные графика
| Операция | Доля запросов | Доля времени сервера |
|---|---|---|
| Загрузка хранилища | 8% | 50% |
| Сохранение записи | 20% | 35% |
| Чтение одной записи | 72% | 15% |
Время загрузки растет вместе с числом записей. Если поднять лимит до нескольких тысяч записей, каждое подключение такого пользователя будет задерживать весь сервер на секунды.
Данные графика
| Записей | Быстрый процессор | Медленный процессор |
|---|---|---|
| 256 | 28 мс | 95 мс |
| 1000 | 110 мс | 370 мс |
| 10 000 | 1100 мс | 3700 мс |
Хватит ли ресурсов VPS
Расчет для VPS с 1 ядром, 1 ГиБ памяти и каналом 200 Мбит/с. 100 пользователей InkVault, у каждого 2-3 устройства, 10-30 подключений и около 5 сохранений в сутки, до 256 записей.
-
Процессор: до 4 мин в сутки
Сервер занят запросами InkVault от 30 секунд до 4 минут в сутки, меньше 0.3% времени. Второе ядро не нужно: Prosody работает в одном потоке.
-
Память: 250-400 МБ из 1 ГиБ
Система 150-250 МБ, Prosody 30-60 МБ, кеш базы около 70 МБ. Свободно больше половины памяти.
-
Диск: база около 70 МБ
2.8 КБ на запись вместе с индексами. Одно сохранение записывает на диск до 400 КБ: страницы базы и журнал транзакции. Для SSD при личном использовании это незначительный объем.
-
Сеть: около 4 с после перезапуска
В обычной работе InkVault использует доли процента канала. После перезапуска сервера 300 устройств загружают около 105 МБ, это около 4 секунд работы канала 200 Мбит/с.
-
После перезапуска: 7-22 с
За это время все 300 устройств снова загружают хранилища. Сервер выполняет загрузки по очереди, поэтому в эти секунды он отвечает медленнее обычного. Для 500 пользователей это уже от 35 секунд до 2 минут.
Сколько пользователей выдержит такой VPS
-
1-100 пользователей
Подходит с большим запасом.
-
100-500 пользователей
Вероятно, подходит. Проверьте на своем VPS: многое зависит от скорости его процессора.
-
Больше 500 пользователей
Не проверялось. Нужна отдельная проверка на целевом сервере.
Что будет при перегрузке
В стресс-проверке сервер получал запросов в 10 раз больше, чем мог обработать.
- 3000операций в секунду запрошено
- 264операции в секунду обработано
- 0ошибок и потерянных уведомлений
- около 2 свремя ответа вместо миллисекунд
Сервер не завершился с ошибкой и не потерял данные: все запросы выполнены, все уведомления доставлены, ответы замедлились. После снижения нагрузки накопленная очередь обработана. Нагрузка личного сервера в сотни раз ниже этого уровня.
Что проверить на сервере
Настройки в файле prosody.cfg.lua. После изменения перезапустите Prosody.
Хранилище SQLite
Выводы отчета относятся к хранилищу SQLite. По умолчанию Prosody хранит данные в файлах (internal), этот вариант не проверялся. Переключение на SQLite:
storage = "sql"
sql = { driver = "SQLite3", database = "prosody.sqlite" }
Нужен пакет LuaDBI для SQLite, в Debian и Ubuntu это lua-dbi-sqlite3. Существующие данные переносятся утилитой prosody-migrator.
Лимит записей хранилища
Лимит задает pep_max_items. Значение по умолчанию 256 совпадает с лимитом хранилища InkVault по умолчанию. Если записей нужно больше, увеличьте лимит:
pep_max_items = 10000
Модуль PEP
Модуль pep входит в стандартную конфигурацию Prosody и обычно уже включен в modules_enabled. Проверка проводилась на Prosody 13.0.7.
Скорость диска
Скорость сохранения зависит от того, как быстро диск подтверждает запись. Проверка для опытных пользователей, файл создается рядом с базой Prosody и удаляется после теста:
fio --name=fsync --filename=/var/lib/prosody/fio-test --rw=write --bs=4k --size=16m --fsync=1 --ioengine=syncrm /var/lib/prosody/fio-test
Если в блоке sync percentiles значение 99.00th не больше 3000 usec, диск подходит.
Ограничение скорости
Если на сервере включено ограничение скорости подключений (модуль limits, например 10 КБ/с), первый импорт 256 записей займет около 50 секунд. Это работа ограничения, а не ошибка.
Резервная копия
Хранилище InkVault находится в базе Prosody. Копию можно сделать без остановки сервера:
sqlite3 /var/lib/prosody/prosody.sqlite ".backup '/var/backups/prosody.sqlite'"
Путь к базе зависит от установки.
SQLite и PostgreSQL
Все выводы отчета получены на стенде с SQLite и 100 пользователями. Для небольшого сервера SQLite достаточно.
PostgreSQL стоит выбрать для сервера на сотни пользователей и больше. В контрольном замере на этом же стенде с PostgreSQL сервер записывал на диск в 4-5 раз меньше на одно сохранение. Время ответа и нагрузка на процессор были близки к SQLite: Prosody выполняет запросы к любой базе по одному в своем потоке, поэтому на число запросов в секунду выбор базы влияет мало.
| Контрольный замер, 100 оп/с | SQLite | PostgreSQL |
|---|---|---|
| Запись на диск на одно сохранение | 394 КБ | 85 КБ |
| Процессор Prosody | 43% | 43% |
| Время ответа: медиана / 1 из 100 | 6.3 / 77 мс | 7.3 / 159 мс |