Sejak pertama kali saya memegang tanggung jawab sebagai sysadmin di sebuah startup e-commerce lokal pada tahun 2018, saya langsung sadar: buku teks Linux tidak pernah cukup untuk menghadapi server production yang sedang bermasalah. Saya ingat betul malam Minggu itu — server tiba-tiba hanging, ssh lambat, dan semua anggota tim developer panik karena deploy gagal. Saya cuma punya terminal dan secangkir kopi hitam.
Dari pengalaman pahit itulah saya belajar bahwa Linux troubleshooting bukan sekadar hafal perintah, tapi memahami kapan dan bagaimana menggunakannya di situasi nyata. Artikel ini akan membahas 10 perintah esensial yang wajib dikuasai setiap sysadmin Indonesia, lengkap dengan contoh kasus yang pernah saya alami.
1. top dan htop — Mata-mata Real-time Resource Server
Ketika server mulai lelet, top adalah senjata pertama yang saya gunakan. Perintah ini menampilkan proses yang berjalan, penggunaan CPU, memory, dan load average secara real-time.
top -bn1 | head -20
Output yang saya dapat biasanya seperti ini:
top - 14:23:45 up 12 days, 3:21, 1 user, load average: 4.50, 3.20, 2.10
Tasks: 245 total, 1 running, 244 sleeping, 0 stopped, 0 zombie
%Cpu(s): 85.2 us, 10.3 sy, 0.0 ni, 4.0 id, 0.5 wa, 0.0 hi, 0.0 si
MiB Mem : 7856.2 total, 1234.5 free, 4567.8 used, 2053.9 buff/cache
MiB Swap: 2048.0 total, 102.3 free, 1945.7 used. 2045.6 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
5678 www-data 20 0 456.7m 234.5m 12.3m R 45.6 3.0 12:34.56 php-fpm
1234 mysql 20 0 1.2g 567.8m 45.6m S 30.2 7.2 45:12.34 mysqld
Kasus nyata: Suatu ketika load average mencapai 12.0 di server 4 core. Setelah saya jalankan top, langsung kelihatan bahwa php-fpm memakan CPU 200% (karena 2 proses). Saya langsung cek konfigurasi pm.max_children di www.conf dan ternyata terlalu besar. Setelah saya turunkan dari 50 ke 20, server kembali stabil dalam 2 menit.
Untuk pengalaman yang lebih visual, saya sarankan install htop:
sudo apt install htop # Debian/Ubuntu
sudo yum install htop # RHEL/CentOS
Tips: Gunakan top -u www-data untuk melihat proses user tertentu, atau top -p 1234,5678 untuk memonitor PID spesifik. Ini sangat membantu ketika Anda hanya ingin fokus pada proses aplikasi tertentu.
2. df dan du — Detektif Ruang Disk
"Pak, server error nih — storage full!" Wah, kalau sudah dapat chat begitu, df adalah perintah pertama yang saya ketik.
df -h
Output:
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 98G 85G 13G 87% /
/dev/sdb1 500G 498G 2.0G 99% /data
tmpfs 3.9G 2.1G 1.8G 54% /run
Begitu tahu partisi mana yang penuh, saya gunakan du untuk mencari direktori paling boros:
du -sh /* 2>/dev/null | sort -rh | head -10
Atau lebih spesifik:
du -sh /data/* 2>/dev/null | sort -rh | head -10
Output yang sering saya temui:
200G /data/logs
150G /data/backups
50G /data/uploads
30G /data/database
Pengalaman personal: Tahun lalu saya menangani server aplikasi learning management system (LMS) untuk sebuah universitas di Jawa Timur. df -h menunjukkan /var/log sudah 100%. Saya jalankan du -sh /var/log/* | sort -rh dan ternyata file syslog membengkak sampai 80GB! Setelah saya grep isinya, ternyata ada service microservice yang looping error terus-menerus. Saya matikan service itu, logrotate saya konfigurasi ulang, dan masalah selesai dalam 10 menit.
Perintah tambahan: Cari file lebih dari 1GB dengan:
find / -type f -size +1G -exec ls -lh {} \; 2>/dev/null
3. netstat dan ss — Mengawasi Lalu Lintas Koneksi
Dulu saya selalu mengandalkan netstat, tapi sekarang ss lebih cepat dan direkomendasikan. Keduanya berguna untuk melihat port yang terbuka, koneksi aktif, dan mendeteksi hanging connections.
ss -tulpn
Output:
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1234,fd=6))
LISTEN 0 128 0.0.0.0:3306 0.0.0.0:* users:(("mysqld",pid=5678,fd=21))
LISTEN 0 128 127.0.0.1:6379 0.0.0.0:* users:(("redis-server",pid=9012,fd=4))
ESTAB 0 0 10.0.0.5:42710 203.0.113.50:443 users:(("nginx",pid=1234,fd=24))
Studi kasus: Suatu hari aplikasi web terasa lambat. Saya jalankan ss -tan | grep :80 | wc -l dan ternyata ada 2.345 koneksi concurrent. Dari situ saya tahu nginx butuh tuning worker_connections. Saya naikkan dari 1024 ke 4096 di file /etc/nginx/nginx.conf, lalu systemctl reload nginx. Hasilnya? Response time turun dari 4 detik menjadi 1,2 detik.
Untuk melihat koneksi yang hanging atau TIME_WAIT dalam jumlah besar:
ss -tan | grep TIME_WAIT | wc -l
Jika jumlahnya di atas 10.000, Anda perlu memeriksa konfigurasi net.ipv4.tcp_fin_timeout dan net.ipv4.tcp_tw_reuse di /etc/sysctl.conf.
4. ps — Membaca Proses dengan Detail
Ketika proses aplikasi tiba-tiba mati atau zombie, ps adalah alat investigasi utama.
ps auxf
Output:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 101432 6784 ? Ss Mar12 0:12 /sbin/init
root 456 0.0 0.1 28164 2136 ? S Mar12 0:00 \_ /usr/sbin/cron
mysql 789 0.0 7.2 1589744 567890 ? Ssl Mar12 45:12 \_ /usr/sbin/mysqld
www-data 1234 1.2 3.0 456789 234567 ? S 14:10 0:15 \_ nginx: worker process
Saya sering menggunakan kombinasi ps aux dengan grep untuk mencari proses tertentu:
ps aux | grep php-fpm | grep -v grep
Tips advanced: Untuk melihat thread dalam suatu proses:
ps -T -p <PID>
Atau mencari proses yang menggunakan memory paling besar:
ps aux --sort=-%mem | head -15
Ini sangat berguna ketika aplikasi Java atau PHP Anda mengalami memory leak. Saya pernah mendapati satu proses java memakan 12GB RAM — lebih dari separuh memory server! Setelah saya kill dan restart dengan -Xmx yang benar, masalah selesai.
5. journalctl — Log Sistem yang Terstruktur
Di era systemd, journalctl adalah pengganti tail -f /var/log/syslog yang jauh lebih powerful.
journalctl -u nginx.service --since "1 hour ago" --no-pager
Output:
Mar 15 14:20:01 server01 nginx[1234]: [error] 5678#5678: *789 open() "/var/www/html/index.html" failed (13: Permission denied), client: 10.0.0.1
Mar 15 14:25:30 server01 nginx[1234]: [error] 5678#5678: *790 connect() failed (111: Connection refused) while connecting to upstream, client: 10.0.0.1
Pengalaman nyata: Suatu malam aplikasi POS sebuah restoran besar di Jakarta error 502 terus. Saya jalankan:
journalctl -u php8.1-fpm.service -f
Dari situ saya lihat error pm: children exhausted. Saya segera naikkan pm.max_children dari 10 menjadi 25 dan restart service. Aplikasi kembali normal dalam 30 detik. Bayangkan jika saya harus buka file log satu per satu — bisa 15 menit!
Perintah lanjutan: Filter berdasarkan prioritas error:
journalctl -p err -b
Atau lihat log kernel:
journalctl -k
Tips: Untuk memudahkan analisis, saya selalu mengatur journald.conf dengan SystemMaxUse=2G agar log tidak memenuhi disk. Setelah itu, restart service dengan systemctl restart systemd-journald.
6. strace — Melihat ke Dalam System Call
strace adalah alat debugging paling ampuh yang saya tahu. Ia menangkap system calls dan signals yang dibuat oleh proses.
strace -p 1234 -e trace=network -s 1024 -t
Output:
14:30:01 connect(5, {sa_family=AF_INET, sin_port=htons(3306), sin_addr=inet_addr("10.0.0.10")}, 16) = 0
14:30:01 sendto(5, "...query..."..., 100, 0, NULL, 0) = 100
14:30:05 recvfrom(5, 0x7fff..., 4096, 0, NULL, NULL) = -1 ETIMEDOUT (Connection timed out)
Kasus klasik: Aplikasi PHP lemot setelah migrasi database. Saya strace proses PHP:
strace -o /tmp/trace.log -p $(pgrep -x php-fpm | head -1) -s 4096 -t
Dari file /tmp/trace.log, saya lihat ada ratusan connect ke MySQL yang timeout setelah 5 detik. Ternyata IP database di .env salah — menunjuk ke server mati! Setelah diperbaiki, aplikasi kembali normal.
Catatan: Hati-hati menggunakan strace di production — ia bisa memperlambat proses hingga 10-100x. Saya biasanya hanya gunakan di staging atau jika benar-benar darurat.
7. lsof — Daftar File yang Sedang Dibuka
Pernah dapat error "too many open files"? Itu saatnya lsof beraksi.
lsof -p 1234 | wc -l
Atau lihat file descriptor yang terbuka oleh suatu proses:
lsof -p 1234
Output:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 1234 www-data cwd DIR 8,1 4096 2 /
nginx 1234 www-data rtd DIR 8,1 4096 2 /
nginx 1234 www-data txt REG 8,1 987654 1234567 /usr/sbin/nginx
nginx 1234 www-data mem REG 8,1 65432 2345678 /usr/lib/x86_64-linux-gnu/libc.so.6
nginx 1234 www-data 6u IPv4 123456789 0t0 TCP *:80 (LISTEN)
Pengalaman: Suatu hari redis-server crash dengan error "Can't open: Too many open files". Saya cek limit sistem:
ulimit -n
Ternyata hanya 1024. Saya naikkan menjadi 65535 di /etc/security/limits.conf:
root soft nofile 65535
root hard nofile 65535
redis soft nofile 65535
redis hard nofile 65535
Restart Redis, dan voila, crash tidak pernah terjadi lagi.
Tips lanjutan: Cari file yang dihapus tapi masih terbuka (makan disk space):
lsof +L1 | head -10
8. vmstat — Statistik Memory Virtual
vmstat memberikan gambaran ringkas tentang memory, swap, I/O, dan CPU dalam satu layar.
vmstat 2 10
Output:
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
3 1 1945723 123456 78901 234567 1234 5678 901 234 567 890 45 12 30 13 0
5 2 1945723 119876 78905 234589 1345 5789 923 245 589 912 50 15 20 15 0
Kolom yang penting:
- r (run queue): Jika > jumlah core, menandakan CPU overload. Server 4 core dengan
r> 8 artinya ada bottleneck. - b (blocked): Proses yang menunggu I/O. Angka tinggi ( > 2 ) biasanya indikasi disk lambat.
- si/so (swap in/out): Jika tidak nol, RAM tidak cukup. Sebaiknya ditambah atau optimasi memory.
- wa (wait I/O): Persentase CPU yang menganggur sambil menunggu I/O. > 20% sudah perlu waspada.
Analisis saya: Di server database MySQL dengan 8 core, saya melihat wa konsisten 25-30% dan b selalu di atas 5. Saya sarankan upgrade dari HDD ke SSD. Setelah migrasi, wa turun menjadi 2% dan query yang tadinya 3 detik menjadi 200 ms saja.
9. iostat — Performa Disk secara Detail
Kalau vmstat memberi gambaran umum, iostat memberikan detail perangkat disk.
iostat -x 2 5
Output:
Device r/s w/s rkB/s wkB/s await svctm %util
sda 45.2 89.3 1234.5 5678.9 12.3 4.5 45.6
sdb 12.1 34.5 456.7 1234.5 45.6 8.9 78.9
Parameter penting:
- %util: Persentase waktu disk sibuk. > 80% berarti disk menjadi bottleneck.
- await: Rata-rata waktu I/O request (ms). Untuk HDD, normal < 20ms; untuk SSD, ideal < 2ms.
- svctm: Waktu layanan rata-rata. Lebih kecil lebih baik.
Kasus di lapangan: Sebuah server file sharing di perusahaan logistik mengalami keluhan akses lambat setiap jam 10 pagi. Saya pasang iostat -x 1 60 dan melihat %util mencapai 100% pada perangkat /dev/sdb. Setelah investigasi, ternyata ada cron job backup yang berjalan jam 10 pagi dan memonopoli I/O. Saya pindahkan jadwal backup ke jam 2 pagi, dan keluhan selesai.
10. sar — Laporan Historis Sistem
Ini perintah favorit saya untuk post-mortem. sar menyimpan data historis sistem sehingga Anda bisa melihat apa yang terjadi semalam atau seminggu lalu.
sar -u -s 00:00:00 -e 23:59:59
Output:
Linux 5.10.0-0.bpo.3-amd64 (server01) 03/14/2025 _x86_64_ (4 CPU)
00:00:01 CPU %user %nice %system %iowait %steal %idle
00:10:01 all 12.34 0.00 5.67 2.10 0.00 80.10
00:20:01 all 55.67 0.00 23.45 8.90 0.00 12.34
00:30:01 all 10.12 0.00 4.56 1.23 0.00 84.56
Tepat di jam 00:20, CPU usage melonjak. Saya cek sar -p -s 00:20:01 untuk proses apa yang jalan. Ternyata cron job certbot renew yang berjalan setiap malam dan memakan CPU.
Penggunaan lain: Cek penggunaan memory historis:
sar -r -s 00:00:00 -e 23:59:59
Atau network traffic:
sar -n DEV 1 5
Tips: Pastikan sysstat sudah diinstall dan service berjalan:
sudo apt install sysstat
sudo systemctl enable sysstat
sudo systemctl start sysstat
Data historis disimpan di /var/log/sysstat/ — biasanya untuk 7 hari terakhir. Anda bisa mengubah masa retensi di /etc/sysstat/sysstat dengan parameter HISTORY=30.
Kesimpulan: Membangun Muscle Memory Troubleshooting
Sepuluh perintah di atas hanyalah permukaan. Yang membuat perbedaan antara sysadmin biasa dan sysadmin andal adalah kebiasaan menggunakannya dalam tekanan. Saya sendiri menghabiskan ratusan jam di terminal — termasuk malam Lebaran tahun 2022 ketika server pembayaran Qris tumbang dan saya harus journalctl + strace dalam 5 menit untuk menemukan bahwa koneksi ke API bank timeout karena MTU bermasalah.
Beberapa rekomendasi saya untuk Anda yang ingin serius di Linux administration:
- Biasakan membaca
man— Tidak ada yang lebih otoritatif dari manual resmi. Cobaman straceatauman sarhari ini. - Dokumentasikan setiap troubleshooting — Saya selalu catat tanggal, gejala, perintah yang digunakan, dan solusi di jurnal pribadi. Ini sangat membantu ketika masalah serupa muncul lagi.
- Latihan di lab — Gunakan VirtualBox atau Linux di cloud untuk simulasi. Matikan service, buat disk penuh, lalu coba selesaikan dengan perintah di atas.
- Ikuti perkembangan tools baru — Alternatif modern seperti
btm(bottom),duf(disk usage),bandwhich(network) bisa menjadi pelengkap. Tapi kuasai dulu yang klasik sebelum beralih.
Terakhir, optimasi server bukanlah proyek sekali jadi, melainkan siklus monitor → diagnose → fix → monitor lagi. Dengan 10 perintah di atas, Anda sudah punya fondasi yang kokoh. Selamat troubleshooting, dan jangan lupa backup sebelum bertindak!
Artikel ini pertama kali diterbitkan di Tool Kuy (toolkuy.com) untuk sysadmin Indonesia. Jika Anda punya pengalaman menarik atau pertanyaan, diskusikan di kolom komentar.
💬 Komentar (0)
Belum ada komentar. Jadilah yang pertama! 💬