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.