By Surkay Baykara

Yük Testleri ve Uçtan Uca Performans Yönetimi

Günümüzün en büyük trendlerinden biri olan yazılım tanımlı işler zaman geçtikçe daha da büyük hacimlere ulaşmakta ve tüm sektörlerin genel iş yapış temeline yazılımı oturtmaktadır. Bu noktada yazılımın gösterdiği performans ve erişilebilirlik direkt olarak firmaların karını ve itibarını etkilemektedir.

Performans testlerinin yapılmasındaki amaç, belirlenen koşullar ve uygulanan yük altında, test yapılan sistemde ortaya çıkabilecek darboğazları ortaya çıkarmak ve sistemin genel performansını ölçmektir. Performans testlerinde darboğazlar; uygulama seviyesinde olabileceği gibi; veritabanı, ağ veya işletim sistemi seviyesinde de olabilmektedir.

Bu noktada performans testinde elde edilen veriler ışığında oluşan darboğazın hangi katmanda ve neden oluştuğunu anlamak için uçtan uca performans yönetimi araçlarının kullanılması problemlerin hızlıca belirlenip çözülmesi adına oldukça önemlidir.

Proaktif bilgi güvenliğinin en önemli bileşenleri olan sızma ve zayıflık tarama testlerine ek olarak DDoS ve yük/performans testleri de bilgi güvenliği kavramlarından erişilebilirliği ölçerek uygulamaların maksimum seviyede performans göstermesine ve erişilebilir olmasına yardımcı olmaktadır.

Yük/Performans testleri temel olarak uygulamanın kapasitesini ve yük altında son kullanıcıya sunduğu performansı belirtmesinin yanında arka planda var olan veya oluşabilecek tasarımsal hatalarında belirlenmesine yardımcı olacaktır.

Efektif bir yük/performans testi için uygulamanın aşağıdaki kriterleri optimum seviyede karşılaması gerekmektedir.

Anahtar Performans Göstergeleri (KPI)

  • Ortalama gecikme süreleri (average latency)
  • İstek ve cevap süreleri
  • Sunucu kullanım oranı (utilization)

İş Süreçlerinin Tamamlanma Oranı

  • Saniyede gerçekleştirilen işlemler
  • Yük altında oluşan sistem throughput değerleri

Donanım Metrikleri

  • CPU kullanımı
  • Hafıza kullanımı
  • Ağ trafiği değerleri

Yukarıdaki değerlerin ortalama olarak ölçülmesinin yanında standart sapma değerlerinin de belirlenmesi problemlerin kullanıcıların ne kadarını etkilediğini belirlemesi açısından faydalı olacaktır.

1-Ön yüz Performansı

Ön yüz performansı temelde daha az HTTP isteği yapılması ve HTML boyutunun azaltılmasına dayanmaktadır. Ek olarak kullanıcı tarafındaki değişkenler de (tarayıcı tipi, konum, hat hızı vb.) performans anlamında etki etmektedir. Aşağıdaki uygulanabilir örnekler kullanıcı tarafındaki değişkenler haricinde temelde performans kazancı için alınabilecek aksiyonları belirtmektedir. Çoğu proje için tüm maddeleri uygulamak mümkün olmasa da projeniz için uygulanabilir maddeleri kullanarak uygulamanızın ön yüz performansını önemli ölçüde arttırabilirsiniz.

Bu noktada performansı ölçmek ve trendini izleyebilmek performansı geliştirmek adına oldukça önemlidir. Piyasada uçtan uca performans yönetimi sunan araçların RUM (Real User Monitoring) veya EUM (End User Monitoring) adı altında sundukları eklentileri kullanarak performans değerinizi anlık olarak ölçebilir ve hızlıca aksiyon alabilirsiniz.

 

 

 

 

 

Ön yüz performansını arttırmak için hızlıca uygulayabileceğiniz maddeler aşağıdaki gibidir,

   1.1 Stilleri Sayfanın En Üstünde, Scriptleri ise En Altında Kullanın

Stiller sayfanın en üstünde kullanıldığında sayfanın render edilmesi aşamalı olacağından kullanıcıya sayfanın yüklenmesinin hızlı olduğu izlenimini vermektedir. Stiller sayfanın en altına yerleştirildiğinde CSS yüklenene kadar sayfa stilsiz olarak render edilecektir. Öte yandan scriptlerin sayfanın en altında olması blok olarak yüklenip çalıştırılacağından dolayı performans adına olumlu etkileri olacaktır.

   1.2 Scriptleri Asenkron Çalıştırın

Scriptleri asenkron olarak çalıştırmadığınızda sayfa herhangi bir HTML dokümanını render etmeden önce scriptlerin tam olarak indirilip çalıştırılmasını bekleyecektir. Bu nedenle sayfanın yüklenmesine ek yük getirecektir. Scriptler asenkron olarak indirilirken ise sayfanın render edilmesi devam edecektir. Ayrıca 3.parti scriptleri yüklerken karşı taraftan kaynaklanabilecek problemlerde aşılmış olacaktır.

   1.3 Paralel İşlemleri Maksimize Edin

Tarayıcının aynı anda daha fazla kaynak indirebilmesi için kaynakları farklı bir alanlardan sunabilirsiniz. Eğer tarayıcı bir alandan aynı anda sadece iki kaynağı indirebiliyorsa kaynakları iki farklı alana yayarak paralel işlemi iki katına çıkarabiliriz. Özellikle bu işlemi statik kaynaklarınız için uygulayabilirsiniz. Örnek vermek gerekirse Twitter statik kaynaklarını si0.twimg.com adresinden Facebook ise fbstatic-a.akamaihd.net adresinden sunmaktadır. Bu noktada CDN teknolojisinin kullanımı da performans anlamında oldukça fayda sağlayacaktır.

   1.4 DNS Aramalarını Azaltın

Kaynakların farklı alanlardan çekilmesi durumunda her bir yeni alan için DNS araması yapılması gerekmektedir. Bu sorgular normalde 20 – 120 ms, mobil tarafta ise 120 – 400 ms arası sürmektedir. Ek olarak DNS araması tamamlana kadar tarayıcı herhangi bir kaynak indirememektedir. Bu nedenle dış kaynakların mümkün olduğunca az tutulup DNS aramalarının azaltılması performans açısından faydalı olacaktır.

   1.5 Stillerinizi ve Scriptlerinizi Minimize Edin

Stillerin ve scriptlerin minimize edilmesi dosya boyutunu küçülterek indirilmesini ve çalıştırılmasını hızlandıracaktır. Bunun için Sass, Less veya Stylus gibi ön derleyicileri kullanabilirsiniz.

   1.6 İmajlarınızı Optimize Edin

İmaj dosyaları genellikle web için gerekli olmayan birçok bilgiyi barındırmaktadır. Örneğin bir jpeg resmi kameradan gelen Exif metadata bilgilerini de içerebilmektedir veya PNG dosyası renk bilgisi, metadata ve bazen gömülü küçük resmini de barındırmaktadır. Bu ek bilgilerin hiçbiri web temelinde kullanıldığında tarayıcı için anlam ifade etmemekte ve dosya boyutunu önemli ölçüde büyütmektedir.

İmaj optimizasyonunu istediğiniz seviyede gerçekleştiren birçok araç bulunmaktadır. İmaj kalitesini de belirli bir ölçüde tutarak optimum dosya boyutuna ulaşıp önemli ölçüde performans iyileştirmesi sağlayabilirsiniz.

   1.7 CSS ve Script Dosyalarını Birleştirin

HTML dokümanı içerisinde çok sayıda CSS veya script dosyası barındırdığınızda sayfa yüklenirken o kadar fazla http isteği yapacaktır. CSS ve script dosyalarınızı birleştirerek daha az sayıda http isteği yapılmasını ve bu sayede sayfanın daha hızlı yüklenmesini sağlayabilirsiniz.

   1.8 if-modified-since HTTP header’ını Uzun Tutun

Eğer içerik güncel ise sunucu ‘304 Not Modified’ yanıtı dönerek tarayıcının istenilen sayfanın lokal kopyasının kullanmasını belirtir. Bu nedenle kısa tutulan if-modified-since http header değeri ön belleğin efektif kullanılmasını engellemekte ve performans kaybı yaşanmasına neden olmaktadır.

   1.9 HTML içerisinde imajları ölçeklendirmeyin

İmajın genişlik ve yükseklik değerlerini tanımladığınızda herhangi bir değişiklik durumunda yeniden render edilmesinin önüne geçmiş olursunuz. Bu sayede ek işlem ve isteklerden kaçınmış olursunuz.

   1.10 Inline / Embeded koddan kaçının

Inline ve embeded kod http istek sayısını azaltmasına rağmen HTML dokümanının boyutunu arttırmaktadır. Inline / embeded kod kullanımı küçük çaplı projelerde http isteklerinin azaltması açısından kullanılabilir ancak büyük çaplı projelerde kullanıldığında tarayıcının ön belleğe alması sayesinde performans adına olumlu yararları olacaktır.

   1.11 @import yerine <link> kullanın

Dış stillerinizi sayfaya ekleyebilmek için @import veya <link> kullanabilirsiniz. @import kullandığınızda tarayıcı paralel indirme özelliğini yitirecek ve bu nedenle diğer kaynakların indirilmesini engelleyecektir. <link> kullanıldığında ise tarayıcı paralel olarak diğer kaynakları da indirebilecek ve bu sayede performans iyileştirmesi sağlayabileceksiniz.

   1.12 Data URI veya CSS Stripe Kullanın

Bu teknik temel olarak farklı imajları tek bir dosyada gruplamaya dayanmaktadır. Bu sayede http isteklerini önemli ölçüde azaltabilir ve diğer kaynakları indirirken ertelenmesinin önüne geçebilirsiniz.

2. Uygulama Performansı

Uygulama performansını genel olarak ön yüz ve arka katman arasında geçen süre olarak tanımlayabiliriz. (Ağ katmanını hariç) Uygulama katmanında işlem mantıksal olarak değerlendirildiğinden uçtan uca performans içerisinde önemli bir rol oynamaktadır. Bu nedenle uygulama performansını ölçmek işlem akışını optimize edeceğinden performans anlamında son kullanıcıya direkt olarak etkisini gösterecektir.

Bu noktada performansı ölçmek ve trendini izleyebilmek performansı geliştirmek adına oldukça önemlidir. Piyasada uçtan uca performans yönetimi sunan araçların APM (Application Performance Management) adı altında sundukları yazılımları kullanarak performans değerinizi anlık olarak ölçebilir ve hızlıca aksiyon alabilirsiniz.

Uygulama sunucusu seviyesindeki performansını arttırmak için dikkat edilmesi gereken temel maddeler aşağıda belirtilmiştir. Bu maddeler oluşturulurken yazılım dilinden (Java, .net, php vb.) ve uygulama sunucusundan (Weblogic, IIS, Websphere, Tomcat, vb.) bağımsız bir şekilde genel mimariye yönelik problemler üzerinde durulmuştur.

   2.1 Connection Pool ve Thread Pool Değerleri

Yanlış seçilmiş connection veya thread pool değerleri yüksek yük değerlerini karşılayamayacağından ciddi bloklama durumlarına ve darboğaza sebebiyet verebilmektedir. Pooling doğru değerler seçildiğinde uygulamanıza performans, eş zamanlı işlem ve ölçeklenebilirlik anlamında birçok fayda sağlayacaktır. Ancak birçok uygulamada optimum değerler yerine standart değerler kullanılması değişen yük ve uygulama yapısı nedeni ile ilerleyen dönemlerde performans problemlerine neden olmaktadır.

   2.2 Senkranizasyon Problemleri

Çoklu kullanıcılı ortamlarda paylaşımlı kaynaklara ulaşım için senkronizasyon kullanımı kodun eş zamanda çoklu thread halinde işlem görebilmesi adına büyük önem taşımaktadır. Fakat bu noktada aynı zamanda sadece bir thread işlem görebileceğinden dolayı kuyrukta bekleyen işlemler veya locking durumları nedeni ile performans kaybı yaşanması da olasıdır. Senkronizasyon problemi yaşayıp yaşamadığınızı kabaca belirli bir yük durumunda CPU Time ve Execution Time değerlerini ölçerek inceleyebilirsiniz. Eğer metodun execution time değeri sürekli artıyor ve buna karşın CPU Time değeri sabit kalıyor ise metod I/O, dış sistemler veya senkronizasyonu bekliyor demektir. Eğer uygulamanız I/O yapmıyor veya dış sistemlere bağlantı kurmuyorsa senkronizasyon probleminden bahsedebiliriz.

Bu problemleri tamamen gidermek oldukça zor olsa da senkronize edilecek kodun gerekliliğini belirlemek ve senkronizasyonu belirli limitler dahilinde kullanmak performans problemlerinizi minimum seviyeye çekmeye yardımcı olacaktır.

   2.3 Memory Yönetimi

Java veya .Net tarafında memory yönetimi işlemi otomatik olarak gerçekleştiriliyor gibi gözükse de iki platform da sadece ellerinden gelenin en iyisini yapmaya çalışmaktadır. Bu nedenle çoğu uygulamada memory leak veya yüksek memory kullanımı ile alakalı performans problemleri yaşanmaktadır.

Aşırı obje oluşumu ve silinmesi, garbage collection zamanlarında yükselme, aşırı page swapping gibi bulgular memory tarafında probleminizin olduğunu belirten ibarelerdir.

Bu gibi problemleri uygulama sunucusu üzerine yükleyeceğiniz APM ajanları veya kendi araçları ile yük testi esnasında veya canlı sitemlerde ilgili metrikleri izleyerek saptamanız mümkündür.

   2.4 Parti Servislere ve Diğer Katmanlara Erişim

Dağıtık sistemlerde karşılaşılan bir diğer performans problemi ise 3. Parti servislere erişim ve beklenen cevabın geç gelmesidir. Tasarımı hatalı yapılmış yapılarda dış servislere normalden daha çok bağlantı yapılması, normalden daha uzun süren senkron veya asenkron işlemler ve ağ yükünü arttıran protokol değişimleri gibi nedenlerden ötürü performans problemleri yaşanmaktadır.

Örneğin hatalı iletişim protokolü seçilmesi hem ağ yükünün arttırılması hem de sunucu üzerine daha fazla yük binmesine neden olmaktadır. (SOAP protokolünün getirdiği ek yük REST veya RMI protokolüne göre daha fazladır.)

Yapınıza en uygun protokolü seçip 3. Parti servisleri sürekli izleyerek performans anlamında önemli kazanımlar elde edebilirsiniz.

   2.5 Veritabanı Problemleri

Kullanılan birçok uygulama sunucusu arkasında veritabanları hizmet vermektedir ve doğal olarak işlemlerin çoğu uygulama sunucusu ve veritabanı arasında geçmektedir. Bu nedenle bu iletişimin performanslı olması uçtan uca uygulamanın performansını ciddi bir şekilde etkilemektedir.

Uygulama tarafından veritabanına aşırı sorgu yapılması, ön bellekten sunulabilecek sorguların normal olarak yapılması ve veritabanı connection pool ayarlarının düzgün yapılmaması bu tarz performans problemlerine neden olmaktadır.

3. Mobil Uygulama Problemleri

Yüksek performanslı mobil uygulamalar geleneksel web tabanlı uygulamalardan farklı olarak kendilerine has ek problemleri de beraberinde getirmektedirler. Günümüzde farklı kaynaklara ve özelliklere sahip birçok mobil cihaz kullanılmakta ve uygulamaların tüm bu değişkenler için optimize edilmiş olması gerekmektedir.

Bu noktada performansı ölçmek ve trendini izleyebilmek performansı geliştirmek adına oldukça önemlidir. Piyasada uçtan uca performans yönetimi sunan araçların mAPM (Mobile Application Performance Management) adı altında sundukları yazılımları kullanarak performans değerinizi anlık olarak ölçebilir ve hızlıca aksiyon alabilirsiniz.

Mobil uygulama seviyesindeki performansı arttırmak için dikkat edilmesi gereken temel maddeler aşağıda belirtilmiştir. Bu maddeler oluşturulurken işletim sisteminden, (IOS, Android, Windows Phone vb.) ve yazılımın geliştirildiği dilden bağımsız bir şekilde genel mimariye yönelik problemler ve önemli noktalar üzerinde durulmuştur.

   3.1 Crash ve Hata Raporlarını İnceleyin

Uygulama crash olduğunda cihaz üzerinde problem ile ilgili crash ve hata raporları oluşturulur. Problemin temel nedenini bulabilmek için bu raporları ve ilgili demografik bilgileri kendi sunucunuza alıp incelemeniz gerekmektedir. Aksi takdirde kullanıcı cihazında oluşabilecek problemlerden haberiniz olmayacaktır. Bu raporlar sayesinde problemin cihaz üzerinde nasıl yaşandığını ve hangi demografik bilgi (işletim sistemi, cihaz tipi, bağlantı tipi, servis sağlayıcı, lokasyon vb.) ile alakalı olduğunu belirleyebilirsiniz.

   3.2 Uygulama ve Sunucu Yanıt Sürelerini İnceleyin

Uygulama crash olduğunda veya kötü performans göstermeye başladığında uygulamanın dışarıya veya arka tarafta yer alan ana sunuculara yaptığı isteklerin performansını ölçmek oldukça önemlidir. Çünkü yaşanabilecek performans problemleri uygulamanın bağlı olduğu diğer servislerle de ilgili olabilir. Bu nedenle uygulamanın istek yaptığı dış veya iç servislerin izlenmesi ve performanslarının iyileştirilmesi mobil uygulama performansını da arttıracaktır.

   3.3 Cihaz Performansını İnceleyin

Uygulamanın cihaz kaynaklarını nasıl kullandığını incelemek optimum performans seviyesini bulmak adına oldukça önemlidir. Örnek vermek gerekirse sadece Android işletim sistemine sahip ram, disk, cpu ve ekran çözünürlüğü farklı birçok cihaz bulunmaktadır. Bu noktada uygulamanın ne kadar ram, disk, cpu, ağ trafiği ve güç kullandığını belirlemek performans gelişimi için oldukça önemlidir.

   3.4 Demografik Verileri İnceleyin

Mobil performans problemleri cihaz özellikleri veya uygulama ile de alakalı olmayabilir. Örneğin performans problemini sadece belirli bir lokasyonda bulunan kullanıcılar veya sadece belirli bir operatörü kullanan kullanıcılar yaşayabilir. Bu nedenle hata raporlarını demografik veriler ışığında inceleyip, problem olması durumunda sadece belirli bir özelliği düzelterek performans iyileştirmesi sağlayabilirsiniz.

4. Veri tabanı Problemleri

Veritabanı performansını genel olarak uygulama tarafından çıkan sorguların veritabanı içerisinde geçirdiği süre olarak tanımlayabiliriz. Veriltabanı katmanında uygulama tarafında gerçekleştirilen mantıksal işlemin sonuçları döndürüldüğünden uçtan uca performans içerisinde önemli bir rol oynamaktadır. Bu nedenle veritabanı performansını ölçmek işlem akışını optimize edeceğinden performans anlamında son kullanıcıya direkt olarak etkisini gösterecektir.

Bu noktada performansı ölçmek ve trendini izleyebilmek performansı geliştirmek adına oldukça önemlidir. Piyasada uçtan uca performans yönetimi sunan araçların Veritabanı İzleme (Database Monitoring) adı altında sundukları yazılımları kullanarak performans değerinizi anlık olarak ölçebilir ve hızlıca aksiyon alabilirsiniz.

Veritabanı seviyesindeki performansı arttırmak için dikkat edilmesi gereken temel maddeler aşağıda belirtilmiştir. Bu maddeler oluşturulurken veritabanı sistemlerinden (Oracle, MS SQL Server, DB2 vb.) bağımsız bir şekilde genel mimariye yönelik problemler üzerinde durulmuştur.

   4.1 Uzun Süren SQL Sorgularınızı Belirleyin

İşlemi uzun süren veya en fazla zaman harcayan sorgularınızı belirlemek performans sorunlarını anlamak adına size büyük kolaylık sağlayacaktır. Bu sayede spesifik problemli sorguları belirleyip sağlıklı çalışan sorgulardan ayırıp üzerlerinde çalışmak size problemlerin temel nedenleri odaklanma imkanı sunacaktır. Bu sorguları belirlerken sadece problemin oluştuğu zaman aralığına bakmaktansa sorguların trendine odaklanmak esas problemli sorguları bulmak adına faydalı olacaktır.

   4.2 Bekleme Tiplerini Belirleyin

Problemli sorgularınızı incelerken veritabanı içerisinde hangi bekleme tiplerinde zaman kaybettiklerini inceleyin. Bu sayede sorgularınızın veritabanı içerisinde spesifik olarak neden zaman kaybettiklerini bulabilir ve hızlıca aksiyon alabilirsiniz. Örneğin full table scan yapan bir sorguyu veya CPU – I/O nedeni ile zaman kaybına uğrayan bir sorguyu bu sayede kolayca belirleyebilirsiniz.

   4.3 Optimize Edilmiş İndex’ler Oluşturun

Eğer index oluşturmazsanız SELECT sorgularınızın performansı düşecektir ancak çok fazla index eklenmesi de DML (INSERT, UPDATE ve DELETE) sorgularınızın performansını düşürecektir. Bu nedenle tablolara ekleyeceğiniz index’leri optimize ederek dengeyi sağlamanız performans açısından önemlidir.

   4.4 Execution Plan’larına Odaklanın

Birçok veritabanı en verimli şekilde verilere ulaşmak adına sorgu optimizasyonlarını kullanırlar. Sorgu optimizasyonlarının çıktıları ise veriye ulaşılabilecek optimum yolu belirleyen execution planlarıdır. Veritabanları execution planlarını oluşturmak için metadata (tablo büyüklüğü, satır sayısı, index bilgileri vb.) istatistiklerinden faydalanırlar. Örneğin 100 satırı taramak 1.000.000 satırı taramaktan daha hızlı sürecektir ancak sorgu optimizasyonu tabloda 1.000.000 satır olduğunu bilmiyor ise planı optimum seviyeden oldukça farklı bir seviyede oluşturacaktır. Bu gibi durumlarla genelde test ortamından canlı ortama geçişlerde karşılaşılmaktadır. Problemli sorgularınızı belirledikten sonra planlarını inceleyerek performans problemlerinizi gidermeniz mümkündür. Ek olarak otomatik plan değişimlerini de izleyerek kötü plan seçiminde hızlı aksiyon alıp performans problemi oluşmasının önüne geçebilirsiniz.