Ассоциация производителей КРС голштинской породы

Эволюция продукта

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

Локальная машина

25.08.2026 · 550 680 животных · 10 прогонов

Процессор
Intel(R) Core(TM) i5-8257U CPU @ 1.40GHz, ядер 8
Память
8 ГБ
Система
darwin 24.6.0 x64
Node.js
v25.9.0
PostgreSQL
PostgreSQL 16.14 (Homebrew)
Размер базы
5596 MB
effective_cache_size
524288 8kB
max_connections
100
max_parallel_workers_per_gather
2
shared_buffers
16384 8kB
work_mem
4096 kB

Прод

25.08.2026 · 280 237 животных · 10 прогонов

База не на той машине, где шёл замер. В каждой цифре сидит задержка сети до неё — на мелких сценариях она и есть весь результат. Настоящий замер боевого сервера делается на самом сервере.

Процессор
QEMU Virtual CPU version 8.2.0, ядер 1
Память
0.9 ГБ
Система
linux 5.15.0-187-generic x64
Node.js
v22.12.0
PostgreSQL
PostgreSQL 16.14 (Ubuntu 16.14-1.pgdg24.04+1)
Размер базы
5230 MB
work_mem
436 kB
shared_buffers
13107 8kB
max_connections
25
effective_cache_size
65536 8kB
max_parallel_workers_per_gather
2

Поиск по книге

СценарийЛокальная машинаПродПорог ТЗ
первая страница без условий81 мсхудшее 332 мс222 мсхудшее 313 мс1 000 мс
номер по подстроке259 мсхудшее 262 мс458 мсхудшее 551 мс1 000 мс
кличка по подстроке317 мсхудшее 322 мс412 мсхудшее 620 мс1 000 мс
порог по удою и жиру195 мсхудшее 212 мс337 мсхудшее 420 мс1 000 мс
быки-производители (плашка)322 мсхудшее 422 мс389 мсхудшее 507 мс1 000 мс
порядок по ИПЦ78 мсхудшее 90 мс194 мсхудшее 250 мс1 000 мс
страница 200 того же отбора76 мсхудшее 89 мс196 мсхудшее 325 мс1 000 мс
страница на 500 строк521 мсхудшее 547 мс2 408 мсхудшее 3 156 мс1 000 мс

Карточка и родословная

СценарийЛокальная машинаПродПорог ТЗ
родословная, три ряда14 мсхудшее 15 мс28 мсхудшее 51 мс1 000 мс
родословная, девять рядов15 мсхудшее 15 мс34 мсхудшее 80 мс
свидетельство целиком (порог ТЗ — 5000 мс)21 мсхудшее 22 мс48 мсхудшее 134 мс5 000 мс

Кабинет хозяйства

СценарийЛокальная машинаПродПорог ТЗ
сводка по стаду (Обзор)24 мсхудшее 28 мс1 мсхудшее 1 мс1 000 мс

Выгрузка стада

СценарийЛокальная машинаПродПорог ТЗ
выгрузка 20 000 записей (таблица)13 703 мсхудшее 15 706 мс · 3 прогона
то же с развёрнутыми связями (JSON)19 929 мсхудшее 23 642 мс · 3 прогона
нижняя граница: прямой запрос к базе122 мсхудшее 131 мс · 3 прогона
через Payload, но только нужные поля6 349 мсхудшее 6 411 мс · 3 прогона
то же без подсчёта общего числа6 521 мсхудшее 7 340 мс · 3 прогона
выгрузка 20 000 записей (как в кабинете)334 мсхудшее 337 мс · 3 прогона

Чего эти цифры не говорят

  • Про пятьсот одновременных пользователей. Пятьсот пользователей — это пятьсот браузеров, своя сеть и страницы целиком; замер шлёт запросы из одного процесса в один пул соединений. Отдельный прогон с параллельностью показывает, во сколько раз проседает ответ, — но проверкой этого критерия ТЗ не является.
  • Про доступность 99,5 %. Это не замер, а мониторинг за период. У нас есть /healthz, но нет наблюдения, которое бы считало простои.
  • Про восстановление на точку времени. Проверяется восстановлением из копии, а не измерением скорости.
  • Про страницу целиком. Меряется путь до данных: запрос, правила доступа, сборка ответа. Отрисовка, размер разметки и дорога до браузера сюда не входят.