Bay Bayın İlk Bayta Tuhaf Tuhaf Davası


14

Linode 1024 VPS üzerinde bir web sunucum var

  • Ubuntu 11.10
  • Nginx 1.0.5
  • PHP 5.3.6 (PHP-FPM, APC ile)
  • Vernik 3.0.2

Ve WordPress 3.3.1'e dayanan birkaç blog var. Bunlardan biri, sunucuyu test etmek için varsayılan yapılandırma, tema ve yalnızca "Merhaba Dünya" yayınına sahip düz bir blog. Diğeri ise, yaklaşık 10 bin yayın ve 10 bin'den fazla yorum içeren diğer sunucudan kopyalanan bir blog. Bu blog günde 5k benzersizdir.

Sunucu test blogu için bir ab testinde iyi sayılar verir , ancak klonlanmış blog ile aynı testi yapmak imkansızdır: ab testi sunucuyu çok fazla yükler ve yine de ab'i göstermeyi sağlayan işlemi durdurmam gerekir bu gerçekten kötü sonuç .

Htop ayrıca normal çalışma sırasında "normal" bir yük gösterir , ancak ab testi sırasında anormal büyük yük gösterir .

Başka bir garip şey daha var (benim için en önemlisi): İlk Bayt Zamanı son derece yüksek , ancak bundan sonra site gerçekten hızlı yükleniyor. Bu, bu sonucu veren tools.pingdom.com gibi servislerle kolayca test edilebilir . Lütfen "Bekleme süresi" anlamına gelen sarı bölgeye dikkat edin.

Bu neden oluyor? Olası fikirler:

  • Kötü PHP-FPM yapılandırması
  • Linode DNS yanıt süresi çok kötü. Saçmalık - test blogu DNS para cezasını çözüyor, TTFB harika
  • Kötü Nginx yapılandırması

Birisinin daha fazla bilgiye ihtiyacı olması durumunda,


Ben bu nginx yapılandırma kapsayıcısında if -fkullanma direktif ile ilgili bir şey olabilir düşünüyorum location. Burada okuduğum şeylere dayanarak wiki.nginx.org/Pitfalls , -fdosya için verimsiz bir arama yaptığını hissediyorum, ilk zaman için bayt sorununa neden olabilir, özellikle çok sayıda dizinleri varsa Dosyalar.
d34dh0r53

1
Birkaç düşünce: a) blogun klonlandığı orijinal sunucudan farklılıkları nelerdir (örneğin aynı yığını çalıştırıyor mu?) Vernik ile erişmeyi ve ardından doğrudan nginx'e erişmeyi deneyin). c) MySQL ve PHP-FPM yavaş günlüklerini etkinleştirin. d) mysqltuner.pl dosyasını çalıştırın ve MySQL performansınızı iyileştirip geliştiremeyeceğinizi görün (bloglar veya eklentiler arasındaki en belirgin fark bu olacaktır). e) Gönderdiğiniz PHP-FPM yapılandırması nginx (/var/run/php5-fpm-tpnet.sock! = /var/run/php5-fpm-www-data.sock) tarafından kullanılan gibi görünmüyor
cyberx86

1
Kesinlikle bir PHP sorunu. Wordpress gerçekten yavaş. Bu kadar içeriğiniz olduğunda iyi bir yükleme süresi elde etmek için bir önbellek eklentisi isteyeceksiniz.
Martin Fjordvald

2
'Localhost üzerinde ab çalıştırabilir ve 4k req / s alabilirsiniz' dediniz - hangi localhost'tan (önceki / geçerli) bahsediyorsunuz? Bu değer geçerli sunucunuzdan - yüksek TTFB'ye sahip olan - ise, PHP, MySQL ve web sunucunuzu etkili bir şekilde ortadan kaldırdığınız için probleminiz çok daha ilginç hale geldi. TTFB, DNS, gidiş-dönüş ve işlem süresini içerir. Uzun bir TTFB genellikle işlemeden kaynaklanır (örneğin PHP / MySQL). Ab'yi doğrudan nginx'e karşı çalıştırmanın amacı diğer bileşenleri ortadan kaldırmaktır. Ayrıca, Vernik, kurulum hakkı varsa, arka ucu atlamalı ve çok yüksek bir talep / s vermelidir.
cyberx86

1
Localhost testleriniz geçerli görünmüyor - blogunuzu gerçekten almadınız. Sayfa boyutundaki farka dikkat edin: etki alanından erişildiğinde 7500 bayt, localhost'tan 151 bayt. Muhtemelen birden fazla sanal ana bilgisayarınız olduğu için, ana bilgisayar üstbilgisini ab'ye geçirmeniz gerekir. ab -n 1000 -c 100 -H 'Host: mysite.com' http://127.0.0.1/Bununla birlikte, önbelleğe alınmış (Vernik) ve önbelleğe alınmamış sonuçlardaki fark, sorunun ağ, dns vb.İle ilgisiz olduğu ve beklendiği gibi işlemede yattığı konumu doğrulamak için yeterlidir.
cyberx86

Yanıtlar:


24

İlk olarak, bu bir teşhis değil, bir teşhis yaklaşımıdır.

Bu hiçbir şekilde kapsamlı değildir - hatta yakın bir şey bile, bu sadece bir başlangıç ​​noktasıdır.

İlk Bayt Zamanı

İlk bayt zamanı (TTFB) birkaç bileşene sahiptir:

  • DNS Araması: Alan adının IP adresini bulun (olası iyileştirme: daha fazla sayıda / dağıtılmış / duyarlı DNS sunucusu)
  • Bağlantı süresi: Sunucuya bir soket açın, bağlantıyı görüşün (tipik değer 'ping' süresi civarında olmalıdır - bir gidiş dönüş genellikle gereklidir - sonraki istekler için dikkatli olun)
  • Bekleyen: İlk bayt gönderilmeden önce gereken ilk işlem (iyileştirmeniz gereken yer burasıdır - dinamik içerik için en önemli olanı olacaktır.

Bir ApacheBench çıktısına baktığınızda şunları da görürsünüz:

  • İşleniyor: Bu, bekleyen + içeriğin tam aktarımının toplamıdır (aktarma süresi, alınan veri miktarını indirmek için beklenenden önemli ölçüde daha uzunsa, daha fazla işleme (ilk bayt alındıktan sonra) gerçekleşir (örneğin, sayfa içeriği mevcut olduğu gibi yıkamak)

Bileşenleri Ortadan Kaldırmak için Karşılaştırmalar

Birkaç istisna dışında, probleminiz genellikle aşırı karmaşık / verimsiz koda veya kötü yapılandırılmış MySQL'e inen arka uç işleminde yatmaktadır.

Bu soruna yaklaşmanın iyi bir yolu, kurulumunuzun çeşitli yönlerini ortadan kaldıracak bir dizi karşılaştırmadır. İyi bir karşılaştırma, sorunu daraltmaya yardımcı olmak için mümkün olduğunca sabit kalmalıdır. Şu anda aşağıdaki karşılaştırmaları yaptınız:

  1. Eski sunucuda ve yeni sunucuda çalışan özdeş (klonlanmış) site:
    • Fark: Sunucu
    • Sonuç: eski sunucu hızlı; yeni sunucu yavaş
    • Notlar: Burada gerekenler, kullanılan sunucular (Nginx, vb.) Ve donanım açısından (daha güçlü bir makine olduğu için eski sunucu daha hızlı mıdır?) Bu sunucular arasındaki farkları ölçmektir.
    • Sonuç: kod doğru kurulumda hızlı çalışabilir
  2. Yeni sunucuda site vs tam site
    • Fark: içerik, temalar, eklentiler, vb.
    • Sonuç: Test sitesi hızlı, tam site yavaş
    • Notlar: Teorik olarak, bu test kurulumunuzun birçok yönünü ortadan kaldırmanıza yardımcı olmalıdır - DNS, ağ, hatta nginx / php / mysql kurulumunuz - ancak bu oldukça 'adil' değildir.
    • Sonuç: Ekstra içeriğin performans üzerinde önemli bir etkisi var

İdeal test, sitenizin tamamını çoğaltmanızı, ancak bir makale ve ilişkili yorumlar hariç tüm içeriği silmenizi sağlar. Bu testin amacı, büyük miktarda içeriğin sorun olup olmadığını veya kurulumunuzun diğer yönlerinin (wordpress eklentileri, tema vb.) Nedeni olup olmadığını kesin olarak belirlemek olacaktır. Aynı sitelerin performansını aynı (yeni) sunucuda - aynı sayfayı (aynı uzunlukta, vb.) Yükleyerek karşılaştırırsınız - tek fark toplam site içeriğidir (örneğin, bazı eklentilerin artan içerikle iyi ölçeklendirin).

Hiçbir şeyi değiştirmeden yapabileceğiniz başka karşılaştırmalar da vardır:

  • Uzak konumdan yerel veya yerel test - bu, ağın, gecikmenin, DNS'nin vb.
    • Bunu zaten (bir şekilde) yaptınız ve çoğunlukla bir ağ sorununuz olmadığı sonucuna vardınız.
  • Vernik (örn. Bağlantı noktası 80) vs nginx üzerinden doğrudan bağlantı noktası (bağlantı noktası 8080) - testler arasında yapılandırmanızı değiştirmemeye çalışın - sadece doğru bağlantı noktasını kullanın. Bu size Vernik'in etkisini gösterecektir. Vernik bir önbellek katmanı olduğundan, ilk istekten sonra tüm isteklere çok hızlı bir şekilde hizmet etmelidir - temel olarak, dinamik bir sayfa oluşturmak için gerekli olan arka ucu ve işlemi atlamalı ve önbelleğe alınmış kopyayı çok hızlı bir şekilde sunmalıdır.
    • Bunu yaptınız (yerel olarak olmasa da) ve Verniğin performansınız üzerinde önemli bir olumlu etkisi olduğunu gösterdiniz.

Arka Uçunuzu Ayarlama

Bu noktada ya sorunu bulmuş olmanız ya da arka uçta yattığı sonucuna varmış olmalısınız. Bu size Nginx, PHP veya MySQL bırakır.

(Ben senin tıkanıklık CPU, RAM veya G / Ç olup olmadığını bilmek her zaman kullanışlı olduğunu, burada belirtmeliyim - arasına sar, top, iostat, vmstat, free., Vb bu konuda bazı sonuca gerekir)

nginx

Nginx sadece istek alıyor ve statik içerik sunuyor veya istekleri PHP-FPM'ye kaydırıyor - genellikle Nginx ile optimize edilecek çok şey yok.

  • Set çalışanları = # CPU çekirdeği
  • Kalıcılığı etkinleştir (10-15 değeri iyidir)
  • Gereksiz günlük kaydını devre dışı bırak
  • Gerekirse arabellek boyutlarını artırın
  • İfadelerden kaçının (mümkünse normal ifadeler yerine statik adlar kullanın, gereksiz uzantıları kaldırın)

İdeal olarak, test blogunuz ve klonlanmış blogunuz aynı yapılandırmalara sahiptir, bu durumda Nginx'i sorun olarak etkili bir şekilde ortadan kaldırdınız.

Uygulama

Kodunuzdaki bir sorunu (örneğin, yavaş bir eklenti, vb.) Tanımlamaya çalışıyorsanız, yavaş günlükler başlangıç ​​noktasıdır.

  • MySQL yavaş günlüğünü etkinleştirin ve PHP-FPM yavaş günlüğü karşılaştırmanızı çalıştırın ve nelerin yavaş olduğunu görün.

MySQL

  • Önbelleklerinizi artırın ve iyi bir başlangıç ​​noktası elde etmek için mysqltuner.pl dosyasını çalıştırın .

PHP

  • gereksiz uzantıları devre dışı bırak,
  • register_globals, magic_quotes_ *, expose_php, register_argc_argv, always_populate_raw_post_data
  • memory_limit değerini artır
  • open_basedir ve safe_mode'un önemli performans sonuçları vardır, ancak ek bir savunma katmanı da sağlayabilirler. Performans üzerindeki etkilerinin tolere edilebilir olup olmadığını belirlemek için onlarla ve onlarsız test edin.

PHP-FPM

  • Pm. * Değerlerini ayarlayın - yüksek yük ile başa çıkmak için bunları artırın

Htop sonuçlarınızın php-fpm'yi CPU'nun büyük bölümünü tüketiyor olarak gösterdiğini ve sorunun doğrudan bununla ilişkili olduğu görülüyor.

Önbelleğe almak

Her olası darboğazı optimize ettikten sonra önbelleğe almaya başlayın.

  • Zaten bir opCode önbelleğiniz (APC) var - çalıştığından emin olun (bir test dosyası ile birlikte gelir) - önbellek isabet oranlarınızı kontrol edin ve mümkünse disk yerine APC önbelleğine sahip olun.
  • Kodunuzu önbelleğe ayarlayın (örneğin, Wordpress için W3TC gibi bir eklenti kullanarak)
  • Nginx ile FastCGI önbelleğe almayı ayarlayabilirsiniz - ancak Varnish'e sahip olduğunuzdan, bu en iyi şekilde önlenir.
  • Vernik (daha önce yapmış olduğunuz) gibi bir önbellek katmanı oluşturun ve çalıştığından emin olun (örn. Varnishstat kullanın, Yüksek bir Hit Hızı Elde Etme konusunu okuyun )
  • Sitenizin bileşenleri için daha fazla önbellek ekleyin - örneğin, MemCached

Bazen, uygulamanızın ve donanımınızın sınırlamaları göz önüne alındığında, arka ucun kullanımını en aza indirgemek için arka uç performansını o kadar çok geliştiremeyebilirsiniz - ancak bu önbellekleme noktasıdır.

daha fazla okuma


2
Bu analiz edilecek noktaların harika bir özeti. Yorumunuz için çok teşekkür ederim, tüm bu önerileri içeren ağır bir test yapmaya çalışacağım -söyledikleri gibi, bazıları zaten açıktır ve nihayet problemi tespit edip edemeyeceğimi görüyorum. Saygılarımla, cyberx86.
javipas

Hakkında memory_limit, içeri işaret edildi başka yazı da performans ile yardımcı gelmez.
6'da forloop
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.