API Yük Testi ve Performans Analizi: Grafana k6 vs Apache JMeter
Bu yazı, tecrübe gerektirmeden API'ler üzerinde yük testi yapmanın nasıl mümkün olduğunu hızlı ve açık kaynaklı sistemlerden olan k6 ve JMeter araçlarıyla anlatır.
API nedir ? API (Application Programming Interface), yazılımlar arası iletişimi sağlayan bir arayüzdür.
Yük Testi nedir? Yük Testi, bir uygulamanın belirlibir yük altında performansını değerlendirmek için yapılan testlerdir. Bu testler, uygulamanın dayanıklılığını, hızını ve genel performansını değerlendirmeyi amaçlar.
k6 nedir ? k6, açık kaynaklı bir yük testi aracıdır ve uygulamaların performansını ölçmek için kullanılır. JavaScript tabanlı bir script dilini kullanır ve kullanıcı dostu bir arayüz sunar. k6 ile gerçekçi API trafiği simüle edebilir ve sisteminizin yük altında nasıl tepki verdiğini ölçebilirsiniz. Performans sorunlarını kullanıcılarınızı etkilemeden önce tanımlayıp düzeltebilmek için çok deneyimli olmanızda gerekmiyor.
JMeter nedir ? JMeter, açık kaynaklı bir yük testi aracıdır ve uygulamaların performansını ölçmek için kullanılır. Java tabanlı bir araç olan JMeter, kullanıcı dostu bir arayüz sunar ve performans testlerini oluşturmak ve yönetmek için geniş bir yelpazede kullanılabilir. JMeter, gerçekçi kullanıcı davranışlarını simüle etmek için esnek bir yapı sunar ve sisteminizin yük altında nasıl tepki verdiğini ölçmenizi sağlar. Performans sorunlarını tespit edip çözmek için deneyimli olmanıza gerek yoktur; ancak deneyimli kullanıcılar, JMeter'ı karmaşık senaryoları test etmek için kullanabilirler.
Aynı testleri hem k6 hem de JMeter ile gerçekleştirip, her birinin avantajlarını ve dezavantajlarını karşılaştıracağız.
Aşağıdaki tabloda kurulum, tanımlama, kapsam ve destek gibi metriklerde bu iki aracın genel bir karşılaştırma tablosu bulunmaktadır.
Grafana k6 ve Apache JMeter Karşılaştırması
Özellikler | JMeter | k6 |
---|---|---|
Dil ve Yazım Stili | Java | JavaScript |
Kurulum ve Başlatma | JRE gerektirir, GUI tabanlı | Node.js gerektirir, Konsol tabanlı |
Performans ve Ölçeklenebilirlik | Büyük yük testleri, kaynak tüketimi yüksek | Hafif, ölçeklenebilir, daha iyi ölçeklenebilir |
Senaryo Tanımlama | XML tabanlı, GUI veya manuel XML | JavaScript dilinde kodlama |
Dağıtık Test Desteği | Kapsamlı destek, dağıtık test yönetimi | Dağıtık test desteği k6 Cloud veya özel dağıtık ortamlar |
Raporlama ve Analiz | GUI tabanlı, grafiksel analiz araçları | Konsol tabanlı, k6 Cloud ve entegrasyonlar |
Topluluk ve Destek | Geniş kullanıcı topluluğu, belgelendirme | Hızla büyüyen topluluk |
JMeter arayüzü, kullanıcılar için çeşitli veri görselleştirme imkanları sunar. Backend listener, grafik raporları, JMeter eklentileri, Grafana ve InfluxDB kullanılabilir.
k6, konsol tabanlı bir kullanımın yanında aşağıdaki görseldeki gibi birçok veri görselleştirme sistemi ve yöntemiyle de kullanılabilir.
Bu testleri Windows bir makinede hızlıca gerçekleştirmek mümkündür.
K6 için test.js dosyasını oluşturacak ve k6 test sonuçlarını terminalde standart çıktı olarak alacağız.
JMeter için ise testleri hem arayüz üzerinden hem de terminal üzerinden uygulayacağız.
k6 Temel Test Senaryoları
API endpointleri için bazı K6 yük testi senaryolarına ait basit Javascript kodlarını inceleyeğiz. Bu senaryolar yük testi, dayanıklılık testi, stres testi ve performans optimizasyonudur.
Yük Testi
Yük testi, bir HTTP metodu ile erişilen web sunucusuna aynı anda yüksek sayıda kullanıcı bağlandığı durumu simüle eder.
k6, web uygulamalarının belirli bir yük altında nasıl performans gösterdiğini değerlendirmek için kullanılabilir:
import http from 'k6/http';
import { sleep } from 'k6';
export default function () {
// Simüle edilen kullanıcı sayısını ifade eder
// Anlık kullanıcı sayısını senaryonuza göre düzenleyebilirsiniz
const numberOfUsers = 100;
// Her bir kullanıcı için aynı anda yapılan GET isteği
Array.from({ length: numberOfUsers }, (_, index) => {
http.get(`https://example.com/page${index}`);
sleep(1);
});
}
Dayanıklılık Testi
Dayanıklılık Testi, belirli bir süre boyunca devam eden bir yük testi senaryosu oluşturur ve uygulamanın ne kadar süre boyunca stabil bir şekilde çalışabildiğini simüle eder.
k6, web uygulamalarının belirli bir süre boyunca sabit bir yük altında sistem performansını değerlendirebilir:
import http from 'k6/http';
import { sleep } from 'k6';
export default function () {
// Belirli bir süre boyunca sabit bir yük altında test için “minute” cinsinden süreyi ayarlayabilirsiniz
const testDuration = '1m';
// Her bir kullanıcı için aynı anda yapılan GET isteği
while (1) {
http.get('https://example.com');
sleep(1);
}
}
Stres Testi
Stres Testi, uygulamanın sınırlarını ölçmek için ani trafik artışları veya kullanıcı sayısındaki hızlı değişiklikleri simüle eder.
k6, web uygulamalarının sistem kapasitesini aşan anlık bir yük altında nasıl davrandığını değerlendirebilir:
import http from 'k6/http';
import { sleep } from 'k6';
export default function () {
// Ani trafik artışlarını simüle etmek için anlık kullanıcı yüklenme sayısını artırabilirsiniz
const numberOfUsers = __VU * 10;
// Her bir kullanıcı için aynı anda yapılan GET isteği
Array.from({ length: numberOfUsers }, (_, index) => {
http.get(`https://example.com/page${index}`);
sleep(0.1);
});
}
Performans Optimizasyon Testi
Performans Optimizasyon Testi, uygulamada belirli optimizasyonlar yapıldıktan sonra performans artışını simüle etmek için uygundur.
K6, web uygulamalarının performansını artırmak amacıyla yapılan kod değişiklikleri veya altyapı güncellemelerinin etkilerini değerlendirmek için kullanılabilir:
import http from 'k6/http';
import { sleep } from 'k6';
export default function () {
// Optimizasyon yapılan sayfa
const optimizedPage = 'https://example.com/optimized-page';
// Her bir kullanıcı için aynı anda yapılan GET isteği
Array.from({ length: 100 }, () => {
http.get(optimizedPage);
sleep(0.1);
});
}
Bu senaryoları içeren daha kapsamlı bir test senaryosu için örnek k6 test scriptini uygulamalı olarak görelim.
Javascript ile çalışan k6 için k6_load_test.js dosyasını oluşturalım. Devamında dosyanın içine aşağıdaki test kodunu atalım:
import http from 'k6/http';
import { check, sleep, group } from 'k6';
export let options = {
stages: [
{ duration: '30s', target: 500 }, // 90 saniye boyunca 500 kullanıcı
{ duration: '1m', target: 50 }, // 60 saniye boyunca 50 kullanıcı
{ duration: '30s', target: 0 }, // 30 saniye boyunca 0 kullanıcı (ramp down)
],
};
export default function () {
// Random olarak bir HTTP metodu seç
let methods = ['GET', 'POST', 'PUT', 'DELETE'];
let method = methods[Math.floor(Math.random() * methods.length)];
// Random olarak bir API endpoint'i seç
let endpoints = [
'https://example.com/k6_load_test/get',
'https://example.com/k6_load_test/post',
'https://example.com/k6_load_test/put',
'https://example.com/k6_load_test/delete',
];
let endpoint = endpoints[Math.floor(Math.random() * endpoints.length)];
// Yük testi için HTTP isteği yap
let res = http.request(method, endpoint);
// HTTP cevabını kontrol et
check(res, {
'is status 200': (r) => r.status === 200,
});
// Kısa bir süre bekleme ekleyerek sabit bir yük altında çalışmayı simüle et
// sleep(1);
}
Yukarıdaki k6 test kodu, belirli bir API üzerinde gerçekleştirilen yük testini simüle eder.
Test, belirli bir süre boyunca (toplamda 3 dakika) aşamalı olarak artan sanal kullanıcı sayısında HTTP isteklerini gerçekleştirir.
İlk aşamada 30 saniye boyunca 500 sanal kullanıcı, ardından bir dakika boyunca 50 sanal kullanıcı ve son olarak 30 saniye boyunca hiçbir sanal kullanıcı olmayacak şekilde azalır.
Her bir sanal kullanıcı, rastgele seçilen HTTP metodu (GET, POST, PUT, DELETE) ve API endpoint kombinasyonları üzerinden HTTP isteği yapar. Yapılan her isteğin HTTP cevabı kontrol edilir, ve eğer cevap kodu 200 ise başarılı kabul edilir.
Her bir isteğin ardından kısa bir bekleme süresi (1 saniye) eklenerek sabit bir yük altında çalışma simüle edilir.
Kodu çalıştıralım:
k6 run k6_load_test.js
k6 komut dosyası çalıştırıldıktan sonra aşağıdaki gibi bir çıktı alınır. Terminal çıktısında aldığınız ölçümler, API'nizin yük altında nasıl performans gösterdiğine ilişkin bilgiler sağlar ve herhangi bir darboğaz veya sorunu belirlemenize yardımcı olabilir.
k6 Sonuç Çıktısı
k6 test sonucu metrik değerleri ne anlama gelir ?
Grafana k6 Sonuç Metrikleri
Metrik | Açıklama | Değer |
---|---|---|
checks | Belirli bir HTTP durumu veya başka bir kontrolü içerir | 46 MB |
data_received | Senaryo boyunca alınan toplam veri miktarını gösterir | 23 MB |
data_sent | Senaryo boyunca gönderilen toplam veri miktarını gösterir | 180.077 |
http_req_blocked | HTTP isteği bloke edilirken geçen süreyi gösterir | Ortalama 9.42ms |
http_req_connecting | HTTP isteğinin sunucu ile bağlantı kurma süresini gösterir | Ortalama 5.04 ms |
http_req_duration | HTTP isteğinin tamamlanma süresini gösterir | Ortalama 242.36 ms |
http_req_failed | Başarısız HTTP isteklerinin sayısını gösterir | 0 |
http_req_receiving | HTTP isteğinin sunucudan gelen veriyi alma süresini gösterir | 216.14 µs |
http_req_sending | HTTP isteğinin veriyi sunucuya gönderme süresini gösterir | 52.92 µs |
http_req_tls_handshaking | HTTP isteğinin TLS el sıkışma süresini gösterir | Ortalama 4.37 ms |
http_req_waiting | HTTP isteğinin sunucudan bir yanıt beklerken geçirdiği süreyi gösterir | Ortalama 242.09 ms |
http_reqs | Senaryo boyunca yapılan toplam HTTP isteği sayısını gösterir | 180.077 |
iteration_duration | Senaryo içinde bir iterasyonun tamamlanma süresini gösterir | 252.11 ms |
iterations | Senaryo içinde tamamlanan toplam iterasyon sayısını gösterir | 180.077 |
vus | Şu an çalışan sanal kullanıcı (VU) sayısını gösterir | Min: 1, Maks: 499 |
vus_max | Senaryo boyunca maksimum sanal kullanıcı sayısını gösterir | 500 |
p(90) | Veri setinin en düşük %90'ını temsil eden değeri ifade eder | |
p(95) | Veri setinin en düşük %95'ini temsil eden değeri ifade eder |
Bu çıktılar ışığında API veya API sağlayıcı servisiniz için yapılması gereken geliştirmeleri planlayabilirsiniz.
k6 esnek test senaryoları oluşturmak için en önemli araçlardan biridir. Script kodlama ile oluşturulan bu senaryolar yazılım sınırları kadar geniş ve uçsuzdur.
k6 testi sırasında veri görselleştirme, Kubernetes üzerinde çalışan sistemler de Prometheus ile alınan sistem çalışma metrikleri Grafana ile aşağıdaki gibi görselleştirilebilmektedir.
Grafana Sistem Metrikleri
Windows, Mac ve Linux da k6 kullanmak için https://k6.io/docs/get-started/installation/ adresini ziyaret ediniz.
JMeter Temel Test Senaryoları
JMeter genel test senaryoları için arayüz üzerinde Threads (Thread Grubu Sayısı), Loop (Döngü Sayısı) ve Ramp-up Period (Yükleme Süresi) değerleri girilmelidir.
JMeter Threads Özellikleri
API Performans Testi:
Threads: API'ye gönderilen isteklerin sayısıdır. Örneğin, 500 veya daha fazla istemci iş parçacığı olabilir.
Loop: Her istemcinin belirli bir işlemi kaç kez tekrarlayacağını belirler. Genellikle 1 olarak ayarlanır, çünkü her istek farklı olabilir.
Ramp-up Period: Tüm istemcilerin ne kadar sürede başlatılacağını belirler. Örneğin, 500 istemciyi 6 saniyede başlatmak için 360 olarak ayarlanabilir.
Ek olarak API Performans testi senaryoları:
1.İstek Sayısı Artırma:
Belirli bir süre içinde API'ye gönderilen istek sayısını artırarak, her saniye artan bir istek yükü simüle edilebilir.
2.Maksimum Yük Testi:
API'ye maksimum erişim yükünü simüle ederken, API'ye aynı anda en fazla erişen istemci sayısını belirleyerek API'nin bu yük altında nasıl davrandığını gözlemlenebilir.
3.Uzun Süreli Yük Testi:
API'ye belirli bir süre boyunca sürekli olarak istek göndermek, API'nin uzun süreli yük altında nasıl performans gösterdiğini belirlemek için kullanılabilir.
4.Farklı İstek Türleri Testi:
API'ye farklı türde isteklerle test gerçekleştirilebilir. Örneğin GET, POST, PUT, DELETE gibi farklı HTTP metodlarını ve farklı istek gövdelerini içeren senaryolar oluşturulabilir.
5.Ortalama Yanıt Süresi Testi:
Belirli bir yük altında API'nin ortalama yanıt süresini test ederek, API'nin genel performansını değerlendirilebilir.
6.Hata Yönetimi Testi:
API'nin belirli bir yük altında hata durumlarını nasıl işlediğini test etmek, yanlış biçimlendirilmiş istekler veya yetkilendirme hataları gibi senaryoları simüle edebilir.
7.Zamanlayıcı Testler:
Belirli bir zaman aralığında API'ye istek göndererek, bir gün boyunca API'nin nasıl performans gösterdiğini izlemek için bir zamanlayıcı kullanılabilir.
JMeter arayüzünde RUN komutu ile bu testler başlatılabildiği gibi terminal üzerinden de bu testler çalıştırılabilir. Ayrıca test içerikleri csv formatında kaydedilebilir. Aşağıdaki komut ile bu işlem gerçekleştirilir.
jmeter -n -t \Users\YOUR_USER\path\apache-jmeter-5.6.3\apache-jmeter-5.6.3\backups\TEST_NAME.jmx -l \Users\YOUR_USER\path\apache-jmeter-5.6.3\apache-jmeter-5.6.3\backups\RECORD_NAME.csv
Komut çalıştırıldıktan sonra aşağıda bulanan görseldeki gibi bir çıktı elde edilir.
JMeter Sonuç Çıktısı
JMeter test sonucu metrik değerleri ne anlama gelir ?
Apache JMeter Sonuç Metrikleri
Metrik | Açıklama | Değer |
---|---|---|
summary | Toplam İstek | 6247 |
total time | Toplam Süre (167 sn) | 167 sn |
Ortalama İstek/Saniye | Ortalama İstek/Saniye (381.3 istek) | 381.3 istek/dk |
Ortalama | Ortalama Yanıt Süresi (749 ms) | 749 ms |
Min | En Düşük Yanıt Süresi (101 ms) | 101 ms |
Max | En Yüksek Yanıt Süresi (4281 ms) | 4281 ms |
Err | Hata Sayısı (0) | 0 |
Hata Yüzdesi | Hata Yüzdesi (%0.00) | %0.00 |
Aktif | Aktif İstek Sayısı (172) | 172 |
Başlatılan | Başlatılan İstek Sayısı (1365) | 1365 |
Tamamlanan | Tamamlanan İstek Sayısı (1193) | 1193 |
Bu çıktılar ışığında API veya API sağlayıcı servisiniz için yapılması gereken geliştirmeleri planlayabilirsiniz.
Ayrıca JMeter arayüzünde aşağıdaki görselde bulunan sonuç tablosu gibi detaylı çıktılar elde edebilirsiniz.
JMeter Sonuç Tablosu
Windows, Mac ve Linux da JMeter'i kullanmak için https://www.simplilearn.com/tutorials/jmeter-tutorial/jmeter-installation adresini ziyaret ediniz.
JMeter ve K6 Performans Testi Sonuçlarının Karşılaştırılması
Performans testi, bir sistem veya uygulamanın belirli koşullar altında nasıl performans gösterdiğini değerlendirmek için kullanılan önemli bir süreçtir. Bu testler, farklı araçlar kullanılarak gerçekleştirilebilir. Bu yazıda, JMeter ve K6 olmak üzere iki farklı performans test aracının sonuçlarını karşılaştıracağız. Karşılaştırma ölçütleri test ortamı, test süresi, hedef kullanıcılar, istatistikler, ortalama yanıt süresi, en yüksek yanıt süresi ve hız şeklindedir.
Grafana k6 ve Apache JMeter Test Sonuçları Karşılaştırması
Özellikler | JMeter | k6 |
---|---|---|
Test Ortamı | Bağımsız test olarak çalıştırıldı. | Yerel ortamda çalıştırıldı. |
Test Süresi | Toplam 2 dakika 41 saniye çalıştı. | Toplam 3 dakika çalıştı. |
Hedef Kullanıcılar | Maksimum 500 eşzamanlı kullanıcı. | 500 eşzamanlı kullanıcıya kadar yükselme yapıldı. |
Toplam İstek Sayısı | 25.000 istek gerçekleştirildi. | 180.077 istek gerçekleştirildi. |
Ortalama Yanıt Süresi | 11.441 milisaniye. | 242.36 milisaniye. |
En Yüksek Yanıt Süresi | 21.153 milisaniye. | 33.68 saniye. |
Hız | 169.6 istek/saniye. | 857.45 istek/saniye. |
Sonuçlar
JMeter ve k6 performans test sonuçlarını incelediğimizde, her iki aracın da farklı güçlü yönleri olduğunu görebiliriz.
JMeter, daha düşük bir istek hızına sahip olmasına rağmen, yüksek eşzamanlı kullanıcı sayılarını destekleyebilir. Bu özelliği, büyük ölçekli uygulamaların test edilmesi için idealdir. Öte yandan, k6 daha yüksek bir istek hızına sahiptir ve başarısız istek oranını minimize etmiştir. Bu da özellikle hızlı yanıt gerektiren uygulamalar için tercih edilebilir.
Hangi aracın kullanılacağı, test gereksinimlerine, hedeflenen metriklere ve uygulamanın yapısına bağlı olacaktır. Örneğin, eğer yüksek eşzamanlı kullanıcı sayılarıyla test yapılacaksa JMeter tercih edilebilir; ancak hız ve başarısız istek oranı kritikse, k6 daha uygun olabilir. Her iki araç da farklı senaryolara uygun olarak kullanılabilir ve performans testlerinde değerli bilgiler sağlayabilir.
Bu yazıda k6 ile JMeter'in performans test araçları olarak nasıl kullanılabileceğinden bahsettik. Ayrıca, her iki araçla örnek bir yük testi senaryosu gerçekleştirip sonuçlarını karşılaştırdık.
Siz de bu araçlarla yük testleri gerçekleştirebilir ve uygulamalarınızın performansını değerlendirebilirsiniz.