Performance Tuning Guide
Операторский baseline по performance tuning для early releases.
Каноничный источник: этот runbook в angarabook/src/operations/.
Scope
Фокус:
- buffer pool / checkpoint / writeback;
- TL/WAL durability и group commit;
- no-steal guardrails для больших транзакций.
Core principle (MVP)
MVP использует no-steal:
- uncommitted страницы не flush на диск;
- корректность recovery упрощается, но нужны жесткие guardrails по write pressure.
Quick profiles
OLTP (short transactions)
durability = sync_at_commit(strict) для максимальной надёжности, илиgroup_commitс маленькимgroup_commit.max_wait_usдля меньшей latency.- Консервативные лимиты
txn.max_write_set_pages. buffer_pool.backpressure.mode = blockдля предсказуемого поведения.
Analytics / long queries
- Допустим более высокий write set ceiling.
buffer_pool.backpressure.mode = fail_fast, если приоритет latency/SLO.- Усиленный контроль tail latency commit при
group_commit.
Storage Compression (RM-0.6.4.8+)
- Сжатие страниц (Page Compression) включается через
CREATE TABLE ... WITH (compression='lz4'). - При интенсивном чтении сжатых страниц следите за метрикой
angarabase_buffer_pool_decomp_spill_total. Если она растет, возможно, стоит ограничить concurrency или увеличить ресурсы. - В случае сбоя сжатия при вытеснении страницы (eviction), система откатывается к записи без сжатия (fail-open) и инкрементирует
angarabase_compression_downgrade_total.
SIMD Float Aggregation (RM-0.6.6.5)
- Агрегатные функции
SUM(float4)иSUM(float8)автоматически используют SIMD инструкции (AVX2 или NEON) при наличии поддержки процессором. - Это значительно ускоряет аналитические запросы над числами с плавающей точкой.
- Если SIMD недоступен, система прозрачно переходит на скалярную реализацию, инкрементируя метрику
angarabase_simd_agg_fallback_total.
Adaptive Hash-Join (RM-0.6.6.5)
- Планировщик автоматически меняет местами стороны Build и Probe в Hash Join, если фактическое отношение их размеров превышает порог
adaptive_hash_join_swap_ratio(по умолчанию 4). - Это позволяет использовать меньшую таблицу для построения хэш-таблицы, экономя память и уменьшая вероятность сброса на диск (spill).
- Факт переключения фиксируется в метрике
angarabase_adaptive_probe_swap_total.
Snapshot Age Dampening и производительность JOIN
При длинных транзакциях (snapshot age > ANGARABASE_STATS_DRIFT_MAX_AGE_MS, default 30s)
планировщик автоматически пропускает HashJoin в пользу spill-safe стратегии.
Это может снижать производительность JOIN-запросов внутри долгих транзакций.
Рекомендации:
- Для долгих аналитических транзакций: увеличить
ANGARABASE_STATS_DRIFT_MAX_AGE_MSили установить в0для отключения (если статистика актуальна). - Следить за
angarabase_optimizer_drift_fallback_total— резкий рост указывает на долгие транзакции с устаревшими снапшотами. - Запускать
ANALYZEрегулярно для поддержания актуальности статистики.
Dev / test
- Допустим
durability = relaxed(осознанно). txn.statement_timeout_ms = 0.fail_fastполезен для раннего обнаружения перегрузки.
Knobs (MVP list)
durability = sync_at_commit|strict|group_commit|relaxed(env:ANGARABASE_TRANSACTION_LOG_DURABILITY)sync_at_commit/strict— fsync на каждом COMMIT (max durability, RM-0.6.4.0)group_commit— pump коалесцирует fsync (default, production)relaxed— без fsync (dev/bench только)
group_commit.max_batch_sizegroup_commit.max_wait_uscheckpoint.interval_mscheckpoint.target_mscheckpoint.dirty_ratio_soft|hardwriteback.max_bytes_per_sectxn.max_write_set_pages|bytesbuffer_pool.uncommitted_pages_ratio_hard(RM-0.6.3.9 §S5+§S9 rename; old name removed without alias)buffer_pool.backpressure.mode = block|fail_fast[execution].index_cardinality_threshold(по умолчанию 0.15, env:ANGARABASE_INDEX_CARDINALITY_THRESHOLD)- Если селективность предиката строго выше этого порога, индексный скан по одиночному ключу отклоняется (
seq scan chosen: low cardinality).
- Если селективность предиката строго выше этого порога, индексный скан по одиночному ключу отклоняется (
[execution].index_scan_selectivity_threshold(по умолчанию 0.05, env:ANGARABASE_INDEX_SCAN_SELECTIVITY_THRESHOLD)- Если селективность не ниже этого порога, индексный скан также отклоняется (
seq scan chosen: low selectivity). - На смешанных OLTP-нагрузках фильтр может давать ~10–15% строк: кардинальный порог уже пропускает план, а порог селективности 0.05 — нет; тогда повысьте
index_scan_selectivity_threshold(например до 0.15) в конфиге и перезапустите процесс.
- Если селективность не ниже этого порога, индексный скан также отклоняется (
[execution].late_materialization_selectivity_threshold(по умолчанию 0.3, env:ANGARABASE_LATE_MATERIALIZATION_SELECTIVITY_THRESHOLD)- Порог селективности для включения узла
LateMaterialize. Если фильтр пропускает меньше 30% строк, включается отложенная материализация колонок.
- Порог селективности для включения узла
[execution].adaptive_hash_join_swap_ratio(по умолчанию 4.0, env:ANGARABASE_ADAPTIVE_HASH_JOIN_SWAP_RATIO)- Коэффициент для адаптивного переключения сторон в Hash Join. Если отношение размеров сторон (probe/build) становится ≥ 4, стороны меняются местами для оптимизации потребления памяти.
- Меняются только через файл конфигурации (
angarabase.conf, секция[execution]) или env до старта процесса; затем обязателен рестарт сервера. SET optimizer.*/ обычныйSET ...в Simple Query protocol не меняют планировщик: pgwire возвращает успешныйCommandComplete, но значение не применяется (совместимость с клиентами). Для проверки гипотезы используйте правку конфига или env и рестарт.
Symptoms -> actions (fast path)
- Checkpoint p99 spikes: увеличить
checkpoint.target_ms, ограничитьwriteback.max_bytes_per_sec. - Frequent backpressure: уменьшить batch size, снизить
txn.max_write_set_pages, при необходимости увеличить buffer pool. - durable_lsn lag / commit tails: проверить fsync latency, подстроить
group_commitпараметры. - Slow query / plan changed: снять
EXPLAIN (VERBOSE, DIAGNOSTIC)и читать план по How to read query plans. - Unexpected SeqScan на большой таблице: прочитайте
scan_strategy_reason. Дляlow cardinalityпри необходимости снизьте[execution].index_cardinality_threshold; дляlow selectivity— повысьте[execution].index_scan_selectivity_threshold. Сначала проверьте статистику (ANALYZE,distinct_estimate). После смены порогов — рестарт.
Must-have alerts
buffer_pool_backpressure_active == 1дольше порога.buffer_pool_uncommitted_dirty_ratioвыше hard-limit.- Рост
txn_write_set_limit_exceeded_total. - GC/watermark stall (по SLO проекта).
Дальше
- How to read query plans — как читать
EXPLAIN, cost/rows,Vector*,replan_reason,cache_statusиreason_codes. - Observability metrics checklist — что обязательно мерить до и после изменений тюнинга.
- Parallel runtime observability runbook — для CPU-bound нагрузок и DOP-капов.
- jemalloc heap profiling runbook — если узкое место — память, а не CPU.
- MVCC and GC operator minimum — если рост latency коррелирует с GC backlog.