dataiotech Labs
dbaguidedbaguideDBAdataxtoolsdataopsphere
Runbooks Library/postgresql/#11
Runbook #11
postgresql
PerformanceSEV2 · DEGRADATION15-30 dakika / 15-30 minssuperuser / postgres / rds_superuser

PostgreSQL work_mem Spill and Temp Files

Locates sort/hash spills at metric and query level and reduces latency through plans, indexes and session-scoped memory tuning.

Related Metrics:M11
Related Scripts:S16S5
#work_mem#temp-files#sort#hash#pg_stat_statements

Operational Safety & Risk Notice

This runbook contains operational intervention steps; several are write-impacting (KILL, terminate, DROP, RESIZE). Verify in a staging environment first, and apply sequentially in production with verification.

🟢 Salt Okunur (Read-Only)·🟡 Geri Alınabilir (Reversible)·🔴 Yüksek Etkili / Geri Alınamaz (High Impact)

1. Symptom & Signals

- M11 geçici dosya yazma hızı artar; sorgu süreleri ve temp disk kullanımında sıçrama görülür.

- `pg_stat_database.temp_bytes` artar, loglarda `temporary file: path ... size ...` bulunabilir.

2. Business & Technical Impact

Disk I/O ve sorgu gecikmesi artar; temp alanı dolarsa sorgular hata verir ve diğer iş yükleri etkilenir.

3. Diagnosis & Root-Cause Analysis

🟢 Read-Only1. S16/S5 ile toplam diske taşan sorguları bulun (PG 13+ `pg_stat_statements` yüklü olmalı):
sql
SELECT calls, temp_blks_read, temp_blks_written,
       pg_size_pretty(temp_blks_written * current_setting('block_size')::int::bigint) AS temp_written,
       round(mean_exec_time::numeric, 2) AS mean_ms, left(query, 160) AS query
FROM pg_stat_statements
WHERE temp_blks_written > 0
ORDER BY temp_blks_written DESC LIMIT 20;
🟢 Read-Only2. `pg_stat_database.temp_bytes` kümülatiftir; 5 dakikalık iki örnek farkıyla hız ölçün. Gerekirse superuser ile kontrollü süre `log_temp_files = '64MB'` açın; çok düşük eşik log hacmini şişirir.
🟢 Read-Only3. Sorgu planında `Sort Method: external merge` veya hash batching olup olmadığını değerlendirin. `EXPLAIN (ANALYZE, BUFFERS)` sorguyu **yürütür**; yazan sorguları üretimde bu yolla test etmeyin.
🟢 Read-Only4. `SHOW work_mem; SHOW hash_mem_multiplier;` kontrol edin (hash_mem_multiplier PG 13+). Paralel işçiler ve birden fazla sort/hash düğümü `work_mem` sınırını katlayabilir.

4. Remediation & Action Plan

🟡 Reversible1. En ağır sorguda gerekli satırları ve `ORDER BY`/`GROUP BY` desenini sadeleştirin; uygun indeks veya daha küçük batch'i deneyin.
🟡 Reversible2. Testte fayda gösterdiyse bellek kapasitesi ve eşzamanlılık sınırı içinde yalnızca ilgili transaction'a bellek verin:
sql
BEGIN;
SET LOCAL work_mem = '128MB';
-- Burada test edilip onaylanmış, ilgili SELECT çalıştırılır.
COMMIT;

`SET LOCAL` transaction sonunda kalkar; uygulama havuzları için oturum ayarını kalıcı bırakmaz.

🟡 Reversible3. Yalnızca gerekli rol için ve bellek bütçesiyle kademeli artış düşünün: `ALTER ROLE rapor_rolu SET work_mem = '32MB';` yeni oturumlarda etkinleşir.
🔴 HIGH RISK / IRREVERSIBLE4. **Global `work_mem` değerini körlemesine artırmayın**. Her sort/hash düğümü ve paralel işçi bellek tüketebilir; OOM kill ve daha büyük kesinti yaşanabilir.

5. Verification & Health Checks

- M11 hızı ve temp disk latency baz seviyeye dönüyor; sorgu p95 iyileşiyor.

- Kullandığınız bellek/swap ve eşzamanlı oturumlar güvenli sınırlarda kalıyor.

6. Rollback & Contingency Plan

- `SET LOCAL` transaction bittiğinde otomatik geri alınır. Rol bazlı ayarı `ALTER ROLE rapor_rolu RESET work_mem;` ile kaldırın (önceki özel değeri not edin).

- Yeni indeks veya sorgu dağıtımı regresyon yaratıyorsa uygulama/DDL geri alma planına göre dönün.

More POSTGRESQL Runbooks