"Aplikasinya lambat" adalah keluhan paling umum dan paling susah dibuktikan tanpa data. Kalian mempelajari performance & load testing di cloud — mendesain skenario beban, membaca bottleneck, tuning performa, dan observability lanjutan — lalu melakukan benchmark workload untuk membuktikan kapasitas infrastruktur dengan angka.

Sejak episode 3 kalian membangun infrastruktur, dan di episode 21 membuatnya bisa auto-scaling. Tapi ada satu hal yang belum pernah kita buktikan: berapa besar beban yang bisa ditahan infrastruktur kalian, dan di titik mana ia mulai melambat? Tanpa angka ini, setiap keputusan scaling hanyalah tebakan — dan "aplikasi lambat" di produksi selalu mahal untuk diperbaiki.
Episode 25 membahas performance & load testing di cloud: mendesain skenario beban yang realistis, membaca bottleneck dari hasil test, performance tuning, dan observability lanjutan untuk melacak latency end-to-end. Kalian akan melakukan benchmark workload — dari k6, JMeter, hingga beban nyata — dan menafsirkan hasilnya seperti engineer produksi.
Load testing menjawab tiga pertanyaan yang tidak bisa ditebak:
Tanpa jawaban ini, "kita perkirakan cukup kuat" adalah pernyataan tanpa bukti. Dengan jawabannya, kalian bisa menyetel ASG, memilih ukuran instance (episode 16), dan memutuskan strategi caching dengan percaya diri.
Tiga metrik inti yang wajib kalian fasih:
P99 adalah metrik yang paling jujur: p99 2 detik berarti 1 dari 100 request terasa sangat lambat — dan itu user nyata yang mengeluh. Rata-rata (average) menyesatkan: 99 request 100 ms + 1 request 10 detik = rata-rata 200 ms yang tampak sehat padahal 1% user mengalaminya sebagai bencana.
k6 adalah tool open-source modern untuk load testing, dengan skenario yang ditulis dalam JavaScript. Instal dan tulis test:
curl -s https://deb.k6.io/key.gpg | sudo gpg --dearmor -o /usr/share/keyrings/k6-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/k6-archive-keyring.gpg] https://deb.k6.io/ stable main" | sudo tee /etc/apt/sources.list.d/k6.list
sudo apt-get update && sudo apt-get install k6import http from "k6/http";
import { check, sleep } from "k6";
export const options = {
stages: [
{ duration: "2m", target: 50 }, // ramping naik ke 50 VU
{ duration: "5m", target: 100 }, // beban normal 100 VU
{ duration: "3m", target: 300 }, // uji lonjakan
{ duration: "2m", target: 0 }, // turunkan beban
],
};
export default function () {
const res = http.get("https://lab.example.com/api/products");
check(res, {
"status 200": (r) => r.status === 200,
"p95 latency ok": (r) => r.timings.duration < 500,
});
sleep(1);
}k6 run loadtest.jsOutputnya memberi ringkasan lengkap: RPS yang tercapai, distribusi latency, dan berapa banyak check yang lolos. Ini data pertama kalian.
Tip
Aturan aman load testing di cloud: uji di environment staging atau region yang tidak melayani produksi, dan mulailah dari beban kecil. Menguji 1000 user di aplikasi produksi yang dipakai pelanggan nyata adalah cara tercepat untuk mematikan aplikasi sendiri — dan mempelajari cara mematikan aplikasi bukanlah tujuan test.
Test selesai, RPS tercatat — sekarang bagian paling penting: di mana bottleneck-nya? Proses debug yang sistematis:
ss, koneksi tak terpakai, atau bandwidth jenuh.Bottleneck umum di cloud dan arah perbaikannya:
| Gejala | Kemungkinan bottleneck | Langkah |
|---|---|---|
| CPU instance jenuh | Komputasi kurang | Scale-up instance / tambah instance (episode 21) |
| CPU DB tinggi | Query lambat | Index, query optimization, read replica |
| Latency naik tiba-tiba | Cold start | Provisioned concurrency (episode 11) |
| Queue menumpuk | Konsumen lambat | Perbaiki worker / tambah worker |
| Network wait tinggi | Latensi antar-service | Edge (episode 24), PrivateLink (episode 18) |
Kunci membaca hasil: selalu gabungkan metrik. Satu metrik saja tidak pernah cukup — CPU 100% di instance bisa berarti aplikasi lambat atau auto-scaling terlambat menambah instance. Cerita lengkap hanya muncul dari gabungan metrik aplikasi, instance, dan database.
Setelah bottleneck ditemukan, tuning yang umum (dari yang termurah):
SELECT *, baca dari read replica.Aturannya: tuning tanpa pengukuran ulang adalah tebakan — setiap perubahan diuji load-test-nya lagi dan dibandingkan.
Untuk sistem yang terdiri dari banyak service (episode 12, 13), kita butuh distributed tracing — melacak satu request melewati banyak service. Di episode 9 kita menyebut trace sebagai pilar observability; sekarang saatnya memakai.
GET /checkout total: 1200ms
└── gateway : 30ms
└── cart-svc : 80ms
└── inventory-svc : 900ms ← bottleneck!
└── payment-svc : 190msDengan trace, kalian tidak lagi menebak — kalian tahu service mana yang menjadi biang keladi. Ini membedakan junior (melihat rata-rata) dari senior (melacak p99 end-to-end).
Mari benchmark aplikasi lab-ecommerce secara menyeluruh:
# Contoh catatan hasil benchmark
# 100 VU : 420 RPS, p95 240ms, error 0.0%
# 300 VU : 760 RPS, p95 980ms, error 0.4% ← knee mulai di sini
# 500 VU : 810 RPS, p95 3400ms, error 8.1% ← titik patahLaporan benchmark yang baik berisi angka, bukan cerita: kapasitas aman, titik knee, titik patah, dan rekomendasi. Ini dokumen yang sama yang akan kalian tunjukkan saat diskusi kapasitas dengan tim — dan saat rapat auto-scaling berikutnya (episode 21).
Inti yang harus dibawa pulang:
Di episode 26 selanjutnya kita akan berhenti sejenak dan melihat peta besar: ekosistem & tren modern 2026 — bagaimana cloud-native, IaC, FinOps, dan AI workloads membentuk lanskap industri, serta apa yang berubah bagi posisi cloud engineer. Sampai jumpa di episode 26!