PHP-FPM Pool Ayarları: pm.max_children ve OPcache Optimizasyonu
PHP-FPM pm.max_children hesaplama yöntemi, pool modu seçimi ve OPcache yapılandırması ile sunucu performansını artırın.
PHP-FPM Nedir?
PHP-FPM (FastCGI Process Manager), PHP'nin web sunucularıyla (Nginx, Apache, OpenLiteSpeed) iletişim kurmasını sağlayan bir FastCGI uygulamasıdır. Geleneksel Apache mod_php kurulumundan farklı olarak PHP-FPM, PHP işlemlerini bağımsız bir havuzda (pool) yönetir. Bu yaklaşım birçok avantaj sunar:
- Her site/domain için ayrı pool ve kullanıcı ile izolasyon
- Bellek kullanımı üzerinde hassas kontrol
- Worker sayısını dinamik olarak ayarlama
- Yavaş istek günlüğü (slow log) ile performans sorunlarını tespit
- Nginx ile birlikte kullanıldığında çok yüksek eşzamanlılık
max_children Hesabı
PHP-FPM'in en kritik ayarı olan pm.max_children, aynı anda kaç PHP işleminin çalışabileceğini belirler. Bu değeri çok düşük tutarsanız istekler kuyruğa girer; çok yüksek tutarsanız sunucu belleği tükenir ve swap'a düşer.
Hesaplama Formülü
# Mevcut PHP-FPM process başına bellek tüketimini öğrenmek için:
ps --no-headers -o "rss,cmd" -C php-fpm8.3 | awk '{sum+=$1; count++} END {print sum/count/1024 " MB ortalama"}'
# Formül:
# max_children = (Kullanılabilir RAM) / (PHP process başına ortalama bellek)
# Örnek: 2 GB RAM, process başına 50 MB
# max_children = (2048 MB - 512 MB sistem) / 50 MB = ~30
Pratik kural: WordPress siteleri için PHP process başına ortalama 30-60 MB bekleyin. Laravel uygulamaları 50-100 MB arası tüketebilir.
Pool Yönetim Modları
pm = dynamic (Önerilen – Çoğu durum için)
Worker sayısı trafik yüküne göre dinamik olarak artar ve azalır.
pm = dynamic
pm.max_children = 30
pm.start_servers = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 10
pm.max_requests = 500 ; bellek sızıntısını önler
pm = static (Yüksek ve sabit trafik için)
Her zaman sabit sayıda worker çalışır. Tepki süresi tutarlıdır ama boşta bellek tüketir.
pm = static
pm.max_children = 20
pm = ondemand (Düşük trafik / paylaşımlı hosting için)
İstek geldiğinde worker başlatılır; belirli süre boşta kalırsa sonlandırılır. En az bellek tüketen moddur.
pm = ondemand
pm.max_children = 30
pm.process_idle_timeout = 10s
Pool Yapılandırması: Çok Siteli Kurulum
# /etc/php/8.3/fpm/pool.d/example.conf
[example.com]
user = www-example
group = www-example
listen = /run/php/php8.3-example.sock
listen.owner = www-data
listen.group = www-data
pm = dynamic
pm.max_children = 15
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 5
; Slow log
slowlog = /var/log/php-fpm/example-slow.log
request_slowlog_timeout = 5s
; Error log
php_flag[display_errors] = off
php_admin_value[error_log] = /var/log/php-fpm/example-error.log
OPcache Ayarları
OPcache, PHP betiklerini derlenmiş bytecode olarak bellekte saklar. Böylece her istekte PHP dosyaları yeniden derlenmez; bu, PHP uygulamalarında %50-200 oranında performans artışı sağlar.
# /etc/php/8.3/fpm/conf.d/10-opcache.ini
[opcache]
opcache.enable = 1
opcache.memory_consumption = 256 ; MB cinsinden
opcache.interned_strings_buffer = 16
opcache.max_accelerated_files = 20000
opcache.revalidate_freq = 60 ; Üretimde 0 (manuel temizle)
opcache.save_comments = 1 ; Doctrine gibi ORM için gerekli
opcache.fast_shutdown = 1
opcache.enable_cli = 0
OPcache Durumunu Kontrol Etme
Laravel/WordPress'te OPcache Yenileme
# PHP-FPM'i yeniden başlat (OPcache temizler)
systemctl reload php8.3-fpm
# Veya PHP scriptiyle
php -r "opcache_reset();"
Sık Karşılaşılan Sorunlar
- 502 Bad Gateway: PHP-FPM socket/port yolunu Nginx'te doğru belirttiğinizden emin olun.
systemctl status php8.3-fpmile servis durumunu kontrol edin. - Bellek tükeniyor:
pm.max_childrendeğerini azaltın veya sunucuya RAM ekleyin. - OPcache değişiklik göstermiyor: Geliştirme ortamında
opcache.revalidate_freq=0yerineopcache.validate_timestamps=1kullanın. - Yavaş PHP uygulaması: Slow log'u etkinleştirin ve darboğaz olan fonksiyonları tespit edin.
İlgili Makaleler
Yorumlar
Henüz yorum yok. İlk yorumu siz yapın!