PHP-FPM Pool Ayarlarını Optimize Ederek CPU Kullanımını Azaltma
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ı?
- 2) max_children Hesabı (CPU ve RAM’e Göre)
- 3) Dinamik Mod İçin Denge Değerleri
- 4) Ondemand Modu İçin Ayarlar
- 5) Kuyruk ve Gecikme: listen.backlog & slowlog
- 6) OpCache ve Oturum (Session) İyileştirmeleri
- 7) Havuz Bazlı İzolasyon ve Nice
- 8) Nginx ile Uçtan Uca Ayar Uyumları
- 9) İzleme ve Durum Sayfası
- 10) Ayar Değişikliği ve Yeniden Başlatma
- Hızlı Boyutlandırma Şablonu (Başlangıç)
- Sonuç
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
backlogartırmak tıkanmayı azaltır; Nginx’te defastcgi_busy_buffers_size/fastcgi_buffersuygun 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.