8 GB'lık bir sunucuda "free: 180MB" görmek her gün birilerini telaşlandırır, oysa neredeyse her zaman sorun yoktur. Linux artan belleği disk önbelleği olarak kullanır ve bir şeyin ihtiyacı olduğu anda geri verir. Okunacak sayı free değil, available'dır.
free -h
# total used free shared buff/cache available
# Mem: 7.8Gi 2.1Gi 180Mi 120Mi 5.5Gi 5.3Gi
available'daki 5,3 Gi, alınabilecek 5,3 Gi olduğu anlamına gelir. Önbellek kayıp bellek değildir; ihtiyaç duyulana kadar yararlı bir iş yapan bellektir.
Önemli olan sayı takastır
Takasın KULLANILIYOR olması sorun değildir. Etkin biçimde yazılıp okunuyor olması sorundur: makine yer açmak için sayfaları diske taşıyordur ve disk, bellekten binlerce kat yavaştır. Her şey yavaştır ve uygulamada bunu açıklayan hiçbir şey yoktur.
vmstat 2 5
# watch the si and so columns - sustained non-zero is thrashing
Onu neyin tuttuğunu bulun
ps aux --sort=-%mem | head -10
smem -rs uss 2>/dev/null | head -10
uss, bir süreç çıksaydı gerçekten serbest bırakacağı bellektir; dürüst rakam odur. rss ise paylaşılan kitaplıkları iki kez sayar ve her PHP işçisini devasa gösterir.
Her zamanki yanıt
- Fazla sayıda PHP işçisi. pm.max_children, belleğinizden değil bir eğitimden alınmıştır. Kullanılabilir belleği ortalama işçiye bölün ve temkinli davranın.
- Fazla büyük bir innodb_buffer_pool_size. Makinede olandan fazlasını önbelleğe alması söylenmiş bir veritabanı.
- Uzun süre çalışan bir işçideki sızıntı. Onu düzenli aralıklarla yeniden başlatın; php-fpm bunu pm.max_requests ile yapar.
Bir miktar takas sağlıklıdır - çekirdeğin gerçekten atıl sayfaları kenara çekmesini sağlar. Takası tümüyle kapatılmış bir sunucunun yastığı yoktur ve bellek daraldığı anda doğrudan öldürülür.
