Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
Memory'yi Process Gözüyle Okumak: mmap, Copy-on-Write, Shared Memory ve Container Memory Limit
Bir process belleği OS'tan mmap ve VirtualAlloc ile alır; dosyaya bağlı sayfalar process'ler arasında paylaşılır, yazıldığında copy-on-write ile kopyalanır ve container'da .NET GC, cgroup limitinin yüzde 75'ini heap sınırı yapar. 256 MB'lık container'da managed allocation'ın OOMKilled yerine 189. MB'ta yakalanabilir bir OutOfMemoryException verdiğini, paylaşılan bir dosyanın iki process'in RSS'inde iki kez sayıldığını ve DATAS'ın Server GC'nin belleğini 593 MB'tan 167 MB'a indirdiğini ölçüyoruz.
Virtual Memory: Page, Page Table, TLB ve Page Fault
Virtual memory, her process'e kendi adres alanını verir ve adresleri sayfa sayfa fiziksel belleğe çevirir; bir aralığı ayırmak ile ona RAM vermek ayrı işlerdir ve RAM ancak sayfaya dokunulunca gelir. 512 MB'lık allocation'ın resident memory'yi 3 MB, dokununca 513 MB artırdığını ve 131 bin minor fault ürettiğini ölçüyor, .NET'in 17 GB'lık VIRT'inin GC reserve'ü olduğunu ve 256 MB'lık container'ın 1 GB allocation'ı kabul edip OOM killer ile öldüğünü gösteriyoruz.