Makale Rehberi
Bir sunucunun aynı anda işleyebileceği kullanıcı sayısı, sahip olduğu çekirdek sayısına değil, her bir işlemin tükettiği bellek miktarına bağlıdır.
Bu ifade bir provokasyon gibi gelebilir, ancak işletme ve bakım sektöründeki en gerçek ve acı verici deneyimi yansıtmaktadır.
Bellek neden en büyük darboğaz?
Birçok kişi 8 çekirdekli işlemciye ve 24 GB belleğe sahip bir VPS gördüğünde, bilinçaltında yüzlerce PHP-FPM işlemini kolayca çalıştırabileceğini düşünür.
Ancak gerçekte, tek bir PHP işleminin RSS bellek kullanımı genellikle 200 MB'a kadar çıkmaktadır.
Bu, komut satırı üzerinden yapılan gerçek testler sonucunda elde edilen sonuçtur:
ps --no-headers -o rss -p $(pgrep php-fpm) | awk '{sum+=$1} END {print sum/NR/1024 " MB"}'
HestiaCP'nin karmaşık yapısı ve çoklu eklenti ortamında, özellikle OPcache optimizasyonu olmadan, 200 MB normal bir değerdir.
Bu, maksimum eşzamanlılığı belirleyen asıl sınırın işlemci değil, bellek olduğu anlamına gelir.

Önerilen yapılandırma dosyası (php-fpm.conf)
pm = dynamic
pm.max_children = 80
pm.start_servers = 16
pm.min_spare_servers = 8
pm.max_spare_servers = 24
pm.max_requests = 500
pm.process_idle_timeout = 10s
request_terminate_timeout = 60s
Parametre hesaplama mantığı ve ayar esasları
| Yapılandırma parametreleri | 设定值 | Temel hesaplama ve kurulum esasları |
|---|---|---|
| pm | dynamic | Dinamik mod, eşzamanlılık gereksinimlerine bağlı olarak süreçlerin esnek bir şekilde eklenmesine veya silinmesine olanak tanıyarak yanıt hızı ve bellek kullanımını dengeler. |
| pm.max_children | 80 | Sistem çekirdeği hariç toplam 24 GB bellek. MySQL/RedisNginx'ten sonra PHP için yaklaşık 16 GB alan kalıyor.16,384 MB / 200 MB ≈ 81.9Değeri 80'e ayarlamak, yüksek eşzamanlılık sırasında bellek yetersizliği (OOM - Out of Memory) sorununu tamamen ortadan kaldırabilir. |
| pm.sunucuları başlat | 16 | Başlatma sırasında ön ısıtma, hizmetin yeniden başlatıldıktan sonra temel eşzamanlılığı anında işleyebilmesini sağlamak için CPU çekirdek sayısının iki katı (8 çekirdek × 2 = 16) olarak ayarlanmıştır. |
| pm.min_spare_servers | 8 | Düşük trafik dönemlerinde bile yeni isteklere her zaman yanıt verilebilmesini sağlamak için işlemci çekirdek sayısını 8'e ayarlayın. |
| pm.maks_yedek_sunucular | 24 | Trafik azaldıktan sonra orta düzeyde işlem sayısını korumak ve hafif dalgalanmaları yönetmek için, işlemci çekirdek sayısını işlemci çekirdek sayısının 3 katına (8 çekirdek × 3 = 24) ayarlayın. |
| pm.max_requests | 500 | Eğer tek bir işlem 200 MB gibi büyük bir bellek tabanına ulaşırsa, istek sayısını 500'e düşürmek işlemi yok edip yeniden oluşturarak örtük bellek sızıntılarını daha hızlı temizleyebilir. |
| pm.process_idle_timeout | 10s | 超出 min_spare_servers Boşta kalan işlemler, 10 saniye boyunca hiçbir istek gelmemesi durumunda otomatik olarak serbest bırakılır ve sistem belleğine geri döndürülür. |
Temel Destekleyici Ayarlar ve Optimizasyon Önerileri
1. Zaman aşımı önleyici mekanizma
request_terminate_timeout = 60s İşte kilit nokta bu.
Veritabanı kilitlenmesi veya üçüncü taraf API engellemesi nedeniyle takılı kalan işlemleri zorla sonlandırabilir.
Bu arada, Nginx'in fastcgi_read_timeout En az 60 saniye bekletilmelidir, aksi takdirde istemciye erken ulaşacaktır. 504 Gateway Timeout.
2. Hafıza darboğazlarının üstesinden gelme stratejileri
En fazla 80 eşzamanlı işlem, aşırı eşzamanlılık koşullarında sistemin aynı anda en fazla 80 dinamik HTTP isteğini işleyebileceği anlamına gelir.
Kapasiteyi daha da artırmak istiyorsanız, odak noktanız işlem başına bellek kullanımını azaltmak olmalıdır.
- OPcache'i etkinleştir:Gün
php.iniOrta seviye yapılandırmaopcache.enable=1veopcache.memory_consumption=256Bayt kodu önbellekleme, tek bir işlemin bellek kullanımını 200 MB'tan 60-100 MB'a düşürebilir. - memory_limit'in makul kontrolü:İrade
php.iniortamemory_limitSınırlı128M或256MBireysel anormal komut dosyalarını önlemek içinsınırsızÇok fazla bellek tüketiyor.
Tek bir işlemin bellek kullanımı 100 MB'a düştüğünde...pm.max_children Güvenli bir şekilde yükseltilebilir. 150 Ayrıca, eş zamanlı işlem kapasitesi neredeyse iki katına çıktı.
Alıntılanan yetkili görüşler
Resmi Nginx dokümanındaki önerilere göre :
"Kaynak tükenmesini önlemek için FastCGI uygulamaları her zaman zaman aşımı yönergeleriyle izlenmelidir."
(Kaynak: Nginx Belgeleri)
Resmi PHP kılavuzunda açıkça belirtilmiştir:
"pm.max_children, oluşturulacak maksimum alt işlem sayısını tanımlar. Bu en önemli yönergedir."
(Kaynak: PHP-FPM Dokümantasyonu)
Bu yetkili görüşler, uygulamalarımızla mükemmel bir uyum içindedir ve optimizasyon mantığının yalnızca deneyime değil, aynı zamanda standartlaştırılmış en iyi uygulamalara da dayandığını kanıtlamaktadır.
Sonuç: Benim Görüşlerim ve Önemli Alıntılar
Yüksek eşzamanlılık senaryolarında, CPU motor, bellek yakıt deposu ve PHP-FPM ise filo dağıtımcısıdır.
Motor ne kadar güçlü olursa olsun, yakıt deposu yeterince büyük değilse, konvoy fazla uzağa gidemez.
Gerçek uzmanlar parametreleri körü körüne maksimuma çıkarmaz, bunun yerine hem israfı hem de taşmayı önlemek için her işlemin bellek kullanımını hassas bir şekilde hesaplarlar.
Optimizasyonun özü, sınırlı kaynaklarla en uygun dengeyi bulmaktır.
Bu sadece bir teknoloji değil, aynı zamanda bir felsefe.
Bu nedenle, "çekirdek sayısı her şeyi belirler" inancından vazgeçin. Eşzamanlılık sınırını gerçekten belirleyen şey, bellek üzerindeki kontrolünüzdür.
Harekete geçin ve VPS'nizi en üst düzeyde optimize ederek, belleğin her damlasından en iyi şekilde yararlanın.
Umarım Chen Weiliang'ın blogunda ( https://www.chenweiliang.com/ ) paylaşılan "8 çekirdekli 24 GB VPS'de bellek yetersizliği mi yaşanıyor? HestiaCP altında PHP-FPM işlem havuzunun aşırı optimizasyonu" başlıklı makale size yardımcı olur.
Bu makalenin bağlantısını paylaşmaktan çekinmeyin: https://www.chenweiliang.com/cwl-34509.html
