dataiotech Labs
dbaguidedbaguideDBAdataxtoolsdataopsphere
Runbooks Library/sqlserver/#25
Runbook #25
sqlserver
PerformanceSEV2 · DEGRADATION15-30 dakika / 15-30 minssysadmin / CONTROL SERVER / VIEW SERVER STATE

SQL Server Memory Pressure: PLE Drops and Memory Grants Pending

Finds the cause of low Page Life Expectancy and pending memory grants: wrong max server memory, large query grants, missing indexes and stale statistics.

Related Metrics:M25M26
Related Scripts:S56S47S42S54
#memory#ple#memory-grants#resource-semaphore

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

- Page Life Expectancy (PLE) uzun süre düşük (M25 < 300-1000) veya sürekli testere dişi.

- `Memory Grants Pending` > 0 (M26).

- Wait stats'te `RESOURCE_SEMAPHORE`, yüksek `PAGEIOLATCH_*` (S47).

- Sorgular çalışmaya başlayamıyor, genel yavaşlama, yüksek disk okuma.

2. Business & Technical Impact

Sorgular bellek tahsisi için kuyrukta bekler (başlamadan donar), disk okuma artar, genel gecikme. En kötü durumda uygulama zaman aşımları.

3. Diagnosis & Root-Cause Analysis

🟢 Read-Only1. Mevcut bellek durumu (S56):
sql
SELECT physical_memory_kb/1024 AS os_ram_mb FROM sys.dm_os_sys_info;
SELECT name, value_in_use FROM sys.configurations
WHERE name IN ('max server memory (MB)','min server memory (MB)');
SELECT counter_name, cntr_value FROM sys.dm_os_performance_counters
WHERE counter_name IN ('Page life expectancy','Memory Grants Pending','Total Server Memory (KB)','Target Server Memory (KB)');

- `max server memory` varsayılan (2147483647) ise SQL Server işletim sisteminin belleğini yiyebilir veya OS baskısı oluşur.

- Total ≈ Target: SQL Server hedef belleğe ulaştı, daha fazlası gerek.

🟢 Read-Only2. **Büyük bellek tahsisi alan veya bekleyen sorguları** bulun:
sql
SELECT session_id, requested_memory_kb/1024 AS requested_mb,
       granted_memory_kb/1024 AS granted_mb, wait_time_ms, query_cost,
       dop, is_next_candidate
FROM sys.dm_exec_query_memory_grants
ORDER BY requested_memory_kb DESC;
🟢 Read-Only3. Sebep ayrımı:

- Birkaç sorgu çok büyük istek yapıyor: yanlış kardinalite tahmini (eski istatistik, S54) veya sort/hash gerektiren eksik indeks.

- Çok sayıda orta boy sorgu: yüksek eşzamanlılık, bellek yetersizliği.

- PLE yalnızca bakım/yedek saatlerinde düşüyor: normal olabilir.

🟢 Read-Only4. En çok okuma yapan sorguları (S42) ve wait stats'i (S47) kontrol edin; `PAGEIOLATCH` baskınsa bellek yetmiyor veya tablolar taranıyor demektir.

4. Remediation & Action Plan

🟡 Reversible1. `max server memory` doğru ayarlanmamışsa düzeltin (dinamik, yeniden başlatma gerektirmez). Kural: OS ve diğer süreçler için 4 GB veya RAM'in %10-20'sini bırakın.
sql
EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
EXEC sp_configure 'max server memory (MB)', 57344;   -- örnek: 64 GB RAM sunucu
RECONFIGURE;
🟡 Reversible2. Bellek tahsisi bekleyen tek bir "çılgın" sorgu varsa sahibiyle görüşüp sonlandırın:
sql
KILL <session_id>;
🟡 Reversible3. İstatistikleri güncelleyin (S54), kardinalite tahminini düzeltir ve gereksiz büyük tahsisi azaltır:
sql
UPDATE STATISTICS dbo.tablo_adi WITH FULLSCAN;
🟡 Reversible4. Eşzamanlılığı sınırlayın: gerekirse Resource Governor ile bellek payı (`REQUEST_MAX_MEMORY_GRANT_PERCENT`) tanımlayın.

5. **Kalıcı:** Sorgu ve indeks optimizasyonu (eksik indeksler S43, gereksiz taramalar), gerekirse RAM artırımı. `FREEPROCCACHE` veya `DROPCLEANBUFFERS` **üretimde bellek sorununu çözmez**, sorunu kötüleştirir; kullanmayın.

5. Verification & Health Checks

- PLE kararlı şekilde yükseliyor, M26 = 0.

- `RESOURCE_SEMAPHORE` beklemeleri wait stats'te düştü.

- Disk okuma gecikmesi ve genel sorgu süreleri iyileşti.

6. Rollback & Contingency Plan

- `sp_configure 'max server memory (MB)'` değerini önceki değere çevirin.

- `KILL` geri alınamaz; ilgili işlem rollback olur.

- Resource Governor değişikliklerini devre dışı bırakmak için `ALTER RESOURCE GOVERNOR DISABLE;`.

More SQLSERVER Runbooks