Lewati ke isi

Server & Infrastruktur

Cara Load Test Website dengan k6 Sebelum Kampanye

Sebelum promo besar, uji dulu seberapa kuat websitemu. Panduan memasang k6, menulis skrip uji beban, membaca hasilnya, dan batas aman saat menguji.

Terbit 6 menit baca

Jawaban singkat

k6 adalah alat uji beban sumber terbuka dari Grafana yang skripnya ditulis dalam JavaScript. Pasang di komputer terpisah, tulis skenario kenaikan pengguna, pasang ambang lulus seperti p(95) waktu respons dan tingkat error, lalu jalankan ke lingkungan staging beberapa hari sebelum kampanye.

Daftar isi
  1. Apa yang perlu disiapkan sebelum menguji?
  2. Langkah melakukan load test dengan k6
  3. 1. Pasang k6
  4. 2. Tentukan angka target
  5. 3. Tulis skrip
  6. 4. Mulai dengan uji asap
  7. 5. Jalankan uji utama sambil memantau server
  8. 6. Baca hasilnya
  9. 7. Perbaiki lalu ulangi
  10. Jenis uji apa lagi yang perlu kamu tahu?
  11. Pertanyaan yang sering diajukan

Kamu sudah menyiapkan promo besar, iklan sudah dijadwalkan, dan influencer siap mengunggah. Tapi apakah websitemu kuat menampung lonjakan pengunjung di jam pertama? Jawaban paling jujur hanya datang dari satu cara: mencobanya sebelum hari H dengan uji beban.

k6 adalah alat uji beban sumber terbuka yang dikembangkan Grafana Labs. Skripnya ditulis dalam JavaScript, dijalankan dari terminal, dan hasilnya langsung berupa angka yang bisa dibaca: berapa cepat halaman merespons, berapa banyak permintaan yang gagal, dan di titik mana server mulai kewalahan.

Apa yang perlu disiapkan sebelum menguji?

Ada tiga hal yang perlu diputuskan sebelum menulis skrip.

Target yang diuji. Sebaiknya lingkungan staging yang spesifikasinya sama dengan produksi. Kalau terpaksa menguji produksi, lakukan di jam paling sepi dan beri tahu tim. Jangan pernah menguji website yang bukan milikmu, karena bagi pemiliknya itu tidak berbeda dengan serangan.

Dari mana uji dijalankan. Jalankan k6 dari komputer atau VPS lain, bukan dari server yang diuji. Kalau k6 berjalan di server yang sama, ia ikut memakan CPU dan hasilnya tidak mencerminkan kondisi nyata.

Perlindungan di depan website. CDN, firewall aplikasi web, atau rate limiting bisa memblokir lalu lintas uji karena terlihat seperti banjir permintaan. Masukkan IP mesin penguji ke daftar pengecualian selama uji, atau sengaja biarkan aktif bila yang ingin kamu ukur justru ketahanan lapisan pelindung itu.

Langkah melakukan load test dengan k6

1. Pasang k6

Di Ubuntu atau Debian, dokumentasi resmi memakai repositori k6:

curl -fsSL https://dl.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://dl.k6.io/deb stable main" | sudo tee /etc/apt/sources.list.d/k6.list
sudo apt-get update
sudo apt-get install k6

Di Fedora atau keluarga RHEL: sudo dnf install https://dl.k6.io/rpm/repo.rpm lalu sudo dnf install k6. Kalau lebih suka Docker, tersedia image grafana/k6.

2. Tentukan angka target

Lihat data analitik kampanye sebelumnya, atau perkirakan dari jumlah orang yang akan menerima pesan promo. Yang penting bukan total pengunjung per hari, tapi berapa yang datang bersamaan di menit tersibuk. Dari situ tentukan jumlah pengguna virtual (VU), yaitu simulasi pengunjung yang terus mengulang skenario.

3. Tulis skrip

Simpan sebagai uji-kampanye.js:

import http from 'k6/http';
import { check, sleep } from 'k6';

export const options = {
  stages: [
    { duration: '2m', target: 50 },
    { duration: '5m', target: 50 },
    { duration: '1m', target: 0 },
  ],
  thresholds: {
    http_req_failed: ['rate<0.01'],
    http_req_duration: ['p(95)<800'],
  },
};

export default function () {
  const res = http.get('https://staging.domainmu.com/promo');
  check(res, { 'status 200': (r) => r.status === 200 });
  sleep(1);
}

Bagian stages menaikkan jumlah VU ke 50 dalam 2 menit, menahannya 5 menit, lalu menurunkannya. Bagian thresholds adalah syarat lulus: permintaan gagal di bawah 1 persen dan 95 persen permintaan selesai di bawah 800 milidetik. Angka-angka ini contoh, sesuaikan dengan target bisnismu. sleep(1) meniru jeda pengunjung asli antara satu klik dan berikutnya.

4. Mulai dengan uji asap

Sebelum beban penuh, ubah target sementara menjadi 1 sampai 2 VU dan durasi pendek. Dokumentasi k6 menyebut ini smoke test: memastikan skrip berjalan dan sistem sehat di beban ringan. Kalau di beban kecil saja sudah ada error, perbaiki dulu.

5. Jalankan uji utama sambil memantau server

k6 run uji-kampanye.js

Selama uji berjalan, buka htop di server, pantau log web server, dan perhatikan grafik di panel atau sistem pemantauan. Kalau belum punya, Node Exporter dan Prometheus membantu melihat CPU, RAM, dan disk dari waktu ke waktu.

6. Baca hasilnya

Di akhir uji, k6 menampilkan ringkasan metrik. Ini yang paling penting:

MetrikArtinyaYang perlu diperhatikan
http_req_durationWaktu total satu permintaanLihat p(95), bukan rata-rata
http_req_failedPersentase permintaan gagalIdealnya mendekati nol
http_reqsJumlah permintaan dan laju per detikKapasitas yang tercapai
checksPersentase pemeriksaan yang lolosStatus bukan 200 akan terlihat di sini
vusJumlah pengguna virtual aktifCocokkan dengan saat waktu respons memburuk

Bila ambang batas tidak terpenuhi, k6 menandainya dan keluar dengan kode bukan nol. Ini berguna kalau uji dijalankan otomatis di pipeline.

7. Perbaiki lalu ulangi

Hasil yang buruk biasanya mengarah ke salah satu lapisan. CPU penuh di proses PHP berarti worker atau cache perlu ditata, lihat cara mengatur PHP-FPM agar tahan trafik tinggi. Error koneksi saat CPU masih longgar bisa berarti antrean koneksi kernel atau aplikasi penuh, dibahas di setelan sysctl untuk server web bertrafik tinggi. Database yang lambat terlihat dari query yang menumpuk. Ubah satu hal, lalu ulangi uji dengan skrip yang sama supaya hasilnya bisa dibandingkan.

Jenis uji apa lagi yang perlu kamu tahu?

Dokumentasi k6 membagi uji beban ke beberapa jenis. Selain smoke test, ada average-load test untuk trafik normal, stress test untuk beban di atas normal, spike test untuk lonjakan mendadak dan singkat, soak test untuk beban lama berjam-jam, dan breakpoint test untuk mencari batas kapasitas. Untuk kampanye dengan jam tayang tertentu, spike test paling mirip kondisi nyata: pengunjung datang serentak saat promo diumumkan.

Ingat juga bahwa skrip di atas hanya membuka satu halaman. Pengunjung asli membuka beranda, mencari produk, menambah ke keranjang, lalu checkout. Skenario yang mencakup beberapa langkah itu memberi gambaran lebih jujur, terutama untuk halaman yang memanggil database seperti pencarian dan keranjang. Kalau yang ingin kamu ukur adalah kemampuan mentah VPS, bukan aplikasinya, pakai benchmark sederhana untuk VPS.

Pertanyaan yang sering diajukan

Berapa VU yang perlu dipakai?

Mulai dari perkiraan pengunjung bersamaan di menit tersibuk, lalu uji juga sedikit di atasnya sebagai cadangan. Satu VU tidak sama dengan satu pengunjung per detik, karena VU mengulang skenario dengan jeda sleep.

Apakah k6 menjalankan JavaScript di halaman seperti browser?

Tidak secara bawaan. Modul http k6 hanya mengirim permintaan HTTP, tanpa merender halaman. k6 punya modul browser terpisah untuk menguji dari sisi tampilan, tapi lebih berat dijalankan.

Apakah aman load test ke website yang memakai CDN?

Aman selama itu websitemu sendiri, tapi hasilnya bisa menipu karena banyak halaman dilayani dari cache CDN. Uji juga halaman yang tidak di-cache, seperti pencarian dan keranjang, agar server asal ikut teruji.

Kapan sebaiknya uji dilakukan?

Beberapa hari sebelum kampanye, sehingga masih ada waktu memperbaiki dan menguji ulang. Ulangi juga setiap ada perubahan besar pada tema, plugin, atau server.

Apakah hasil uji di staging sama dengan produksi?

Hanya bila spesifikasi, konfigurasi, dan isi databasenya mirip. Staging dengan data sedikit sering terlihat jauh lebih cepat dari kenyataan.

Checklist sebelum hari kampanye:

  • Uji dijalankan dari mesin terpisah ke lingkungan yang mirip produksi.
  • Ambang lulus waktu respons dan error sudah ditentukan bersama tim.
  • Smoke test lulus sebelum uji beban penuh.
  • Server dipantau selama uji, dan penyebab leher botol dicatat.
  • Uji diulang setelah perbaikan dengan skrip yang sama.
  • Halaman yang tidak di-cache ikut diuji.

Sumber & referensi

Baca juga