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.
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.
Sıra | Kullanıcı Sayısı | Talepler Arası Bekleme Süresi (s) | Ortalama Cevap Süresi (ms) | Karşılanamayan Talep Sayısı |
1 | 100 | 0.1 | 45 | 0 |
2 | 100 | 0.5 | 63 | 0 |
3 | 1.000 | 0.01 | 19.209 | 0 |
4 | 1.000 | 0.1 | 46 | 0 |
5 | 1.000 | 0.5 | 65 | 0 |
6 | 10.000 | 0.01 | 43.851 | 4736 |
7 | 10.000 | 0.1 | 47 | 0 |
8 | 10.000 | 0.5 | 52 | 0 |
6. sıradaki testte, test öncesinde ve test sırasında kaynak kullanımları aşağıdaki gibidir.
Test Öncesinde;
Test Sırasında;
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.
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.
Sıra | Kullanıcı Sayısı | Talepler Arası Bekleme Süresi (s) | Ortalama Cevap Süresi (ms) | Hata Oranı (%) |
1 | 100 | 0.01 | 25 | 0 |
2 | 100 | 0.1 | 5 | 0 |
3 | 100 | 0.5 | 4 | 0 |
4 | 1.000 | 0.01 | 45 | 48.2 |
5 | 1.000 | 0.1 | 6 | 0 |
6 | 1.000 | 0.5 | 5 | 0 |
7 | 10.000 | 0.01 | 0 | |
8 | 10.000 | 0.1 | 0 | |
9 | 10.000 | 0.5 | 0 |
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.
Sıra | Kullanı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ı |
1 | 100 | 0.01 | 7 | 0 | 10.767 | 10.867 |
2 | 100 | 0.1 | 4 | 0 | 10.867 | 10.967 |
3 | 100 | 0.5 | 5 | 0 | 10.967 | 11.067 |
4 | 1.000 | 0.01 | 6 | 0 | 11.067 | 12.067 |
5 | 1.000 | 0.1 | 4 | 0 | 12.067 | 13.067 |
6 | 1.000 | 0.5 | 5 | 0 | 13.067 | 14.067 |
7 | 10.000 | 0.01 | 10 | 0 | 14.067 | 24.067 |
8 | 10.000 | 0.1 | 3 | 0 | 24.067 | 34.067 |
9 | 10.000 | 0.5 | 5 | 0 | 34.067 | 44.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