Membaca "free: 180MB" di server 8 GB membuat orang panik setiap hari, padahal hampir selalu baik-baik saja. Linux memakai memori sisa sebagai singgahan cakram dan mengembalikannya seketika begitu ada yang membutuhkannya. Angka yang harus dibaca adalah available, bukan free.

free -h
#               total   used   free   shared  buff/cache   available
# Mem:           7.8Gi  2.1Gi  180Mi   120Mi      5.5Gi       5.3Gi

5,3 Gi pada available berarti ada 5,3 Gi yang bisa diambil. Singgahannya bukan memori yang hilang; ia memori yang sedang mengerjakan sesuatu yang berguna sampai ia dibutuhkan.

Swap-lah angka yang berarti

Swap yang TERPAKAI bukanlah masalahnya. Swap yang sedang giat ditulisi dan dibaca barulah masalah: mesinnya sedang memindahkan halaman ke cakram demi mencari ruang, dan cakram ribuan kali lebih lambat daripada memori. Semuanya lambat dan tak ada apa pun di aplikasinya yang menjelaskan itu.
vmstat 2 5
# watch the si and so columns - sustained non-zero is thrashing

Temukan apa yang menahannya

ps aux --sort=-%mem | head -10
smem -rs uss 2>/dev/null | head -10

uss adalah memori yang sungguh akan dibebaskan sebuah proses kalau ia berhenti, dan itulah angka yang jujur. rss menghitung pustaka bersama dua kali dan membuat setiap pekerja PHP tampak raksasa.

Jawaban yang biasa

  • Pekerja PHP terlalu banyak. pm.max_children disetel dari sebuah panduan, bukan dari memori Anda. Bagi memori yang tersedia dengan rata-rata seorang pekerja, dan berhati-hatilah.
  • innodb_buffer_pool_size terlalu besar. Basis data yang disuruh menyinggahkan lebih banyak daripada yang dimiliki mesinnya.
  • Kebocoran pada pekerja yang berumur panjang. Nyalakan ulang secara berkala; php-fpm melakukannya lewat pm.max_requests.
Sedikit swap itu sehat - ia membiarkan kernel menyingkirkan halaman yang memang benar-benar menganggur. Server yang swap-nya dimatikan sama sekali tak punya bantalan dan langsung dibunuh begitu memorinya menipis.