PHP-FPM Pool Ayarlarını Optimize Ederek CPU Kullanımını Azaltma

PHP-FPM Pool Ayarlarını Optimize Ederek CPU Kullanımını Azaltma
Yazı Özetini Göster

PHP-FPM Pool Ayarlarını Optimize Ederek CPU Kullanımını Azaltma

PHP-FPM, PHP isteklerini işleyen havuz (pool) süreçleri sayesinde yüksek eşzamanlılık sağlar; ancak yanlış yapılandırılmış bir havuz, gereksiz context switch, kuyruk ve CPU zıplamalarına yol açar. Bu rehberde pm modu seçimi, süreç sayısı boyutlandırma, istek ömrünü sınırlama ve gözetim (observability) ayarlarıyla CPU kullanımını düşürmenin pratik yollarını anlatıyoruz. Yoğun projelerde tutarlı kaynak izolasyonu için Premium VDS ya da ölçeklenebilir Kurumsal Hosting tercih edilebilir.

1) pm Modu: dynamic mi, ondemand mı?

  • pm = dynamic: Başlangıçta belirli sayıda çocuk süreç açar; trafik dalgalanmalarında daha hızlıdır ancak boşta CPU tüketimi biraz yüksek olabilir.
  • pm = ondemand: İstek geldiğinde süreç oluşturur, belirli bir süre idle kalınca kapatır; düşük trafikte CPU tasarrufu sağlar.

Öneri: Düşük/orta trafikli sitelerde ondemand, yüksek trafikte dynamic. Mikroservis ve API’lerde gecikmeye duyarlıysanız dynamic tercih edin.

2) max_children Hesabı (CPU ve RAM’e Göre)

Her çocuk sürecin ortalama RAM tüketimini ölçün ve CPU çekirdeği başına makul eşzamanlılık hedefleyin.

# Ortalama bellek tüketimini görmek için (örnek)
ps -o rss= -p $(pgrep -d, php-fpm) | awk '{sum+=$1} END {print sum/NR/1024 " MB"}'

Formül: max_children = floor(Ayrılan PHP RAM / Ortalama süreç RAM). Örneğin 4 GB PHP RAM ve süreç başına ~80 MB ise: 4096 / 80 ≈ 51. Ancak CPU 8 çekirdeyse 8–24 aralığı genellikle daha dengelidir; aşırı eşzamanlılık CPU’yu zıplatır.

3) Dinamik Mod İçin Denge Değerleri

; /etc/php/*/fpm/pool.d/www.conf
pm = dynamic
pm.max_children = 24
pm.start_servers = 4
pm.min_spare_servers = 4
pm.max_spare_servers = 12
pm.max_requests = 500
request_terminate_timeout = 60s
  • pm.max_children: Üst sınır; CPU çekirdek sayısının 2–3 katını nadiren aşın.
  • pm.max_requests: Bellek sızıntılarını sıfırlamak için süreçleri periyodik yeniler (CPU dalgalanmasını azaltır).
  • request_terminate_timeout: Sapan (hung) istekleri sonlandırır, CPU spin’lerini engeller.

4) Ondemand Modu İçin Ayarlar

pm = ondemand
pm.process_idle_timeout = 10s
pm.max_children = 16
pm.max_requests = 300

process_idle_timeout ile boşta süreçler kapanır; düşük yükte CPU boştayken enerji ve context switch azalır.

5) Kuyruk ve Gecikme: listen.backlog & slowlog

listen = /run/php-fpm.sock
listen.backlog = 1024
request_slowlog_timeout = 2s
slowlog = /var/log/php-fpm/slow.log
catch_workers_output = yes
  • Yüksek eşzamanlılıkta backlog artırmak tıkanmayı azaltır; Nginx’te de fastcgi_busy_buffers_size/fastcgi_buffers uygun olmalı.
  • slowlog ile CPU’yu şişiren fonksiyon/istekleri yakalayın (N+1 sorgu, uzak API beklemesi vb.).

6) OpCache ve Oturum (Session) İyileştirmeleri

  • OpCache: Kod yorumlama maliyetini düşürür; TTFB ve CPU tüketimi azalır.
  • Session handler olarak dosya yerine Redis kullanmak lock içeriklerini azaltabilir.
; opcache.ini (örnek)
opcache.enable=1
opcache.memory_consumption=192
opcache.max_accelerated_files=100000
opcache.validate_timestamps=0  ; CI/CD ile deploy sonrası restart uygulayın

7) Havuz Bazlı İzolasyon ve Nice

user = siteuser
group = siteuser
; CPU önceliğini düşürmek için systemd unit override kullanın
; systemctl edit php-fpm.service  -> [Service] CPUWeight=80 IOWeight=80

Her site için ayrı havuz kullanın; gürültücü komşunun tüm CPU’yu tüketmesini engellersiniz.

8) Nginx ile Uçtan Uca Ayar Uyumları

# /etc/nginx/conf.d/site.conf (özet)
location ~ \.php$ {
  include fastcgi_params;
  fastcgi_pass unix:/run/php-fpm.sock;
  fastcgi_read_timeout 60s;
  fastcgi_buffers 16 32k;
  fastcgi_busy_buffers_size 64k;
}
keepalive_requests 1000;

Uygun buffer/timeout değerleri PHP-FPM tarafındaki request_terminate_timeout ile uyumlu olmalıdır.

9) İzleme ve Durum Sayfası

pm.status_path = /status
ping.path = /ping
ping.response = pong

Nginx’te bu yolları IP kısıtlaması ile açın ve accepted conn / active processes / max children reached metriklerini takip ederek tıkanma noktalarını (bottleneck) netleştirin.

10) Ayar Değişikliği ve Yeniden Başlatma

# Test edilen yeni değerleri devreye almak için
sudo systemctl reload php*-fpm
# Havuz bazlı dosyaları değiştirdiyseniz reload genelde yeterlidir; sorun varsa restart.

Hızlı Boyutlandırma Şablonu (Başlangıç)

CPU çekirdeği: 8
Trafik: orta (dinamik içerik)
pm = dynamic
pm.max_children = 24
pm.start_servers = 4
pm.min_spare_servers = 4
pm.max_spare_servers = 12
pm.max_requests = 400
request_terminate_timeout = 60s

Gerçek ölçümlerden (CPU steal, run queue length, slowlog, status) sonra 2–3 adımda ince ayar yapın.

Sonuç

Doğru pm modu, gerçekçi max_children, istek ömrünü sınırlayan max_requests/request_terminate_timeout ve slowlog analizi ile CPU kullanımını belirgin biçimde düşürebilirsiniz. Kaynak izolasyonu ve düşük gecikme için uygun altyapı seçimi de kritiktir. Kurumsal projelerde VDS veya Premium VDS + Optimizasyon Hizmeti ile sürdürülebilir performans elde edebilirsiniz.

Bir Yorum Yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Benzer Yazılar