PHP-FPM Bellek Davranışını Anlamak
PHP-FPM Bellek Davranışını Anlamak
Kısa cevap: PHP-FPM, bellek tahsilatından sonra bellek alanını OS’ye geri vermez, çünkü bellek tahsisi pahalıdır. Bunun yerine, tekrar kullanım için bellek ayırır. Bu bir bellek sızıntısı değildir — bellek, PHP tarafından erişilebilir ve yeniden kullanılabilir durumda kalır.
PHP’nin Bellek Yaşam Döngüsünü Anlamak
PHP’nin Bellek Yaşam Döngüsünü Anlamak
PHP, Laravel gibi çerçevelerde göreceğiniz benzer bir yaşam döngüsüne sahiptir. PHP’nin çalıştırılması birkaç aşamadan geçer, MINIT() ile başlayıp MSHUTDOWN() ile sona erer.
İlk olarak, MINIT() aşamasında, PHP başlangıç için yeterli bellek ayırır ve start_memory_manager kullanılır. Bu, işletim sisteminden minimum bir temel değeri (örneğin yaklaşık 45KB) ayırır.
Daha sonra, RINIT() aşamasında (istek başlangıcı), uygulamanız bir iş yürüttüğünde, büyük bir toplama işlemi gerçekleştirdiğinde veya kaynak yoğun bir sorgu çalıştırdığında, PHP daha fazla bellek ayırmak zorundadır (örneğin, 124MB). Bu durumda Zend Memory Manager (ZMM) devreye girer.
Zend Bellek Yöneticisi Bellek Tahsisini Nasıl Gerçekleştirir?
Zend Bellek Yöneticisi Bellek Tahsisini Nasıl Gerçekleştirir?
ZMM bellek tahsislerini üç türde kategorize eder:
- Küçük tahsisler: 3KB’dan az
- Büyük tahsisler: 3KB ile 2MB arasında
- Büyük tahsisler: 2MB’dan daha büyük (bunlar doğrudan işletim sisteminden gelir)
Önceden ayarlanmış bellek yoksa, büyük tahsisler
mmapkullanır ve daha küçük tahsislerden farklı bir şekilde işlenir.
Örneğin, PHP belleğe ihtiyaç duyduğunda ZMM’den 150MB talep edebilir; bu durumda ZMM, işletim sisteminden bu alanı mmap kullanarak rezerve etmesini ister. Ancak, neden hemen ihtiyaç duyduğunuzdan (124MB) daha fazla (150MB) istiyorsunuz?
Bu duruma önceden tahsis denir. PHP, hemen ihtiyaç duyulandan biraz daha fazla bellek talep ederek işletim sistemine yapılan pahalı mmap ve munmap çağrılarının sayısını azaltır. Bu optimizasyon, bellek işlemlerini toplu halde gerçekleştirmeyi sağlar.
İstek Tamamlandığında Ne Olur?
İstek Tamamlandığında Ne Olur?
İstek tamamlandığında RSHUTDOWN() tetiklenir. Çöp toplayıcı devreye girer, bellek alanını serbest bırakır ve zvals (PHP’nin iç değer yapıları) temizlenir.
Ancak — ve bu önemli bir nokta — PHP ve ZMM, bu bellek alanını dahili olarak serbest bırakır ama işletim sistemine geri vermez. Neden? Çünkü PHP tekrar bellek ihtiyaç duyarsa, daha önce tahsis edilmiş olanı yeniden kullanabilir. Bellek tahsisi sistem kaynakları açısından oldukça masraflıdır, bu yüzden PHP, bu belleği bir performans optimizasyonu olarak rezerve tutar.
Bu, PHP’nin tekrar belleğe ihtiyaç duyduğunda mevcut olanı kullanması, böylece yeni sistem çağrıları yapmaktan kaçınması anlamına gelir. Verimli olmasına rağmen, PHP’nin aktif olarak kullandığından daha fazla RAM tüketiyormuş gibi görünmesine sebep olur.
unset() Hakkında Ne?
unset() Hakkında Ne?Belki düşünüyor olabilirsiniz: “Ama unset() PHP’de belleği serbest bırakmıyor mu?”
Evet, unset() nesnelere yapılan referansları kaldırır ve yeniden kullanılabilir hale getirebilecek boş alanlar oluşturur — ancak bunlar genellikle küçük tahsislerdir. Fakat, tüm bir sayfa (4KB ile 2MB arasında değişebilir) boşaltacak kadar çok bellek serbest bırakılırsa, yalnızca o zaman PHP bu belleği işletim sistemine geri verir.
Pratik Sonuçlar ve En İyi Uygulamalar
Pratik Sonuçlar ve En İyi Uygulamalar
Bu davranış, Laravel gibi çerçevelerin uyguladığı bazı özelliklerin nedenini açıklar:
- Lazy loading: Kaynakların yüklenmesini ihtiyaç duyulana kadar erteleyerek işlemi optimize eder (ancak aşırıya kaçmamaya dikkat edin, aksi halde performans sorunları yaşayabilirsiniz).
- Chunking: Büyük veri kümelerini daha küçük parçalarda işler.
- Pipes: Veriyi dönüşümler aracılığıyla verimli bir şekilde akıtır.
Bu desenler, PHP’nin bellek yönetim davranışıyla birlikte çalışarak bellek yönetimini daha etkili hale getirir.
Sonuç
Sonuç
PHP-FPM’nin üretimdeki beklenenden daha yüksek RAM tüketimi bir hata ya da bellek sızıntısı değildir — bu, kasıtlı bir optimizasyonun sonucudur. Bellek tahsisini yeniden kullanarak ve işletim sistemine sürekli olarak talepte bulunarak sistem çağrılarını azaltır ve genel performansı artırır. Bu davranışı anlamak, PHP uygulamalarınızı üretim ortamlarında izlemek ve optimize etmek için önemlidir.
Kaynak: Orijinal Makale


