- Konu sahibi
- #1
Yavaş yanıt süresini düzeltmenin doğru yolu, Apache ayarlarını rastgele büyütmek değil, beklemenin nerede oluştuğunu ölçerek ilerlemektir. Önce yanıt süresini DNS, bağlantı, TLS, Apache ve uygulama olarak ayırın; ardından
“Apache yavaş” ifadesi tek başına yeterli değildir. Bir isteğin toplam süresi; DNS çözümlemesi, TCP ve TLS bağlantısı, Apache’nin isteği kabul etmesi, uygulamanın çalışması ve yanıtın istemciye aktarılması gibi farklı aşamalardan oluşur. Apache yapılandırmasını değiştirmeden önce gecikmenin hangi aşamada yoğunlaştığını bulun.
Aynı URL için birkaç kez başlık isteği göndererek başlangıç noktası oluşturabilirsiniz:
Buradaki
Bu ölçümü önbellekli ve önbelleksiz yanıtlar için ayrı değerlendirin. Sadece tarayıcıda sayfanın hızlı açılması, Apache’nin hızlı yanıt verdiğini kanıtlamaz; tarayıcı önbelleği, CDN ve daha önce kurulmuş bağlantı sonucu etkileyebilir.
Apache’nin hangi istekleri işlediğini ve boşta işçi kalıp kalmadığını görmek için
Dağıtımınızda servis adı
Burada özellikle şu durumlara bakın:
Apache 2.4’te MPM, sunucunun süreç ve iş parçacıklarını nasıl kullandığını belirler. Unix benzeri sistemlerde
Önce hangi MPM’nin etkin olduğunu öğrenin:
Çıktıda
MPM ayarlarında en sık yapılan hata
Keep-alive, aynı TCP bağlantısının birden fazla istekte kullanılmasını sağlar; ancak bağlantının uzun süre açık tutulması, özellikle yanlış MPM veya yetersiz işçi kapasitesiyle birlikte kaynak tüketebilir.
Bu ayarı değiştirirken aynı anda
Statik dosyalar Apache tarafından doğrudan sunuluyorsa dosya boyutlarını, disk erişimini ve gereksiz modülleri inceleyin. CSS ve JavaScript dosyalarının gereksiz büyük olması toplam aktarım süresini artırır; ancak bu durum ilk bayt süresini açıklamayabilir. Büyük dosyalarda toplam süre yüksek, ilk bayt süresi düşükse sorun çoğunlukla yanıt üretiminde değil aktarım boyutundadır.
Metin tabanlı HTML, CSS, JavaScript, JSON ve SVG yanıtlarında
Değişmeyen statik dosyalarda uzun süreli istemci önbelleği kullanılabilir. Dosya adlarına sürüm veya içerik özeti eklenmiyorsa uzun önbellek süresi, yeni dosyanın istemciye geç ulaşmasına neden olabilir. Bu nedenle önbellek süresini artırmadan önce dosya adlarının değişiklikleri ayırt edip etmediğini kontrol edin.
Apache önbelleği yalnızca içeriğin gerçekten önbelleğe uygun olduğu durumlarda kullanılmalıdır. Oturum, kişisel veri, yönetici ekranı veya kullanıcıya göre değişen yanıtları yanlışlıkla ortak önbelleğe almak güvenlik ve doğruluk sorunu oluşturur. Önbellek kullanıldığında ilk isteğin yavaş olması, sonraki isteğin hızlanması beklenebilir; bu, uygulamanın her zaman düzeldiğini kanıtlamaz. Önbellek dışı isteklerin süresini de ayrı ölçün.
Apache bir PHP, Python, proxy veya CGI uygulamasından yanıt bekliyorsa işçi uzun süre meşgul kalabilir. Bu durumda Apache’yi daha fazla işçiyle çalıştırmak yalnızca daha fazla eşzamanlı uygulama süreci başlatır. Sonuç; veritabanı bağlantı havuzunun dolması, RAM tüketiminin artması veya uygulamanın daha da yavaşlaması olabilir.
Yavaş bir URL için şu ayrımı yapın:
Her değişiklikten önce ilgili Apache yapılandırma dosyasının yedeğini alın. Ardından şu sırayı izleyin:
Sorun devam ederse destek veya barındırma sağlayıcısına yalnızca “Apache yavaş” demek yerine şu bilgileri birlikte iletin: ölçüm zamanı ve saat dilimi, test edilen URL,
Apache’de
Apache’yi
server-status, erişim günlüğü ve işletim sistemi kaynak kullanımını birlikte inceleyin. Sorun Apache’nin bağlantı yönetimindeyse uygun MPM ve işçi sınırlarını düzenleyin; PHP, veritabanı veya harici API bekletiyorsa Apache’yi büyütmek yerine uygulama katmanını düzeltin. Her değişiklikten sonra aynı URL’yi, benzer trafik koşulunda yeniden ölçün.Önce yavaşlığın hangi katmanda olduğunu belirleyin
“Apache yavaş” ifadesi tek başına yeterli değildir. Bir isteğin toplam süresi; DNS çözümlemesi, TCP ve TLS bağlantısı, Apache’nin isteği kabul etmesi, uygulamanın çalışması ve yanıtın istemciye aktarılması gibi farklı aşamalardan oluşur. Apache yapılandırmasını değiştirmeden önce gecikmenin hangi aşamada yoğunlaştığını bulun.
Aynı URL için birkaç kez başlık isteği göndererek başlangıç noktası oluşturabilirsiniz:
Bash:
curl -sS -o /dev/null -w 'dns=%{time_namelookup} connect=%{time_connect} tls=%{time_appconnect} start=%{time_starttransfer} total=%{time_total}\n' https://example.com/
Buradaki
example.com değerini kendi alan adınızla değiştirin. time_starttransfer, istemcinin ilk yanıt baytını ne kadar sürede aldığını; time_total ise yanıtın tamamının ne kadar sürede geldiğini gösterir. DNS veya TLS süreleri yüksekse Apache ayarını değiştirmek doğrudan çözüm sağlamaz. İlk bayt süresi yüksek, toplam süre buna yakınsa sunucu ya da uygulama yanıtı geç üretmektedir. İlk bayt hızlı, toplam süre yüksekse büyük yanıt, yavaş istemci, sıkıştırma veya ağ aktarımı incelenmelidir.Bu ölçümü önbellekli ve önbelleksiz yanıtlar için ayrı değerlendirin. Sadece tarayıcıda sayfanın hızlı açılması, Apache’nin hızlı yanıt verdiğini kanıtlamaz; tarayıcı önbelleği, CDN ve daha önce kurulmuş bağlantı sonucu etkileyebilir.
Apache’nin anlık durumunu ve günlüklerini inceleyin
Apache’nin hangi istekleri işlediğini ve boşta işçi kalıp kalmadığını görmek için
mod_status kullanılabilir. Yapılandırma dosyanıza, erişimi yalnızca yönetim IP adresinizle sınırlandırarak benzer bir bölüm ekleyin:
Kod:
<Location "/server-status">
SetHandler server-status
Require ip 203.0.113.10
</Location>
203.0.113.10 yerine kendi sabit yönetim IP adresinizi yazın. Sabit IP’niz yoksa bu alanı genel internete açmayın; erişimi VPN, güvenlik duvarı veya yalnızca yerel yönetim ağı üzerinden sınırlandırın. Yapılandırmayı kaydettikten sonra önce Apache yapılandırmasını denetleyin, hata yoksa yeniden yükleyin:
Bash:
apachectl configtest
systemctl reload apache2
Dağıtımınızda servis adı
httpd ise ilgili komutu buna göre kullanın. Yapılandırma denetimi hata verirse yeniden yükleme yapmayın; hata satırındaki dosya ve yönergeyi düzeltin. Başarılı yeniden yüklemeden sonra /server-status sayfasını yalnızca izin verilen ağdan açın.Burada özellikle şu durumlara bakın:
- Boşta işçi kalmıyor ve etkin istek sayısı sürekli sınıra dayanıyorsa Apache eşzamanlı istek kapasitesine ulaşmış olabilir.
- CPU kullanımı yüksek, fakat istekler kısa sürede tamamlanıyorsa sıkıştırma, TLS, yoğun günlükleme veya yüksek istek hacmi etkili olabilir.
- İstekler uzun süre etkin kalıyor ve aynı URL’ler tekrar tekrar görünüyorsa uygulama, veritabanı veya harici servis beklemesi araştırılmalıdır.
- Bellek kullanımı yükseliyor ve takas alanı kullanılmaya başlıyorsa daha fazla işçi açmak gecikmeyi azaltmak yerine artırabilir.
server-status anlık bir görüntüdür; tek başına hangi isteğin her zaman yavaş olduğunu kanıtlamaz. Yavaş istekleri erişim günlüğünde süre bilgisiyle izlemek daha kalıcı bir teşhis sağlar. Günlük biçiminizde istek süresi yoksa, kullandığınız dağıtımın Apache günlük yapılandırmasında desteklenen zaman değişkenleriyle ayrı bir günlük alanı ekleyin. Ardından yavaş URL, yanıt kodu, istemci IP’si ve istek süresini birlikte gruplayın. Aynı URL’nin yalnızca yoğun saatlerde yavaşlaması kapasite sorununa; her zaman yavaş kalması uygulama veya veritabanı sorununa daha çok işaret eder.MPM seçimini ve işçi sınırlarını kontrol edin
Apache 2.4’te MPM, sunucunun süreç ve iş parçacıklarını nasıl kullandığını belirler. Unix benzeri sistemlerde
event, worker ve prefork seçenekleri bulunabilir. event, boşta bekleyen keep-alive bağlantılarının etkin iş parçacıklarını gereksiz yere meşgul etmemesi için tasarlanmıştır. Bu nedenle thread-safe çalışan uygulama ve modüllerle kullanılan, modern Linux sunucularda genellikle ilk incelenecek seçenektir.Önce hangi MPM’nin etkin olduğunu öğrenin:
Bash:
apachectl -V | grep -i mpm
apachectl -M | grep mpm
Çıktıda
mpm_prefork_module görüyorsanız, doğrudan event modülüne geçmeyin. PHP gibi Apache içine yüklenen veya thread-safe olmayan bir modül prefork gerektirebilir. Uygulama PHP-FPM gibi ayrı bir işlem yöneticisi üzerinden çalışıyor ve kullanılan diğer modüller thread-safe ise event MPM’ye geçiş değerlendirilebilir. Geçişten önce mevcut yapılandırmanın yedeğini alın, tek bir MPM’nin yüklü olduğundan emin olun ve dağıtımınızın paketleme yöntemine uygun modül etkinleştirme komutlarını kullanın.MPM ayarlarında en sık yapılan hata
MaxRequestWorkers değerini RAM’i hesaba katmadan yükseltmektir. Bu değer, Apache’nin aynı anda işleyebileceği etkin işçi sayısını sınırlar. Yaklaşık bellek hesabı için Apache süreçlerinin veya iş parçacıklarının ortalama çalışma belleğini ölçün; ardından işletim sistemi, PHP-FPM, veritabanı ve diğer servisler için pay bırakarak sınır belirleyin. Örneğin varsayımsal olarak Apache için kullanılabilir 2.400 MB RAM ayırabiliyor ve bir Apache işçisi ortalama 80 MB kullanıyorsa teorik üst sınır 30 işçidir. Bu değer güvenli nihai ayar değildir; ani bellek artışları ve diğer servisler için ayrıca pay gerekir.MaxRequestWorkers sınırına sürekli ulaşılıyor, RAM ve CPU hâlâ uygun durumdaysa kademeli artış düşünülebilir. Sınırın artırılmasıyla birlikte bellek tükeniyor, takas başlıyor veya yanıt süresi uzuyorsa eski değere dönün. Sınır hiç dolmuyor ama ilk bayt süresi yüksek kalıyorsa bu ayar asıl sorunu çözmez; uygulama ve veritabanı ölçümlerine geçin.Keep-alive ve bağlantı beklemelerini dengeli ayarlayın
Keep-alive, aynı TCP bağlantısının birden fazla istekte kullanılmasını sağlar; ancak bağlantının uzun süre açık tutulması, özellikle yanlış MPM veya yetersiz işçi kapasitesiyle birlikte kaynak tüketebilir.
event MPM’de keep-alive bağlantılarının yönetimi için özel mekanizmalar bulunduğundan, sırf bağlantılar açık kalıyor diye keep-alive’ı tamamen kapatmak doğru ilk adım değildir.KeepAliveTimeout değerini çok yüksek tutmak, kullanılmayan istemcilerin bağlantıyı uzun süre işgal etmesine; çok düşük tutmak ise yeni TCP ve TLS bağlantılarının artmasına yol açabilir. Önce server-status üzerindeki keep-alive ve etkin bağlantı durumunu, ardından erişim günlüklerindeki bağlantı ve yanıt sürelerini inceleyin. Bağlantıların çoğu boşta bekliyor ve işçi kapasitesi doluyorsa timeout değerini kademeli düşürün. Yeni bağlantı ve TLS yükü belirgin biçimde artarsa aşırı düşürmüş olabilirsiniz.Bu ayarı değiştirirken aynı anda
MaxRequestWorkers, MPM ve ağ katmanını değiştirmeyin. Tek değişkenle ilerlemek, ölçüm sonucunun hangi ayardan kaynaklandığını anlamanızı sağlar.Statik içerik, sıkıştırma ve önbelleği doğru yerde kullanın
Statik dosyalar Apache tarafından doğrudan sunuluyorsa dosya boyutlarını, disk erişimini ve gereksiz modülleri inceleyin. CSS ve JavaScript dosyalarının gereksiz büyük olması toplam aktarım süresini artırır; ancak bu durum ilk bayt süresini açıklamayabilir. Büyük dosyalarda toplam süre yüksek, ilk bayt süresi düşükse sorun çoğunlukla yanıt üretiminde değil aktarım boyutundadır.
Metin tabanlı HTML, CSS, JavaScript, JSON ve SVG yanıtlarında
mod_deflate veya sunucunuzun desteklediği uygun sıkıştırma yöntemini kullanabilirsiniz. Görselleri ve zaten sıkıştırılmış arşivleri tekrar sıkıştırmak CPU tüketir, fakat anlamlı boyut kazancı sağlamayabilir. Sıkıştırmayı etkinleştirdikten sonra CPU kullanımını ve Content-Encoding başlığını kontrol edin. Başlıkta sıkıştırma görünmüyor veya sıkıştırma CPU’yu tüketiyorsa MIME türleri, boyut eşiği ve sıkıştırma düzeyi yeniden düzenlenmelidir.Değişmeyen statik dosyalarda uzun süreli istemci önbelleği kullanılabilir. Dosya adlarına sürüm veya içerik özeti eklenmiyorsa uzun önbellek süresi, yeni dosyanın istemciye geç ulaşmasına neden olabilir. Bu nedenle önbellek süresini artırmadan önce dosya adlarının değişiklikleri ayırt edip etmediğini kontrol edin.
Apache önbelleği yalnızca içeriğin gerçekten önbelleğe uygun olduğu durumlarda kullanılmalıdır. Oturum, kişisel veri, yönetici ekranı veya kullanıcıya göre değişen yanıtları yanlışlıkla ortak önbelleğe almak güvenlik ve doğruluk sorunu oluşturur. Önbellek kullanıldığında ilk isteğin yavaş olması, sonraki isteğin hızlanması beklenebilir; bu, uygulamanın her zaman düzeldiğini kanıtlamaz. Önbellek dışı isteklerin süresini de ayrı ölçün.
Apache dışındaki beklemeleri ayırın
Apache bir PHP, Python, proxy veya CGI uygulamasından yanıt bekliyorsa işçi uzun süre meşgul kalabilir. Bu durumda Apache’yi daha fazla işçiyle çalıştırmak yalnızca daha fazla eşzamanlı uygulama süreci başlatır. Sonuç; veritabanı bağlantı havuzunun dolması, RAM tüketiminin artması veya uygulamanın daha da yavaşlaması olabilir.
Yavaş bir URL için şu ayrımı yapın:
- Statik bir dosya hızlı, dinamik sayfa yavaşsa Apache’nin temel dosya sunumu yerine uygulama zincirini inceleyin.
- Tüm URL’ler aynı anda yavaşlıyorsa CPU, RAM, disk, ağ, TLS veya Apache kapasitesini kontrol edin.
- Sadece belirli parametreli istekler yavaşsa veritabanı sorgusu, dış API çağrısı veya uygulama kodundaki koşullu işlem araştırılmalıdır.
- Apache günlüğünde 5xx hataları veya proxy zaman aşımı görülüyorsa yalnızca timeout değerini artırmayın; önce arka uç servisin neden zamanında yanıt vermediğini bulun.
Değişikliği güvenli biçimde uygulayın ve sonucu yorumlayın
Her değişiklikten önce ilgili Apache yapılandırma dosyasının yedeğini alın. Ardından şu sırayı izleyin:
- Mevcut MPM,
MaxRequestWorkers,KeepAliveTimeout, CPU, RAM, disk kullanımı ve örnek URL yanıt sürelerini kaydedin. - Yalnızca bir ayar veya bir ayar grubu değiştirin; dosyayı kaydedin.
- Yapılandırmayı
apachectl configtestile denetleyin. Hata varsa yeniden yüklemeyin; bildirilen dosya ve satırı düzeltin. - Denetim başarılıysa Apache’yi yeniden yükleyin. Yeniden başlatma yerine yeniden yükleme destekleniyorsa mevcut bağlantıları daha az etkileyen bu yöntemi tercih edin.
- Aynı URL’leri tekrar ölçün; ilk bayt süresi, toplam süre, HTTP durum kodu, CPU, RAM, takas ve
server-statusişçi durumunu birlikte karşılaştırın. - Yanıt süresi düzelmiyor veya kaynak kullanımı kötüleşiyorsa son değişikliği geri alın ve bir sonraki katmanı inceleyin.
Sorun devam ederse destek veya barındırma sağlayıcısına yalnızca “Apache yavaş” demek yerine şu bilgileri birlikte iletin: ölçüm zamanı ve saat dilimi, test edilen URL,
curl zaman değerleri, HTTP durum kodu, Apache sürümü ve etkin MPM, ilgili günlük satırları, server-status sırasında etkin işçi durumu, CPU/RAM/takas kullanımı ve son yapılandırma değişikliği. Parola, oturum çerezi veya kişisel verileri paylaşmadan bu veriler üzerinden hangi katmanda darboğaz bulunduğunun incelenmesini isteyin.Sık sorulan sorular
Apache’de MaxRequestWorkers değerini artırmak her zaman yanıt süresini düşürür mü?
Hayır. Değer düşük olduğu için istekler gerçekten sırada bekliyorsa yardımcı olabilir. Ancak CPU, RAM, veritabanı veya uygulama zaten doygunsa daha fazla işçi kaynak yarışını artırır ve yanıt süresini kötüleştirebilir. Önce
server-status, RAM ve takas kullanımını inceleyin.Apache’yi prefork yerine event MPM’ye geçirmek güvenli midir?
Her kurulum için doğrudan güvenli değildir. Apache içine yüklenen modüllerin thread-safe olması ve uygulama çalışma modelinin buna uygun olması gerekir. Özellikle modül uyumluluğunu ve PHP’nin Apache’ye nasıl bağlandığını kontrol etmeden MPM değiştirmeyin.
Keep-alive’ı kapatmak yavaş yanıt sorununu çözer mi?
Genellikle ilk çözüm değildir. Kapatmak yeni TCP ve TLS bağlantılarını artırabilir. Sorun, boşta bağlantıların işçileri tüketmesi ise timeout ve MPM davranışı birlikte incelenmeli; bağlantıların kendiliğinden neden uzun süre açık kaldığı belirlenmelidir.
İlk bayt süresi yüksek, toplam süre de yüksekse neye bakmalıyım?
Önce dinamik uygulama, veritabanı, PHP-FPM veya proxy arka ucu incelenmelidir. Statik dosya hızlıyken yalnız dinamik sayfa yavaşsa Apache işçi sayısını artırmak yerine yavaş sorguyu, harici API çağrısını veya uygulama işlemini ölçün.
Değişiklikten sonra site açılmazsa ne yapmalıyım?
Önce
apachectl configtest çıktısındaki dosya ve satırı kontrol edin. Yapılandırma hatalıysa son değişikliği geri alıp yeniden denetleyin. Apache başlıyor fakat istekler hata veriyorsa hata günlüğünde modül yükleme, izin, proxy, PHP-FPM ve zaman aşımı kayıtlarını; ardından HTTP durum kodlarını inceleyin.