Görev yöneticisinin bellek sekmesinde, sağ alt köşede yer alan bir "disk belleği olmayan havuz" (non paged pool) bölümü var. Bu bölüm, kullanıcı bellek harcamalarının dışında sürücü ve sistem bileşenlerinin kullandığı ve hiçbir zaman diske (sanal bellek) yazılmayan miktarı gösterir.
Ekran görüntüleri, benim yaşadığım sorunlu bilgisayara ait değil.
Bu değerin normal bir bilgisayarda en fazla 300-400 MB civarında olması beklenir. Ama bir bilgisayarda bu 1,6 GB'ı bulmuştu. Olası bir sorun, bellek sızıntısı (memory leak). Bir (genelde) sürücü işletim sisteminden bellek talep eder ama onu işi bittiğinde boşaltmadan yenisini isterse buna bellek sızıntısı denir. Bu tür sürücülerin bu kadar yüksek miktarlarda diske yazılmayan bellek kullanması olası değildir. Acaba ne olmuş?
Bu tür durumlarda poolmon kullanılabilir. Bu araç, sürücülerin diske yazılmayan bellek kullanımlarını inceler. Her alanın doğrudan hangi bileşen/süreç tarafından kullanıldığını görmek mümkün değil, ama talep edilen alanlar için bir etiket kullanılır. Bu etiketten şişkin alanın hangi bileşen/süreç ile ilgili olduğu bulunabilir. Poolmon'u indirmek için Windows Driver Kit'i indirmek gerek. Bu kit, başka bileşenlerle de gelir. wdksetup.exe'yi çalıştırdıktan sonra buna göre seçenekleri işaretlemek gerek.
WDK ile birlikte poolmon'u kurduktan sonra çalıştırınca aşağıdaki gibi bir çıktı verir.
Burada ilk sütun, etiket. İkinci sütundaki veriler Paged (diske yazılabilecek şekilde rezerve edilen bellek alanı) veya Nonp (diske yazılmayacak şekilde rezerver edilen bellek alanı). Benim durumum için önemli olan alanlar Nonp olanlar. Üçüncü sütun, Allocs, kaç kez rezervasyon yapıldığını gösteriyor. Dördüncü sütun Frees ise kaç kez rezerve edilen alanların serbest bıraklıdığını gösteriyor. Beşinci sütun Diff ise Allocs ve Frees arasındaki fark; yani rezerve edilip henüz serbest bırakılmamış alan sayısı. Dikkat, miktar değil. Miktar ise altıncı sütunda, Bytes alanında gösteriliyor. Bu işte, ilgili etiketin toplam aktif kullandığı diske yazılmayan bellek alanı. Son sütun Per Alloc ise yapılan işlemlerin ortalaması. Benim durumum için "b"ye basarak Bytes alanına göre sıralamak faydalı oldu. Bazı klavye kısayolları:
e : Pencerenin altında toplamları göster/gizle (varsayılan kapalı)
a : Allocs alanına göre sırala
f : Frees alanına göre sırala
d : Diffs alanına göre sırala
m : Per Allocs alanına göre sırala
b : Bytes alanına göre sırala
Peki bunu gördük, ne yapabiliriz? Elimizden çok fazla şey gelmiyor. Yapılabilecek şeyler, görüntülenen etiketin hangi sürücüye ait olduğunu bulmak, sonrasında bu sürücüyü güncellemek ve güncel sürücünün bellek sızıntısı yapmayacağını ummak.
Benim durumumda görüntülenen etiket, ismc'ydi. Bu da Intel Rapid Store Technology (RST) ile ilgiliydi. Sorun çözme adımları olarak önce ilgili event tracing'i bilgisayar açıldıktan sonra devre dışı bıraktım.
logman stop IntelRST -ets
ETW içindeki veri kaynaklarını inceledim.
logman query -ets
Intel ile ilgili sürücüleri listeledim
driverquery /v | findstr /i
Hiç biri faydalı olmadı. Aynı sorundan şikayetçi kaç kişi var acaba?
İçinde ismc etiketi geçen sürücüleri aramak için şöyle bir komut önerilmiş.
findstr /m /s /l ismc *.sys
Bu aslında metin dosyalarının içinde ismc anahtar kelimesini arayan bir komut. Bunun powershell eşdeğerini denemek istedim.
dir *.sys -rec -ea silent | sls ismc | select path
Konuyu biraz saptırdım ama yukarıdaki eşdeğer, asıl komuttan daha fazla sayıda çıktı üretti. Bunun sebebi findstr'nin unicode desteğinin olmaması. sls (Select-String) unicode desteğine sahip olduğu için daha fazla dosya bulur.
---
https://woshub.com/huge-memory-usage-non-paged-pool-windows/
https://community.intel.com/t5/Rapid-Storage-Technology/Non-Paged-pool-memory-usage-too-high/m-p/1243440
https://www.tenforums.com/performance-maintenance/101582-very-high-ram-usage-all-time-w10.html
https://community.intel.com/t5/Rapid-Storage-Technology/Non-Paged-pool-unusually-high-ismc-non-paged-pool/td-p/1288935
https://www.tenforums.com/performance-maintenance/168382-high-ram-usage-non-paged-pool-size.html

