pd_200807012411104_

Sayfada yavaşlama var ne yapabilirim ?

Bir iş görüşmesinde karşıma çıkan bir soruydu bu o sırada aklıma gelenleri söyledim ama sonradan farkettim ki söylemediğim çok fazla şey vardı bu sebeple bu konuyu makale haline getirmeyi uygun gördüm… Soru: Web uygulamanız yavaş çalışıyor ne yaparsınız ? Konuyu bence üçe ayrımak gerek. Sunucu Tarafı İstemci Tarafı Datacenter Tarafı Şimdi bunları tek tek irdeleyelim. Sunucu […]

Bir iş görüşmesinde karşıma çıkan bir soruydu bu o sırada aklıma gelenleri söyledim ama sonradan farkettim ki söylemediğim çok fazla şey vardı bu sebeple bu konuyu makale haline getirmeyi uygun gördüm…

Soru: Web uygulamanız yavaş çalışıyor ne yaparsınız ?

Konuyu bence üçe ayrımak gerek.

Sunucu Tarafı
İstemci Tarafı
Datacenter Tarafı

Şimdi bunları tek tek irdeleyelim.

Sunucu Tarafında Yapılacaklar
Daha önce yazdığım PHP ile Debug İşlemleri  yazısında buna biraz girdik ama anladım ki bu yeterli değil. Buraya ek olarak ;

PHP kodlarımızda analiz yapalım.

Dinamik Kod Analizi
Code Covarage ( phpunit, php code covarage )
Profiling  (Xdebug + kcacgrind, webgrind)
Tracing (Xdebug)

Static Kod Analizi
Data-Flow Analizi (Xdebug + kcacgrind)
Software Metrik ( phploc, pdepend, phpmd, phpcs, phpcpd, bytekit )
Syntax Kontrol ( ide )

Yukarda adı geçen araçları kısaca tanıyalım:
Not: Bu araçlardan bazılarının sayfa yavaşlığı ile ilgisi yoktur yukardaki başlıkların konu bütünlüğü gereği açıklanmıştır.

phpunit : İyi programcılar bile hata yapar. Bu sebeple hataları minumuma indirmek için kodların testi yazılmalıdır. Genellikle yeni bir ekleme veya güncelleme yapılırken farkında olmadan başka bir yer bozulur. Ve bu farkedilinceye kadar oluşan hatalar telafisi zor sonuçlar doğruabilir. Örnek olarak bir eticaret sisteminde ödeme sayfasında meydana gelen bir hatanın herkese -1 TL gibi bir indirim yaptığını düşünün…
İşte bu atraksyonlara son verip kodu her açıdan test etmek için phpunit kullanıyoruz.

php code coverage: phpunit’in kullandığı bir kütüphanedir. Yapılan testlerde kod parçalarının ne kadarının kullanıldığını hesaplamada yardımcı olur. 3 renk simgesi bulunur.
Kırmızı: Test edilmeyen kod
Sarı: Kısmen test edilen
Yeşil: Başarılı bir şekilde test edilen

phploc: Proje hakkında genel bilgiler verir. Kaç adet namespace, function, class ayrıca bunların detaylarını verir.

pdepend: Statik kod analizinde kullanılan bu araç kodlarınızı parçalara ayırıp kolay işlenebilir bir hale getirir. Sonra çeşitli analiz yöntemleri ile kodunuzu analiz edip size değerenlendirmesini verir. Sizin yapacağınız değerlendirmeler objektif olmayabilir ama bu programcık ile yapılan işlemler her zaman standartlara uygundur.

phpmd: pdepend’in daha basit kullanışı daha kolay halidir. Bununla tanımlı ve tanımladığınız kurallar ile muhtemel bug, kullanılmayan method, properties vs tesbiti yapılabilir.

phpcs: Kodunuzun hangi kodlama standartlarında olması gerektiğini söylüyorsunuz oda size uyup uymadığını söylüyor. Kendi standartınızı oluşturabilirsiniz.

phpcpd: Kopyala / Yapıştır yapılan kısımların tesbitinde kullanılıyor.

bytekit: Proje biraz eskilerde kalsada kodunuzun byte analizini yapıyor.
XdebugXdebug’u kurup çalıştırdıktan sonra xdebug’un profiler özelliğini kullanarak kodumuzun genel bir profilini çıkartıp hangi metolarda class larda ne kadar zaman harcandığını görebiliriz. Bu bize nereye bakmamız gerektiği konusunda oldukça ciddi fikirler verecektir.  Profiler datasını okumak için “webgrind, kcachegrind, wincacgrind” uygulamaları kullanılabilir.

Bu araçları kullanarak bir çok hatayı önceden yakalayabilir veya olduktan sonra yakalayıp hızlıca düzeltebilirsiniz :)

Kod Cache
Kodlarımızın cachelenmeside önemli bir performans artışı sağlayacaktır bunun için APC, XCache, Zend Optimizer alternatifler arasında.

Cache

MemcacheHandlerSocket

SQL Kısmı

MySQL üzerinde yavaş çalışan SQL cümleciklerini bulmak için “slow query log” aktif edilmelidir. Gerekli ayarlar yapıldıktan sonra yavaş çalışan sql cümlecikleri buraya loglanacaktır.

Yavaşlığın çözümü noktasında “select * tabloadi, select count(*) from tabloadi” biçiminde kullanımlardan kaçınıp sadece ihtiyacımız olan kadar datayı çekmeliyiz. “count(*)” kullanımı yerine “count(1)” tercih edilmeli. SQL cümleciğinde join kullanıyorsak unutmamalıyız ki “WHERE” e yazdığınız şey genel kümeden çıkarılacaktır. Join içerisine yazdığınız ise join edilen tablo ana kümeye dahil edilmeden çıkarılacaktır. Bu durumda performans olarak join içerisinde koşulu yazmak çoğu zaman avantaj sağlayabilir. Bunlar gibi bir çok ip ucu daha sonra makale olarak yazılacaktır.

Tablomuzda index, primary key alanları eksik ise bunlar kontrol edilmeli. Detaylı bilgi edinmek için “explain” komutu kullanılabilir.

Search Server

Arama için kullanılan SQL sorguları yavaş çalışıyor ve bunlar üstünde yapılacak pek bir şey yoksa veya sorgulama işini farklı bir sunucuda başka araçlarla yapıp yükü dağıtmak istiyorsak Sphinx ve Solr ürünlerini araştırıp ihtiyacınıza uygun olanı seçebilirsiniz.

İstemci Tarafında Yapılacaklar

HTTP isteklerini küçültün
Yanıt süresinin %80’i front-end kısmına harcanmaktadır. En önemli sorun bütün içeriğin tekrar tekrar download edilmesidir. Bunlar resim, stil, script, Flash vs..

Dosyaları birleştirin:  bütün js, css dosyalarını tek bir dosya haline getirip yapılacak olan HTTP isteğini teke indirin.

Google’nın hizmeti olan javascript sıkıştırma servisi kullanılarak dosyalar sıkıştırılmalı. http://closure-compiler.appspot.com/home  (eğer “Advenced” seçilirse kodda yapılan gereksiz kullanımlarda iptal edilecektir.) Eğer olurda 5 MB javascript dosyası varsa bunu 2-3 parçaya bölüp farklı domainlere koyarak aynı anda yüklenmesi sağlanabilir eğer aynı domainde olursa browser bir domaine aynı anda birden fazla istek yapamayacağından yavaşlık olacaktır.

CSS Sprite : tasarımda kullanılan image ları tek bir image haline getirip css ile erişim sağlayın.

Javascript ve style dosyalarını inline yazmaktan kaçınmalı ve bunları dışardan çağırmalıyız. Çünkü inline yazılan css ve js ler her sayfa çağrılışında yeniden yüklenecektir. Eğer dışardan çağrılırsa browser tarafından bellekte tutulacaktır.

Bu değişiklikler ile sitenize ilk defa gelen biri için iyi bir performans artışı sağlanacaktır. Tekrar geldiğinde daha iyi bir performans alması için Browser cache aktif edilmelidir.

İçeriklerinizi çeşitli ülkelerde yansısı olan yerlerde saklayın (CDN)

Bu cümleyi açarsak,  resim, stil, script, Flash, vs.. gibi dosyalarınızı bu ağlar üzerinde tutarsanız
bağlantı kuran kişiye bulunduğu bölgeye en yakın yerden bu içeriğin gelmesi sağlanır böylece ciddi bir performans artışı sağlanmış olur.

Resim, javascript ve css dosyaları mümkünse nginx gibi statik verileri cacheleyebilen bir web server üstünde durmalı.  Amazoun statik içerik saklama servisini kullandığınızda  otomatik olarak bulunulan bölgeye en yakın yerden dosyalar getirilecektir.

Expires veya Cache – Control Ekleyin

Bu kuralın iki yönü vardır

  • Static içerik için cache “asla bitmesin” (never expire) diyebilirsiniz
  • Dinamik içerik için daha esnek olan Cache – Control kullanılabilir
Web sayfanızı görsel gücünü artırmak için kullandığınız çeşitli js, css, images, flash dosyaları aynı zamanda her defasında yapılan istek sayısını artırmakta. Bunun önüne geçmek için tarayıcı tarafında cache işini iyi yönetmek gerekmektedir.
Aşağıdaki komut ile tarayıcıya Nisan 15’e kadar eski dosyaları kullan diyoruz.
                Expires : Thu, 15 Apr 2012 20:00:00 GMT
Eğer web sunucunuz Apache ise aşağıdaki komutu kullanabilirsiniz.
                 ExpiresDefault “access plus 10 years”

Bu işlemleri apache ile htaccess üzerinden yapabilirsiniz. İşlemi dosya bazlıda yapabilirsiniz, sabit dosyaları tarayıcının ne kadar süre tutacağını belirttiğimizde buda ciddi performans artışı yapacaktır.

Stil çağırma işlemi üstte javascript çağırma ise sayfanın en altında yapılmalıdır.

Ajax işlemlerinde okuma yapacaksanız GET yazma veya güncelleme yapacaksanız POST kullanmalısınız.

Son olarak Firebug’ın page speed eklentisi ile hızlıca web sitenizi test edip size sunulan öneriler ile web sitenizin performansını artırabilirsiniz.

Bu maddeler ile HTTP isteklerini minumum seviyeye indirip sunucuya binecek yükü azaltmış olacağız.

Burda anlatılmayan kısımlar için yazar arkadaşlarımızdan Osman Yüksel’in yazısına bakmanızı tavsiye ederim.

3. Datacenter Tarafı
Bu tarafta size sadece bolca email atıp datacenter tarafını dürtmek düşüyor :)

Kaynaklar:
http://developer.yahoo.com/performance/rules.html
http://www.slideshare.net/sebastian_bergmann/reviewing-php-code-oscon11