§ Продуктивність та масштабування

Performance tuning UBD: 7 параметрів що дійсно впливають

На основі бенчмарків: 7 параметрів конфігурації, які дають 80% performance gains.

ЧАС: 14 хв читанняСКЛАДНІСТЬ: Розширена

У документації UBD понад 200 параметрів конфігурації. Експерименти на тест-стенді Xeon Gold 6248R 24c×2 / 192GB / NVMe показали: 7 з них дають близько 80% усього виграшу продуктивності. Інші 193 — корисні в окремих випадках, але для більшості систем їх дефолтні значення оптимальні. Стаття описує саме ці 7 з конкретними значеннями і мікро-бенчмарками.

Тест-стенд і методологія

Усі цифри нижче — з референсного стенду: 2× Intel Xeon Gold 6248R (24 ядра кожен, 48 потоків загалом), 192 GB RAM, локальний NVMe (Samsung PM1733), 10 Gbit мережа, MS SQL Server 2019. Базовий сценарій навантаження: 5000 одночасних користувачів, mixed workload (70% читання / 30% запис) з повною авторизацією на кожний запит.

Базова продуктивність на дефолтних налаштуваннях: близько 6000 прикладних операцій на хвилину. Мета tuning — досягти 20 000 операцій на хвилину без зміни заліза.

Параметр 1: Connection pool size

Default: 50 з'єднань. Оптимально для стенду: 200-300.

Розмір пулу з'єднань між UBD-сервером і СУБД. Замалий пул — запити чекають у черзі. Завеликий — overhead на context switching і навантаження на СУБД.

Формула першого наближення: (кількість логічних ядер × 2) + кількість дискових шпинделів. Для NVMe «шпинделі» рахуються як 4-8.

Pool sizeоперацій/хвp99 latency
50 (default)6 200180 мс
1009 800120 мс
20014 50080 мс
30015 10075 мс
50014 200110 мс (overhead)

Параметр 2: Query cache

Default: вимкнено. Оптимально: увімкнено, 2-4 GB.

Кеш результатів повторюваних запитів. Особливо ефективний для довідників (списки країн, статусів, ролей) і метаданих моделі — їх читають десятки тисяч разів на хвилину, а змінюються рідко.

Важливо: для змінюваних даних кеш має invalidation-логіку — записи в таблиці автоматично інвалідують відповідні запити. Для рідко-змінюваних даних — TTL (наприклад, 5 хвилин).

Виграш: +30% пропускної здатності на типовому workload, +60% на read-heavy.

Параметр 3: AuthZ policy compilation cache

Default: 100 політик. Оптимально: 5000-10000.

UBD виконує авторизацію на кожний запит через policy engine. Політики (особливо ABAC) обчислюються — це не дешева операція. Компільовані політики кешуються; повторне обчислення для тієї ж комбінації (роль × ресурс × контекст) береться з кешу.

На read-heavy workload з повторюваними патернами доступу цей кеш дає найбільший ефект — від нього один залежить ~25% всього tuning gain.

Cache sizeHit rateоперацій/хв
100 (default)34%9 800
1 00078%13 200
5 00094%16 800
10 00097%17 300
50 00098%17 100 (RAM overhead)

Параметр 4: Transaction batch size

Default: 1 (кожна операція — окрема транзакція). Оптимально для масових операцій: 100-500.

При імпорті даних, масових оновленнях, генерації звітів — кожна окрема транзакція має overhead (BEGIN, COMMIT, журналювання). Об'єднання у батчі скорочує overhead у 50-100 разів.

Обмеження: великі батчі (>1000) утримують locks довше, блокуючи інших користувачів. Для онлайн-операцій (інтерактивна робота) batch size = 1 правильний; для офлайн-операцій — 100-500.

Параметр 5: File storage strategy

Default: файли у БД (BLOB). Оптимально: файли на файловій системі / S3, посилання у БД.

BLOB-и у БД — найпростіший варіант, але вбиває продуктивність при великих обсягах: BLOB-и потрапляють у backup, реплікацію, кеш СУБД. Файлове сховище окремо — швидше і дешевше.

Для UBD: налаштувати file storage path або S3-сумісне сховище (MinIO, AWS S3, Wasabi). У БД — тільки метадані файлу (ім'я, розмір, хеш, посилання). Це окремо корисно для регуляторики: WORM-сховище для документів реалізується на рівні файлового сховища.

Виграш на типовому документообігу: +40% пропускної здатності, -60% розмір БД.

Параметр 6: Log buffer size

Default: 4 MB. Оптимально: 64-256 MB для активних систем.

WORM-журнал подій пишеться у буфер у пам'яті, потім періодично flush на диск. Замалий буфер — частий flush, що блокує запис. Завеликий — ризик втрати останніх подій при аварійному падінні (хоча для WORM це менш критично, ніж для звичайних логів — журнал реплікується).

Для систем з активним аудитом (5000+ подій на хвилину) — 128 MB. flush кожні 1-5 секунд або при заповненні буфера.

Параметр 7: GC profile

Default: general-purpose. Оптимально: low-latency (G1GC або ZGC).

Stop-the-world паузи garbage collector — джерело p99-latency спайків. На default GC паузи можуть бути 200-500 мс при великій heap (>16 GB), що видно користувачам як «лаги».

G1GC з налаштуванням -XX:MaxGCPauseMillis=50 — стандартний компроміс. ZGC (Java 17+) — для систем з heap >32 GB, дає sub-10ms паузи навіть на 100+ GB heap.

Підсумкова таблиця

ПараметрВиграш пропускної здатностіВиграш p99
Connection pool 50→200+135%-55%
Query cache off→on+30%-25%
AuthZ cache 100→5000+72%-30%
Batch size для масових операцій+10× (тільки batch)
BLOB→file storage+40%-30%
Log buffer 4MB→128MB+8%-15%
GC general→G1+5%-70% (p99)
Кумулятивно~3.2× (6k→20k операцій/хв)~5×

Послідовність впровадження

  1. Виміряти baseline на проді (без змін).
  2. Connection pool — швидка зміна, велика користь, низький ризик.
  3. AuthZ cache — швидка зміна, велика користь, низький ризик.
  4. GC profile — потребує рестарту, але швидко відкочується.
  5. Query cache — потребує тестування invalidation для специфічних таблиць.
  6. Log buffer — низький пріоритет, малий виграш для більшості систем.
  7. File storage strategy — найбільша зміна, окремий проєкт міграції.

Чого НЕ варто tuning'увати без потреби

  • Розмір thread pool — UBD сам адаптується.
  • TCP-параметри ядра — лише для систем з 50k+ одночасних з'єднань.
  • JVM heap size — більше = краще тільки до певної межі; за 64 GB GC пауз більше, ніж виграшу.
  • Кількість worker-процесів — оптимум = ядра × 1.5, дефолт зазвичай добрий.
[ ПРАКТИЧНА РЕАЛІЗАЦІЯ ]
Референсні бенчмарки UBD

На тест-стенді 2×Xeon Gold 6248R / 192GB / NVMe з усіма 7 параметрами на оптимумі UBD досягає 20 000 прикладних операцій на хвилину з повною авторизацією. Бенчмарки і конфігураційні файли надаються партнерам за запитом. Це не маркетингова цифра — це повторюваний результат на ідентичному залізі.

UnityBaseDefense — технічна довідка →

← Усі статті: Продуктивність та масштабування  ·  Глосарій