Требования к оборудованию
Основано на нагрузочном тесте 2026-08-03 (см. bench_results_summary.md в корне проекта):
5074 документа, 35197 операций складского учёта за 1 год, реальный код process_*_doc/
rollback_document/отчёты через HTTP. Тест шёл на одной конкретной машине — часть выводов
измерена, часть — обоснованная экстраполяция. Это явно разделено ниже.
Тестовая машина
Intel Core i7-4810MQ (2013, мобильный, 2.8GHz), 15GB RAM, SATA SSD (Kingston SA400).
Не топовое, не новое железо. База ims_bench весит 10MB при указанном объёме данных —
даже дефолтный innodb_buffer_pool_size=128MB (никем не настроенный) вмещает её с запасом.
Сценарий 1 — всё на машине пользователя (локальный сервер)
Что реально влияет на скорость
RAM — почти не влияет на этом масштабе. 10MB на год работы → экстраполяция: 10 лет истории
≈ 100MB, 50 лет ≈ 500MB. Любая машина с 2GB+ RAM закеширует всю рабочую базу целиком после
первого обращения. RAM здесь не бутылочное горлышко, а вопрос "хватает ли системе в принципе"
(ОС + MySQL + PHP + браузер одновременно на одной машине).
Диск — вероятно главный фактор, но SSD/HDD напрямую не сравнивался (нет прав дропнуть
OS-кеш в тестовом окружении). Логическое обоснование: обработка документа делает несколько
точечных обновлений таблицы складских остатков построчно — случайная запись, не последовательная. На HDD (~10мс
seek) документ с 3 строками — уже 30+мс только на позиционирование головки, до всякого
CPU/SQL. На SSD та же операция — микросекунды. Тест стабильно держал ~6-10мс на откат без
деградации на обычном SATA SSD.
CPU — низкие требования. Мобильный i7 2013 года держит самый тяжёлый отчёт (1.2с на 35к
операций) без напряжения — PHP однопоточный на запрос, SQL-запросы — простые индексные
выборки, не вычислительно тяжёлые. Современный бюджетный CPU (Celeron/Pentium N-серии
2020+, mini-PC за $150) по производительности ядра сопоставим или быстрее этого i7.
Минимальный порог — локальная установка
| Компонент | Минимум | Комментарий |
|---|---|---|
| Диск | SSD, обязательно (даже дешёвый SATA) | HDD не тестировался, но структурно должен резко просаживать обработку документов (случайная запись). Не рекомендуется для рабочей системы. |
| RAM | 4GB | Не из-за требований БД (она крошечная) — а потому что ОС+MySQL+PHP+браузер одновременно реально просят этот минимум. 2GB — грань, где начинается свопинг при обычной работе. |
| CPU | Любой x86_64 2-ядерный от ~2015 года, 2GHz+ | Не CPU-bound задача на этом масштабе данных. |
| Сеть | не тестировалось | Локальная сеть — не проблема; удалённый доступ через интернет — см. Сценарий 2. |
Вывод: для объёма данных, сравнимого с протестированным (тысячи документов в год,
десятки тысяч операций), практически любой современный компьютер с SSD справится — включая
"старое" оборудование 2013-2015 годов, если в нём стоит SSD. Единственный жёсткий запрет —
HDD.
Сценарий 2 — внешний (хостинг/VPS) сервер
Локальный тест НЕ покрывает этот сценарий напрямую — здесь появляются факторы, которых при
работе "всё на одной машине" просто нет. Часть пунктов ниже — не измерения, а структурные
риски, которые стоит проверить отдельным нагрузочным тестом перед реальным продакшн-хостингом.
Что меняется по сравнению с локальной установкой
-
Реальная многопользовательская конкуренция. Смысл внешнего сервера — доступ нескольких
операторов одновременно. Локальный тест был строго последовательным (один "пользователь"),
блокировки строк таблицы складских остатков/таблицы документов при одновременном проведении документов на одни и те же
партии не проверялись вообще. Это главный неизвестный фактор — до отдельного теста с
параллельными запросами нельзя обещать, что 5-10 одновременных операторов будут работать
так же быстро, как последовательный тест показал. -
Сетевая задержка (латентность). Каждое действие в UI — HTTP-запрос (
API.call).
Отчёты в full-режиме отдают тяжёлые ответы (до ~1.5MB HTML на Stock Turnover за год) —
на медленном/дальнем канале это заметная задержка поверх времени генерации на сервере.
Локально это было 0, на внешнем сервере — зависит от географии клиента и провайдера. -
Продакшн веб-сервер обязателен. Тест использовал
php -S(встроенный dev-сервер PHP) —
он однопоточный и НЕ предназначен для реальной эксплуатации, тем более интернет-доступной.
Для внешнего сервера нужен настоящий стек (nginx/Apache + PHP-FPM с пулом воркеров) —
иначе даже 2-3 одновременных запроса будут выстраиваться в очередь. -
Безопасность при выходе в интернет. Локально риск ограничен одной машиной. Внешний
сервер требует: HTTPS/TLS обязательно (сейчас токен передаётся как query-параметр в URL
отчётов —token=..., см.reports/_auth_guard.php— это приемлемо только под TLS,
иначе токен виден в логах прокси/истории браузера), файрвол, закрытый доступ к
config/database.local.php/logs/снаружи. -
Память под конкурентность. Каждый PHP-FPM воркер и каждое соединение MySQL держат
свою память — при N одновременных пользователях требование к RAM растёт с N, а не
остаётся плоским, как в однопользовательском локальном тесте. Число N, при котором это
станет заметно, не измерено. -
Надёжность и бэкапы — ответственность смещается. На своей машине человек сам следит
за питанием/диском. На внешнем сервере это должен обеспечивать хостинг (SLA), но
резервное копирование БД (ims) всё равно остаётся обязанностью проекта — см. правило
"копия IMS2 на диск обязана включать SQL-дамп БД".
Минимальный порог — внешний сервер (VPS/хостинг)
Учитывая, что сама рабочая нагрузка (по данным локального теста) очень лёгкая — ограничения
здесь определяются не объёмом данных, а конкурентным доступом и требованиями к вебсерверу:
| Компонент | Минимум | Комментарий |
|---|---|---|
| CPU | 2 vCPU | Больше — под рост числа одновременных пользователей, не под объём данных. |
| RAM | 2-4GB | Планка выше, чем локально: PHP-FPM пул + MySQL + ОС на выделенном сервере без браузера — но с запасом на конкурентность. |
| Диск | SSD/NVMe (у всех современных VPS-провайдеров по умолчанию) | Тот же аргумент, что и локально — только строже, т.к. на сервере диск шарится между всеми одновременными операциями. |
| Сеть | HTTPS обязателен, канал от 10Mbps | Из-за передачи токена в URL отчётов и объёма HTML-ответов тяжёлых отчётов. |
| Веб-сервер | nginx/Apache + PHP-FPM, НЕ php -S |
Однопоточный dev-сервер не выдержит параллельных запросов. |
Тест конкурентности (2026-08-03) — вопрос закрыт эмпирически
Изначально этот вопрос был открытым (см. историю ниже) — проверено отдельно, через
nginx + PHP-FPM (не php -S), пул воркеров и CPU физически ограничены до 2 ядер
(taskset -c 0,1, pm.max_children=4) — честная симуляция VPS 2 vCPU, не всей тестовой
машины (8 ядер). Нагрузка — самый тяжёлый эндпоинт из раздела "Рост времени операций"
(Stock Document Turnover, full-режим, весь год), одновременные запросы через curl_multi
(scripts/bench_concurrency.php — замена ab/wrk, которых нет в системе без sudo).
| Конкурентность | Запросов/сек | Задержка avg / p95 | Ошибок |
|---|---|---|---|
| 1 | 0.70 | 1.4с / 1.6с | 0 |
| 5 | 2.63 | 1.7с / 2.3с | 0 |
| 10 | 2.98 | 2.9с / 3.6с | 0 |
| 20 | 3.03 | 5.7с / 7.0с | 0 |
Результат: пропускная способность выходит на потолок ~3 запроса/сек уже при
конкурентности 10 (пул из 4 воркеров насыщается) — дальше рост нагрузки не даёт ошибок,
только растёт очередь ожидания (задержка до ~7с при 20 одновременных запросах к самому
тяжёлому отчёту сразу). 0% ошибок на всех уровнях — деградация плавная (очередь), не
отказ.
Это искусственный наихудший случай — все "клиенты" одновременно бьют в САМЫЙ тяжёлый
отчёт. Реальная нагрузка от 5-20 компаний почти всегда — смесь лёгких операций
(проведение документа ~10мс) и редких тяжёлых отчётов, не 20 одинаковых тяжёлых запросов
разом. Вывод: 2 vCPU / 4GB достаточно даже в этом худшем сценарии.
Оговорка: тест — симуляция через taskset на локальной машине, не настоящий VPS
(виртуализация, соседи по хосту, реальная сеть — другие факторы). Перед реальным запуском
стоит повторить тот же тест (scripts/bench_concurrency.php) уже на купленном VPS — те же
10 минут, но на целевом железе.
Масштаб — важная оговорка
IMS2 — закрытая система для одной организации (склад/бизнес), не публичный сервис.
Речь не идёт о тысячах или даже сотнях одновременных пользователей — реалистичный диапазон
для этого класса системы — единицы, максимум первые десятки одновременных операторов
(кладовщики, кассиры, бухгалтер, менеджер). Рекомендации выше (2 vCPU, 2-4GB RAM) рассчитаны
именно на этот масштаб, а не на интернет-нагрузку. Открытый вопрос о конкурентности — это
"выдержит ли систему 10-20 одновременных операторов без деградации", а не вопрос
горизонтального масштабирования под тысячи клиентов. Если реальное число одновременных
пользователей известно заранее (например, не больше 5-10), минимальные требования из
таблицы выше можно считать достаточными без дополнительного теста — риск конкуренции растёт
не резко, а по мере приближения к десяткам одновременных операций записи на одни и те же
партии склада.