dataiotech Labs
dbaguidedbaguideDBAdataxtoolsdataopsphere
Runbook #48
mongodb
PerformanceSEV2 · CİDDİ BOZULMA15-30 dakika / 15-30 minsclusterAdmin / dbAdminAnyDatabase / root

MongoDB WiredTiger Cache Baskısı: Çalışma Seti RAM'e Sığmıyor

Cache doluluğu, dirty oranı ve eviction baskısını okur; çalışma setini şişiren indeks ve sorgu sorunlarını bulur. Cache boyutu, indeks temizliği ve donanım kararlarını yönlendirir.

İlişkili Metrik:M52M53
İlişkili Script:S87S82S92
#wiredtiger#cache#eviction#working-set

Operasyonel Güvenlik ve Risk Uyarısı

Bu runbook müdahale adımları içerir; birçok adım yazma etkilidir (KILL, terminate, DROP, RESIZE). Önce test ortamında deneyin, üretimde adımları sırayla ve doğrulayarak uygulayın.

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

1. Belirti / Symptom

- Cache kullanımı sürekli maksimuma yakın (M52 > %95), dirty oranı yüksek (M53 > %5, kritik %20).

- Disk okuma (`pages read into cache`) ve yazma gecikmesi artmış; sorgu süreleri uzamış.

- Aralıklı gecikme sıçramaları ("stall"), uygulama thread'lerinin eviction'a katılması.

2. Etki / Impact

Sorgu ve yazma gecikmesi artar. Dirty oranı %20'yi aşınca **uygulama thread'leri eviction yapmak zorunda kalır** ve gecikme dramatik artar. Ciddi durumda zaman aşımları ve düşük verim.

3. Teşhis / Diagnosis

🟢 Salt Okunur1. Cache durumu (S87):
javascript
const w = db.serverStatus().wiredTiger.cache;
({ max_gb: +(w['maximum bytes configured']/1073741824).toFixed(1),
   used_gb: +(w['bytes currently in the cache']/1073741824).toFixed(1),
   dirty_gb: +(w['tracked dirty bytes in the cache']/1073741824).toFixed(2),
   pages_read: w['pages read into cache'],
   app_thread_evict: w['application threads page read from disk to cache time (usecs)'] });
🟢 Salt Okunur2. **Çalışma seti RAM'e sığıyor mu?** Cache sürekli dolu ve `pages read into cache` hızla artıyorsa sığmıyor.
🟢 Salt Okunur3. **Veri ve indeks boyutları** (S82): Toplam indeks boyutu cache'in büyük kısmını yiyor mu?
javascript
db.getCollectionInfos({type:"collection"}).map(c => { const s=db.getCollection(c.name).stats(); return { c:c.name, data_gb:+(s.size/1e9).toFixed(2), idx_gb:+(s.totalIndexSize/1e9).toFixed(2) }; })
  .sort((a,b)=>b.idx_gb-a.idx_gb).slice(0,10);
🟢 Salt Okunur4. **Verimsiz sorgular** (S92): COLLSCAN yapan veya aşırı doküman tarayan sorgular cache'i gereksiz doldurur. Profiler ile bulun.
🟢 Salt Okunur5. Bellek: cache boyutu `max(%50 × (RAM − 1GB), 256MB)` varsayılanıdır. Bu bir konteyner/VM ise **cgroup bellek limitinin** doğru algılandığını ve başka süreçlerin RAM'i yemediğini doğrulayın.

4. Müdahale / Response

🟡 Geri Alınabilir1. **Eksik/verimsiz sorguları düzeltin:** COLLSCAN yapan sorgulara indeks ekleyin, gereksiz tarama azalınca cache ihtiyacı düşer.
🟡 Geri Alınabilir2. **Kullanılmayan indeksleri kaldırın** (S83): Her indeks cache'te yer tutar ve yazmayı yavaşlatır. Önce gizleyin (4.4+):
javascript
db.koleksiyon.hideIndex("indeks_adi");   // sorunsuzsa sonra dropIndex
🟡 Geri Alınabilir3. **Dirty baskısı yazma kaynaklıysa:** Yazma yükünü yumuşatın (batch), disk IOPS'unu artırın. Checkpoint süresini yavaşlatan disk darboğazını giderin.
🔴 YÜKSEK RİSK / GERİ ALINAMAZ4. **Cache boyutunu elle artırmak** (yeniden başlatmasız):
javascript
db.adminCommand({ setParameter: 1, wiredTigerEngineRuntimeConfig: "cache_size=24G" });

Yalnızca fiziksel RAM yeterliyse (OS ve filesystem cache için pay bırakın, genelde RAM'in %60'ını aşmayın). Aşırı büyütmek OOM kill'e yol açar.

5. **Kalıcı çözüm:** RAM artırın veya veriyi **shard**'layın; arşiv verisini ayrı koleksiyon/kümeye taşıyın; doküman şemasını sadeleştirin, gereksiz büyük alanları ayırın, TTL ile eski veriyi temizleyin.

5. Doğrulama / Verification

- Cache doluluğu stabil (<%80-90), dirty oranı %5 civarında veya altında (M52, M53 normal).

- `pages read into cache` hızı belirgin düştü, sorgu gecikmeleri iyileşti.

- Uygulama thread eviction'ı (`application threads` metrikleri) görünmüyor.

6. Geri Alma / Rollback

- `setParameter` ile cache boyutu eski değerine alınabilir (kalıcı olması için `mongod.conf` içinde `storage.wiredTiger.engineConfig.cacheSizeGB` kullanın).

- Gizlenen indeks `unhideIndex` ile hemen geri açılır; silinen indeksin yeniden oluşturulması uzun sürebilir.

Diğer MONGODB Runbook'ları