Meningkatkan performa sistem dengan pendekatan berbasis data: memprofil CPU, memory, dan I/O, mengidentifikasi bottleneck, serta melakukan tuning kernel dan aplikasi secara terukur dan dapat diuji ulang

Sejauh ini kita membangun, mengotomasi, memantau, dan mengamankan sistem. Ada satu pertanyaan yang selalu muncul saat sistem sudah berjalan: "kenapa lambat?" Episode 16 ini menjawabnya dengan benar — bukan lewat tebakan, melainkan lewat profiling berbasis data.
Mengapa episode ini penting? Karena "sistem lambat" adalah masalah paling sering yang ditangani System Engineer, dan hampir selalu disalahpahami. Orang cenderung langsung membeli hardware baru atau menambah instance. Padahal solusi sejati lahir dari mengukur: apa bottleneck-nya? CPU, memory, disk I/O, atau jaringan? Episode ini mengajarkan metodologi tuning: ukur dulu, hipotesis, ubah satu variabel, ukur lagi.
Pendekatan USE (Utilization, Saturation, Errors) oleh Brendan Gregg adalah kerangka yang paling praktis untuk server:
Terapkan ke CPU, memory, disk, dan jaringan. Seringnya bottleneck tidak terlihat dari satu metrik saja.
uptime # load average (1/5/15 menit)
vmstat 1 5 # proses, memori, swap, IO, cpu tiap detik
iostat -x 2 3 # perangkat disk: util, await, queue
sar -q 2 5 # run queue & load
free -h # memori + cache
ss -s # ringkasan socketTip
Aturan membaca vmstat: kolom r adalah jumlah proses yang menunggu CPU (saturation CPU) — jika konsisten melebihi jumlah core, CPU adalah bottleneck. Kolom wa (iowait) tinggi berarti disk. Jangan cuma melihat %us; kombinasi r, wa, dan si/so memberi gambaran yang lebih lengkap.
top -b -n1 | head -20
ps aux --sort=-%cpu | head -10
pidstat -u 2 5 # penggunaan CPU per proses per intervalUntuk mencari di mana CPU dibakar (fungsi apa), gunakan perf untuk menghasilkan flamegraph:
sudo perf record -F 99 -p <pid> -g -- sleep 30
sudo perf script | stackcollapse-perf.pl | flamegraph.pl > cpu.svgJika beban CPU tinggi tapi berasal dari interrupt atau kernel (bukan user space), kemungkinan besar ini masalah network/driver — bukan aplikasi.
free -h
vmstat 1 5 | grep -E "si|so" # swap in/out aktif = tekanan memori
ps aux --sort=-%mem | head -10si/so yang terus bergerak berarti sistem aktif swap — memori kurang. Solusi yang benar tidak selalu menambah RAM: bisa jadi aplikasi bocor memori, atau tuning vm.swappiness (episode 3) bisa membantu.
Saat memori benar-benar habis, kernel membunuh proses terbesar via OOM killer. Jejaknya di dmesg:
dmesg -T | grep -i "out of memory" | tail
journalctl -k | grep -i oom | tailOOM yang sering muncul adalah sinyal serius: bisa jadi limits container salah (episode 15), leak, atau kapasitas memang kurang.
iostat -x 2 3Fokus pada tiga kolom:
| Metrik | Arti |
|---|---|
%util | Seberapa sibuk perangkat (bukan berarti "penuh") |
await | Latensi rata-rata request (ms) |
w_await | Latensi write — naik drastis = disk bermasalah |
Pola umum: %util tinggi + await tinggi = disk benar-benar jenuh. %util rendah tapi await tinggi = antrean di belakang disk (misal satu disk yang dipakai banyak VM).
Untuk database, yang penting bukan throughput tapi latency per request. Gunakan fio untuk mengukur kemampuan disk yang sebenarnya:
sudo fio --name=test --rw=randread --bs=4k --size=1G --numjobs=1 \
--iodepth=1 --runtime=30 --time_basedPerhatikan lat (usec) avg — untuk SSD NVMe, single-thread latency di bawah 200 us adalah wajar; jika jauh di atas itu, ada masalah (busy VM, RAID, atau QoS).
Parameter umum yang sering diubah (cara permanen di sysctl.d, seperti episode 3):
# Kurangi swap pada server aplikasi
vm.swappiness=10
# File descriptor & port range untuk layanan sibuk
fs.file-max=2097152
net.ipv4.ip_local_port_range=1024 65535
# Backlog koneksi lebih besar
net.core.somaxconn=4096Sebelum menyentuh kernel, periksa lapisan aplikasi:
| Lapisan | Pertanyaan | Solusi Umum |
|---|---|---|
| Database | Query lambat? | Index, EXPLAIN, tuning buffer |
| Web server | Timeout tinggi? | Worker process, keepalive |
| Aplikasi | GC/thread terlalu besar? | Heap size, pool size |
| Kode | Algoritma buruk? | Profiling di level kode |
Aturan kunci: satu perubahan, satu pengukuran. Ubah max_connections saja, ukur, bandingkan baseline — jangan ubah lima parameter sekaligus.
Skenario: aplikasi web di server melambat di jam sibuk.
# 1. Baseline
uptime; vmstat 1 5; iostat -x 2 3
# 2. Cek bottleneck (misal: CPU saturation, r=8 pada 4 core)
top -b -n1 | head -15
# 3. Ubah SATU variabel, misal: naikkan worker nginx dari 4 ke 8
sudo sed -i 's/worker_processes 4;/worker_processes 8;/' /etc/nginx/nginx.conf
sudo nginx -t && sudo systemctl reload nginx
# 4. Ukur ulang setelah stabil
vmstat 1 5
# 5. Bandingkan: r menurun? throughput naik? Dokumentasikan hasilnyaInti yang harus dibawa pulang:
vmstat (saturation CPU & swap), iostat (latency disk), perf (flamegraph), dmesg (OOM).sysctl.d; aplikasi/web/database sering jadi sumber asli bottleneck.Di episode 17 selanjutnya kita menjaga sistem tetap aman dari ancaman yang berkembang: patch & vulnerability management — siklus hidup patch, pelacakan CVE, dan maintenance windows. Sampai jumpa di episode 17!