Sunucunuzda PHP-FPM kullanıyorsanız, özellikle trafik arttığında şu uyarıyla karşılaşmış olabilirsiniz: “WARNING: [pool www] seems busy (you may need to increase pm.start_servers, pm.min_spare_servers, pm.max_spare_servers, or pm.max_children)”. Bu uyarı, çoğu zaman çözümü yanlış bilinen bir konu. Ben de HostingServer.com.tr olarak sıkça sorulduğu için bu yazıyı yazma gereği duydum. Sadece max_children değerini artırmak yerine, gerçek ihtiyacınızı hesaplayıp kalıcı çözüm getireceğiz.
Uyarı Neden Alınır?
PHP-FPM, her bir istek için ayrı bir child process oluşturur. pm.max_children, aynı anda çalışabilecek maksimum süreç sayısını belirler. Bu değere ulaştığınızda yeni gelen istekler beklemeye alınır; süreçler boşaldıkça işlenir. Eğer bekleyen istek sayısı çok artarsa, sunucu yavaşlar ve hata alırsınız. Varsayılan ayarlar çoğu zaman yetersiz kalır. Örneğin DigitalOcean’ın 2 GB RAM’li bir sanal sunucusunda varsayılan max_children genelde 5-10 arasıdır. Oysa aynı anda 30-40 ziyaretçiniz oluyorsa, bu değer çok düşük kalır.
Kesin Çözüm: Kaynak Hesaplaması
Doğru max_children değerini bulmak için her bir PHP-FPM sürecinin ne kadar RAM tükettiğini bilmeniz gerekir. Bunu şu komutla öğrenebilirsiniz: ps --no-headers -o "rss,cmd" -C php-fpm | awk '{ sum+=$1 } END { printf ("%dMB", sum/1024) }'. Bu komut tüm PHP-FPM süreçlerinin toplam RAM kullanımını MB cinsinden verir. Ardından toplam süreç sayısına bölerek ortalama bellek kullanımını bulun. Örneğin 10 süreç 512 MB kullanıyorsa, süreç başına ~51 MB düşer. Sunucunuzda başka hizmetler de çalıştığını unutmayın. Güvenli bir marj bırakarak toplam RAM'in %80'ini PHP-FPM’e ayırabilirsiniz. 2 GB RAM’in %80’i = 1.6 GB = 1638 MB. 1638 / 51 ≈ 32. Yani max_children = 32. Ayrıca pm.max_spare_servers ve pm.min_spare_servers değerlerini de buna göre ayarlayın. Önerim: min_spare = 5, max_spare = 15.
Alternatif Yöntem: pm.status Ölçümü
Bir diğer yol, pm.status sayfasını açıp canlı verileri izlemek. pm.status_path = /status ayarını yapıp curl http://localhost/status?full ile anlık süreç sayısını, bekleyen istekleri (queue) görebilirsiniz. Eğer ‘listen queue’ sürekli 0’ın üzerindeyse, max_children artırılmalı. Ama dikkat edin, sadece artırmak yetmez; sunucuda swap kullanımı başlamışsa, RAM yetersiz demektir. O zaman ya daha fazla RAM alın ya da uygulamanızı optimize edin.
PHP-FPM Ayarlarını Değiştirme
Ayarları değiştirmek için /etc/php/8.x/fpm/pool.d/www.conf dosyasını düzenleyin. Varsayılan değerler şöyledir: pm = dynamic, pm.max_children = 5, pm.start_servers = 2, pm.min_spare_servers = 1, pm.max_spare_servers = 3. Hesapladığınız değerleri yazıp servisi yeniden başlatın: systemctl restart php8.2-fpm (sürümünüze göre değişir). Bir gün izleyin, uyarı tekrarlıyorsa hesaplamayı tekrar yapın.
Unutmamanız Gerekenler
- Her süreç aynı belleği kullanmaz, uygulamanıza bağlıdır. WordPress siteniz 30 MB, Magento 100 MB tüketebilir.
- Sunucuda çalışan MySQL, Nginx, Redis gibi servisler de bellekte yer kaplar. Onları da hesaba katın.
- Swap kullanımından kaçının; aşırı swap performansı düşürür.
Önemli: max_children’ı aşırı yüksek ayarlamak sunucunuzun çökmesine neden olabilir. Her zaman yedekli ve kontrollü artırın.
Sonuç
PHP-FPM max_children uyarısı, ihmal edilirse kullanıcı deneyimini bozar. Ancak doğru yöntemle çözmek sanıldığı kadar zor değil. Sunucunuzun kaynaklarını ölçün, gerçekçi hesaplayın ve ayarları buna göre yapın. HostingServer.com.tr’de bu konuda daha fazla içerik bulabilir, yorumlarda sorularınızı sorabilirsiniz. Bir sonraki yazıda pm.status ile canlı izleme konusuna değineceğim.