WordPress, yazılım ve IT üzerine notlar
Anasayfa » Sunucu & Linux » PHP-FPM havuz ayarları: pm.max_children nasıl hesaplanır, 502 ve 504 hataları nasıl önlenir?

PHP-FPM havuz ayarları: pm.max_children nasıl hesaplanır, 502 ve 504 hataları nasıl önlenir?

İçindekiler
  1. Havuz yapılandırması nerede?
  2. Üç yönetim modu
  3. pm.max_children nasıl hesaplanır?
  4. Havuzun dolduğunu nereden anlarsınız?
  5. Yavaş istekleri tespit etmek
  6. Diğer önemli ayarlar
  7. Durum sayfası
  8. Değişiklikten sonra

PHP-FPM (FastCGI Process Manager), PHP kodunu çalıştıran işçi süreçlerini yöneten servistir. Web sunucusu (Nginx ya da Apache) bir PHP isteği aldığında, onu PHP-FPM'e iletir. PHP-FPM de isteği boşta bekleyen bir işçi sürece verir.

Her işçi süreç aynı anda yalnızca bir istek işleyebilir. Bu yüzden işçi sayısı, sunucunuzun aynı anda kaç PHP isteğini karşılayabileceğini belirler. Bu sayı yanlış ayarlandığında iki farklı sorun çıkar:

  • Çok az işçi: İstekler sırada bekler, site yavaşlar, sonunda web sunucusu zaman aşımına uğrar (504) ya da reddedilir (502).
  • Çok fazla işçi: Bellek tükenir, sunucu swap kullanmaya başlar ya da çekirdek süreçleri öldürür. Sonuç, çok daha büyük bir yavaşlık ya da tamamen çökmüş bir sunucudur.

Havuz yapılandırması nerede?

/etc/php-fpm.d/www.conf              # RHEL ailesi
/etc/php/8.3/fpm/pool.d/www.conf     # Debian / Ubuntu

Hosting panellerinde genellikle her sitenin kendi havuz dosyası bulunur. Her havuz ayrı bir kullanıcıyla ve ayrı ayarlarla çalışabilir.

Üç yönetim modu

pm = static
Her zaman sabit sayıda işçi çalışır. Öngörülebilir ve yoğun trafik altında en hızlı moddur, ama boştayken de bellek tüketir. Tek bir yoğun uygulamanın çalıştığı, belleği bol sunucular için uygundur.

pm = dynamic (en yaygın)
İşçi sayısı, belirlediğiniz alt ve üst sınırlar arasında trafiğe göre artıp azalır:

pm = dynamic
pm.max_children = 20
pm.start_servers = 4
pm.min_spare_servers = 2
pm.max_spare_servers = 6

pm = ondemand
Hiç istek yokken işçi çalışmaz. İstek geldikçe işçi başlatılır, bir süre boşta kalan işçiler kapatılır. Çok sayıda az trafikli sitenin bulunduğu paylaşımlı sunucularda belleği verimli kullanır. Bedeli, ilk istekte küçük bir başlatma gecikmesidir.

pm = ondemand
pm.max_children = 10
pm.process_idle_timeout = 10s

pm.max_children nasıl hesaplanır?

En önemli ayar budur. Hesap basit bir bölmeye dayanır:

pm.max_children ≈ (PHP'ye ayırabileceğiniz bellek) / (bir işçinin ortalama belleği)

1. Bir işçinin ne kadar bellek kullandığını ölçün. Yoğun saatlerde:

ps -C php-fpm -o rss= | awk '{s+=$1; n++} END {printf "Ortalama: %.0f MB, işçi sayısı: %d\n", s/n/1024, n}'

Debian ve Ubuntu'da süreç adı php-fpm8.3 gibi sürüm numaralı olabilir; ps aux | grep php-fpm ile kontrol edin. Tipik bir WordPress sitesinde bir işçi 40 ile 100 MB arası kullanır. WooCommerce ve ağır eklentilerle bu değer daha yüksek olabilir.

2. PHP'ye ne kadar bellek ayırabileceğinizi belirleyin. Toplam RAM'den işletim sistemini, veritabanını, Redis'i ve diğer servisleri çıkarın. Örnek:

Toplam RAM:          4096 MB
İşletim sistemi:     -400 MB
MariaDB:            -1024 MB
Redis ve diğerleri:  -300 MB
Pay (güvenlik):      -372 MB
PHP için kalan:     ≈ 2000 MB

3. Bölün:

2000 MB / 70 MB ≈ 28  →  pm.max_children = 28

Birden fazla havuz varsa (örneğin her site için bir havuz), bütün havuzların max_children toplamının bu sınırı aşmaması gerekir. Paylaşımlı sunucularda bütün havuzların aynı anda tam kapasiteye çıkması nadir olduğu için biraz esneklik payı bırakılabilir, ama bu bilinçli bir karar olmalıdır.

Havuzun dolduğunu nereden anlarsınız?

PHP-FPM, max_children sınırına ulaştığında günlüğüne bir uyarı yazar:

WARNING: [pool www] server reached pm.max_children setting (20), consider raising it
grep -i "max_children" /var/log/php-fpm/*.log | tail

Bu uyarıyı görüyorsanız iki seçenek vardır: Bellek izin veriyorsa sınırı artırmak ya da isteklerin neden bu kadar uzun sürdüğünü bulmak. Çoğu zaman ikincisi daha doğru çözümdür. Çünkü işçiler genellikle yavaş bir veritabanı sorgusu ya da cevap vermeyen bir dış API yüzünden meşgul kalır.

Yavaş istekleri tespit etmek

PHP-FPM, belirli bir süreden uzun süren isteklerin yığın izini (stack trace) kaydedebilir:

request_slowlog_timeout = 5s
slowlog = /var/log/php-fpm/www-slow.log

Bu günlük, 5 saniyeden uzun süren her isteğin o anda hangi fonksiyonda beklediğini gösterir. Çoğu zaman suçlu hemen görünür: bir curl_exec (dış servis), bir mysqli_query (yavaş sorgu) ya da belirli bir eklentinin fonksiyonu.

Diğer önemli ayarlar

pm.max_requests = 500
request_terminate_timeout = 60s
  • pm.max_requests: Bir işçi bu kadar istek işledikten sonra yeniden başlatılır. Bellek sızıntısı olan eklentilerin zamanla bütün belleği tüketmesini önler.
  • request_terminate_timeout: Bir istek bu süreyi aşarsa işçi zorla sonlandırılır. Sonsuz döngüye giren bir betiğin işçiyi sonsuza kadar meşgul etmesini önler. PHP'nin max_execution_time ayarı bazı durumlarda (örneğin dış bir isteği beklerken) etkili olmayabildiği için bu ayar önemli bir emniyet kemeridir.

Durum sayfası

Havuzun anlık durumunu görmek için durum sayfasını açabilirsiniz:

pm.status_path = /fpm-durum

Web sunucusunda bu adresi yalnızca 127.0.0.1 ya da yönetim IP'nize açın. Sayfa; aktif ve boşta bekleyen işçi sayısını, kuyrukta bekleyen istekleri (listen queue) ve şimdiye kadar sınıra kaç kez ulaşıldığını (max children reached) gösterir.

Değişiklikten sonra

php-fpm -t                 # sözdizimi kontrolü
systemctl reload php-fpm   # kesintisiz yeniden yükleme

Doğru ayarlanmış bir PHP-FPM havuzu, sunucunuzun belleğini taşırmadan trafiği karşılar. Yanlış ayarlanmış bir havuz ise en güçlü sunucuyu bile yoğun bir saatte dize getirebilir. Ölçün, hesaplayın ve yavaş istek günlüğünü açık tutun.

Tezcan Kabakçı
Hosting teknik destek uzmanı ve WordPress uzmanı. 2024'ten beri bir hosting şirketinde teknik destek bölümünde çalışıyor; WordPress, DNS ve e-posta sorunlarını her gün yakından görüyor. YouTube kanalı.
Bu yazı 16 Ağustos 2026 tarihinde Sunucu & Linux kategorisinde yayınlandı.
Yeni yazılar e-postanıza gelsin

Ayda birkaç e-posta; istediğiniz an tek tıkla ayrılabilirsiniz.

Videolu anlatımlar YouTube'da
Sunucu ve WordPress sorunlarını kısa videolarla anlattığım kanala abone olabilirsiniz. ▶ Kanala abone ol

Yorumlar

Henüz yorum yok. İlk yorumu siz yazın.

Yorum yazın

Yorumlar onaylandıktan sonra yayımlanır. Bağlantı içeren yorumlar spam olarak değerlendirilebilir.