Setiap pekerja PHP memegang memori, sedang sibuk maupun menganggur. Terlalu sedikit, permintaan mengantre di belakang satu sama lain; terlalu banyak, memori mesinnya habis, ia mulai bertukar ke cakram, dan jadi lebih lambat daripada kalau pekerjanya lebih sedikit.
Ukur satu pekerja
ps -ylC php-fpm8.3 --sort:rss | awk '{sum+=$8; n++} END {print sum/n/1024 " MB average"}'
Biasanya 30-80 MB. Kerangka yang berat atau kumpulan pengaya yang besar mendorongnya naik, dan yang berarti adalah angka Anda sendiri, bukan angka umum.
Hitungannya
max_children = (RAM available to PHP) / (average worker size)
# 8GB box, 2GB for the database and the system, 50MB a worker:
# 6000 / 50 = 120 - then be conservative and use 80
static, dynamic, atau ondemand
- static - semua pekerja dinyalakan saat mesin menyala. Paling cepat dan memakai memorinya baik sibuk maupun tidak. Cocok untuk mesin khusus dengan beban yang tetap.
- dynamic - menyimpan beberapa cadangan dan tumbuh sampai batasnya. Inilah bawaan yang masuk akal.
- ondemand - menyala saat diminta dan dimatikan setelah tenggat. Memori paling irit, sedikit jeda pada permintaan pertama. Cocok untuk banyak situs kecil di satu mesin.
pm = dynamic
pm.max_children = 80
pm.start_servers = 12
pm.min_spare_servers = 8
pm.max_spare_servers = 24
pm.max_requests = 500
max_requests adalah asuransi terhadap kebocoran
Seorang pekerja dipensiunkan sesudah sekian permintaan itu dan yang baru mengambil alih. Ongkosnya nyaris nol dan ia mengurung kebocoran lambat di pustaka mana pun yang tak Anda kendalikan.
Periksa apakah Anda mulai kehabisan
grep "server reached pm.max_children" /var/log/php8.3-fpm.log
Baris itu berarti ada permintaan yang mengantre. Kalau ia tak pernah muncul, kolamnya sudah cukup besar dan menaikkannya tidak akan mempercepat apa pun.
