Güneş Paneli Projesinin Testi

JMeter

Projenin testi, ücretsiz olan JMeter uygulamasıyla gerçekleştirilmiştir. JMeter; java ile geliştirilmiş, mülakatlarda sorulacak [1] kadar piyasada yer edinmiş, kapsamlı ve eklentilerle genişletilebilen bir performans testi uygulamasıdır. Yapılacak teste göre uygulama şekli değişecektir fakat genel olarak yükleme testlerinde; belirli sayıda kullanıcının sisteme erişmesi sağlanarak, sistemin talebi kaldırıp kaldırmadığı, sistemin cevap verme süresi, taleplerin işlenmesi sırasında sistem kaynaklarının tüketimi gibi konular [2] kontrol edilmektedir. JMeter da kullanıcıların simüle edilebilmesi için threadler oluşturulmaktadır. Threadler arka arkaya çalıştırılır ve oluşturulan her threadde kullanıcı davranışı taklit ettirilir. Bu şekilde birden fazla thread çalıştırılarak birden fazla kullanıcının sisteme talep göndermesi gerçekleştirilmiş olur. Testte kaç kullanıcnın talep göndereceği, aşağıdaki ekrandan görülebileceği gibi thread grubu ekranından iş parçacığı sayısı bölümünden girilmektedir.

Apache JMeter (2.13 r1665067)_003

JMeter ile test oluştururken kodlamaya gerek olmasa da thread lerin ne olduğu, çalışma manıtğı ve nasıl kodlandığı ile ilgili detaylı bilgilere aşağıdaki bağlantıdan ulaşılabilir.

https://docs.oracle.com/javase/tutorial/essential/concurrency/procthread.html

Projenin Testi

Projenin testi 3 ana başlık (Cevap performansı, WebSocket performansı, Veri tabanı performansı) altında gerçekleştirilmiştir. Bu yazıda testlerin nasıl yapıldığı ve sonuçları paylaşılacaktır. Test edilen konular ile ilgili detaylı bilgiler ve yorumlar sonraki yazı da paylaşılacaktır.

İstemci ve sunucu aynı bilgisayar üzerinde çalışmaktadır. Bu durum ve diğer çevresel koşullar test sonuçlarını etkileyebilir. Özellikle istemci ve sunucu aynı bilgisayarda olduğu için testlerde ağın etkisi gözlenememektedir, ancak bu durum konu dışı olduğu için gözardı edilmiştir. Paylaşılan sonuç tablolarında bazı satırlar boş bırakılmıştır, boş satırlarda belirtilen testler -bilgisayarın cevap vermemesi sebebiyle- yapılamamıştır.

Cevap Performansı

Projenin ana sayfasına 10, 100, 1.000 ve 10.000 kullanıcının arka arkaya talep (HTTP request) göndermesi sağlanmıştır. Talepler 0.01 sn, 0.1 sn ve 0.5 sn aralıklarla gönderilmiştir.

10 kullanıcı;

0.1 sn için: En geç cevap süresi 111 ms, en hızlı cevap süresi 38 ms, ortalama cevap süresi 56 ms’dir.

0.5 sn için: En geç cevap süresi 119 ms, en hızlı cevap süresi 48 ms, ortalama cevap süresi 80 ms’dir.

Apache JMeter (2.13 r1665067)_004 Apache JMeter (2.13 r1665067)_006

Apache JMeter (2.13 r1665067)_005

SıraKullanıcı SayısıTalepler Arası Bekleme Süresi (s)Ortalama Cevap Süresi (ms)Karşılanamayan Talep Sayısı
11000.1450
21000.5630
31.0000.0119.2090
41.0000.1460
51.0000.5650
610.0000.0143.8514736
710.0000.1470
810.0000.5520

6. sıradaki testte, test öncesinde ve test sırasında kaynak kullanımları aşağıdaki gibidir.

Test Öncesinde;

Sistem Gözlemcisi_008

Test Sırasında;

Sistem Gözlemcisi_009

6. sıradaki testte dönüş zaman grafiği aşağıdaki gibidir. Sunucu yaklaşık 5000. talepten sonra hizmet veremez hale gelmiştir. Diğer testlerde bu durum gerçekleşmemiştir.

CevapPerformansi.jmx (-home-cebbus-Belgeler-CevapPerformansi.jmx) - Apache JMeter (2.13 r1665067)_010

WebSocket (Socket.io) Performansı

JMeter’ın varsayılan kurulumuyla web socket performans testi yapılamamaktadır. Bu testin yapılabilmesi için WebSocketSampler eklentisi kurulmuştur. Socket.io WebsScket’i sarmalayan bir API [3] olduğu için socket.io testi bu eklentiyle yapılabilmiştir. Socket.io engine.io protokolünün uygulaması [4] olduğu için engine.io protokolünün bağlantı kurma basamakları [5] JMeter’a taklit ettirilmiştir. Bu bağlantı basamakları aşağıdaki gibidir;

  • Socket.io URL’ine HTTP talebi gönderilir.
  • Sunucu el sıkışma (handshake) için JSON tipinde veri döner. Veri içerisinde “sid” anahtarıyla -sunucu tarafından oluşturulmuş- oturuma özel kod (session id) bulunmaktadır.
  • İstemci gelen veriyi parçalar ve “sid” bilgisini parametrelerine ekleyerek tekrar HTTP talebinde bulunur.
  • Sunucu “sid” değerini doğruladığında bağlantıyı başlatarak “OK” mesajı gönderir.
  • İstemci ok mesajını aldıktan sonra ws protokolü üzerinden iletişime geçebilir.
  • İstemci belirli peryotlarda sunucudan gelen pong (3probe) mesajını ping mesajıyla (2probe) cevaplamak zorundadır.

Test sırasında yukarıdaki basamaklar oluşturulmuş ve sunucuya ping mesajı gönderilerek pong mesajının gelmesi beklenmiştir. Talepler 0.01 sn, 0.1 sn ve 0.5 sn aralıklarla gönderilmiştir. Her bir talebin gönderilmesi için önceki bağlantının sonlanması beklenmemiştir. Bu sayede sunucuda aynı anda 10, 100, 1.000, 10.000 bağlantının açılması sağlanmıştır. Testin oluşturulması için aşağıdaki ekran görüntüleri incelenebilir.

GunesPaneli.jmx (-home-cebbus-Belgeler-GunesPaneli.jmx) - Apache JMeter (2.13 r1665067)_003GunesPaneli.jmx (-home-cebbus-Belgeler-GunesPaneli.jmx) - Apache JMeter (2.13 r1665067)_004
GunesPaneli.jmx (-home-cebbus-Belgeler-GunesPaneli.jmx) - Apache JMeter (2.13 r1665067)_005GunesPaneli.jmx (-home-cebbus-Belgeler-GunesPaneli.jmx) - Apache JMeter (2.13 r1665067)_006

 

SıraKullanıcı SayısıTalepler Arası Bekleme Süresi (s)Ortalama Cevap Süresi (ms)Hata Oranı (%)
11000.01250
21000.150
31000.540
41.0000.014548.2
51.0000.160
61.0000.550
710.0000.010
810.0000.10
910.0000.50

 

Veri Tabanı Performansı

JMeter’ın varsayılan kurulumuyla MongoDB testi yapılabilmektedir. Yine sırasıyla 10, 100, 1.000 ve 10.000 kullanıcının arka arkaya veri girişi yapması sağlanmıştır. Veri giriş için sorgular 0.01 sn, 0.1 sn ve 0.5 sn aralıklarla gönderilmiştir. JMeter ile MongoDB testi için yapılması gerekenler [6] aşağıdaki ekran görüntülerinde bulunmaktadır.

dbtest.jmx (-home-cebbus-Belgeler-dbtest.jmx) - Apache JMeter (2.13 r1665067)_009 dbtest.jmx (-home-cebbus-Belgeler-dbtest.jmx) - Apache JMeter (2.13 r1665067)_010 dbtest.jmx (-home-cebbus-Belgeler-dbtest.jmx) - Apache JMeter (2.13 r1665067)_011

SıraKullanıcı SayısıTalepler Arası Bekleme Süresi (s)Ortalama Cevap Süresi (ms)Hata Oranı (%)Test Öncesi Kayıt SayısıTest Sonrası Kayıt Sayısı
11000.017010.76710.867
21000.14010.86710.967
31000.55010.96711.067
41.0000.016011.06712.067
51.0000.14012.06713.067
61.0000.55013.06714.067
710.0000.0110014.06724.067
810.0000.13024.06734.067
910.0000.55034.06744.067

Fiziksel Özellikler

Testlerin gerçekleştirildiği bilgisayarın özellikleri;

CPU
Ürün: Intel(R) Core(TM) i5-4200H CPU @ 2.80GHz
Sürüm: Intel(R) Core(TM) i5-4200H CPU @ 2.80GHz
Kapasite: 3800MHz
Genişlik: 64 bits
Saat: 100MHz

Cache:0
Açıklama: L2 önbellek
Slot: CPU Internal L2
Boyut: 512KiB
Kapasite: 512KiB
Cache:1
Açıklama: L1 önbellek
Slot: CPU Internal L1
Boyut: 128KiB
Kapasite: 128KiB
Cache:2
Açıklama: L3 önbellek
Slot: CPU Internal L3
Boyut: 3MiB
Kapasite: 3MiB

Bellek
Açıklama: SODIMM DDR3 Eşzamanlı 1600 MHz (0,6 ns)
Slot: System board or motherboard
Boyut: 8GiB

Disk
Açıklama: ATA Disk
Ürün: SanDisk SDSSDA24
Boyut: 223GiB (240GB)

Kaynaklar

[1] Top 23 JMeter Interview questions, http://career.guru99.com/top-23-jmeter-interview-questions/, Erişim Tarihi : 07.04.2016

[2] Activity 2.  Identify Performance Acceptance Criteria, https://msdn.microsoft.com/en-us/library/bb924359.aspx, Erişim Tarihi : 07.04.2016

[3] WebSocket with Socket.IO, https://davidwalsh.name/websocket, Erişim Tarihi : 09.04.2016

[4] socket.io-protocol, https://github.com/socketio/socket.io-protocol, Erişim Tarihi : 09.04.2016

[5] Anatomy of an Engine.IO session, https://github.com/socketio/engine.io-protocol/blob/master/README.md, Erişim Tarihi : 09.04.2016

[6] How to Load Test MongoDB with JMeter https://blazemeter.com/blog/how-load-test-mongodb-jmeter Erişim Tarihi : 17.04.2016