Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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_size
  • group_commit.max_wait_us
  • checkpoint.interval_ms
  • checkpoint.target_ms
  • checkpoint.dirty_ratio_soft|hard
  • writeback.max_bytes_per_sec
  • txn.max_write_set_pages|bytes
  • buffer_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 проекта).

Дальше