Эволюция продукта
Критерии приёмки требуют поиска быстрее секунды на пятидесяти тысячах записей и свидетельства не дольше пяти секунд. Здесь — что получилось на самом деле, на каком железе и чего эти цифры не говорят.
Локальная машина
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, но нет наблюдения, которое бы считало простои. - Про восстановление на точку времени. Проверяется восстановлением из копии, а не измерением скорости.
- Про страницу целиком. Меряется путь до данных: запрос, правила доступа, сборка ответа. Отрисовка, размер разметки и дорога до браузера сюда не входят.