Lewati ke isi

Server & Infrastruktur

Cara Menemukan Proses yang Menghabiskan CPU Server

Langkah melacak proses yang membuat CPU server Linux penuh dengan top, ps, pidstat, dan systemd-cgtop, lalu cara menanganinya tanpa asal kill.

Terbit 6 menit baca

Jawaban singkat

Buka top atau htop dan urutkan berdasarkan %CPU, lalu pastikan pelakunya dengan ps, pidstat, dan systemd-cgtop. Setelah ketemu, cari tahu proses itu milik layanan apa sebelum memutuskan restart, membatasi, atau menghentikannya.

Daftar isi
  1. Apakah CPU benar-benar penuh?
  2. Langkah melacak proses yang boros CPU
  3. Langkah 1: Lihat gambaran besar dengan top
  4. Langkah 2: Pakai htop bila tersedia
  5. Langkah 3: Ambil daftar yang bisa disalin dengan ps
  6. Langkah 4: Ukur dalam rentang waktu dengan pidstat
  7. Langkah 5: Kelompokkan per layanan dengan systemd-cgtop
  8. Langkah 6: Cari tahu identitas proses itu
  9. Langkah 7: Tangani sesuai penyebabnya
  10. Bagaimana kalau CPU penuh karena memang kurang?
  11. Ringkasan alat yang dipakai
  12. Pertanyaan yang sering diajukan
  13. Checklist singkat

Server tiba-tiba lambat, website lama dibuka, dan panel penyedia menunjukkan grafik CPU mentok di 100%. Pertanyaannya cuma satu: proses apa yang sedang makan CPU sebanyak itu?

Jawaban cepatnya: jalankan top, lihat baris paling atas, lalu konfirmasi dengan beberapa perintah lain supaya kamu tidak salah tuduh. Panduan di bawah menyusun urutan kerjanya dari yang paling cepat sampai yang paling teliti, berlaku untuk Ubuntu, Debian, AlmaLinux, dan Rocky Linux.

Apakah CPU benar-benar penuh?

Sebelum mencari pelaku, pastikan dulu masalahnya memang CPU. Server lambat bisa juga karena disk atau RAM, dan gejalanya mirip. Perintah pertama yang paling ringan adalah uptime:

uptime

Tiga angka di ujung adalah load average 1, 5, dan 15 menit. Bandingkan dengan jumlah core (nproc). Load yang jauh di atas jumlah core menandakan antrean kerja menumpuk, tapi belum tentu karena CPU. Penjelasan lengkapnya ada di artikel load average tinggi di Linux. Kalau load tinggi tetapi CPU terlihat santai, kemungkinan besar penyebabnya I/O disk, dan kasus itu dibahas di server lambat padahal CPU rendah.

Langkah melacak proses yang boros CPU

Langkah 1: Lihat gambaran besar dengan top

top

Perhatikan baris %Cpu(s) di bagian atas:

  • us tinggi: CPU dipakai aplikasi biasa (PHP, Node.js, database).
  • sy tinggi: banyak kerja di kernel, sering terkait jaringan atau disk.
  • wa tinggi: CPU menunggu disk. Pelakunya bukan proses yang "sibuk menghitung".
  • st tinggi: steal time, CPU virtual sedang menunggu jatah dari host. Ini hanya muncul di VPS dan tidak bisa diselesaikan dari dalam server.

Daftar proses di bawahnya secara bawaan diurutkan berdasarkan %CPU. Kalau urutannya berubah, tekan P (huruf besar) untuk mengurutkan lagi. Tekan 1 untuk melihat pemakaian per core, berguna untuk tahu apakah satu proses mengunci satu core saja atau semua core ikut penuh. Di top, angka 100% berarti satu core penuh, jadi proses multi-thread bisa tampil 300% atau lebih.

Langkah 2: Pakai htop bila tersedia

htop lebih mudah dibaca karena berwarna dan bisa digulir. Pasang dengan apt install htop atau dnf install htop (di keluarga RHEL, paket ini ada di repositori EPEL). Tekan F6 untuk memilih kolom urutan, F5 untuk tampilan pohon (tree) sehingga terlihat proses induk dan anaknya, dan F4 untuk menyaring nama proses.

Tampilan pohon sangat membantu untuk PHP-FPM atau Apache. Kamu langsung tahu bahwa puluhan proses kecil itu sebenarnya satu layanan.

Langkah 3: Ambil daftar yang bisa disalin dengan ps

Untuk dicatat atau dikirim ke rekan tim, ps lebih praktis:

ps -eo pid,ppid,user,%cpu,%mem,etime,cmd --sort=-%cpu | head -n 15

Ada satu jebakan di sini. Kolom %cpu pada ps adalah rata-rata sejak proses itu mulai berjalan, bukan pemakaian saat ini. Proses yang baru 10 detik melonjak bisa terlihat kecil, sementara database yang sudah jalan berbulan-bulan terlihat stabil. Jadi gunakan ps untuk daftar, dan top atau pidstat untuk angka saat ini.

Langkah 4: Ukur dalam rentang waktu dengan pidstat

Lonjakan CPU sering datang dan pergi. pidstat dari paket sysstat merekam pemakaian per proses dalam interval:

pidstat -u 5 6

Perintah itu mengambil 6 sampel dengan jeda 5 detik. Proses yang konsisten muncul di atas pada setiap sampel adalah tersangka utama. Tambahkan -t bila ingin melihat per thread.

Langkah 5: Kelompokkan per layanan dengan systemd-cgtop

Di server yang memakai systemd, setiap layanan berjalan di cgroup sendiri. Perintah ini menjumlahkan CPU per layanan, bukan per proses:

systemd-cgtop

Hasilnya menjawab pertanyaan yang lebih berguna: layanan mana yang boros, mysql.service, php8.3-fpm.service, atau container Docker tertentu.

Langkah 6: Cari tahu identitas proses itu

PID saja tidak cukup. Sebelum bertindak, pastikan proses itu apa dan dari mana asalnya:

systemctl status 12345
ls -l /proc/12345/exe
tr '\0' ' ' < /proc/12345/cmdline; echo
ls -l /proc/12345/cwd

Ganti 12345 dengan PID yang kamu temukan. systemctl status menunjukkan unit yang menaungi proses tersebut. /proc/PID/exe menunjuk ke file program aslinya, dan cwd menunjukkan folder tempat ia berjalan.

Langkah 7: Tangani sesuai penyebabnya

Setelah pelakunya jelas, pilih tindakan yang paling kecil risikonya:

  • Proses wajar tapi sedang berat (backup, kompresi, laporan): turunkan prioritasnya dengan renice -n 10 -p 12345 agar tidak mengganggu layanan utama.
  • Layanan macet atau bocor (worker PHP tersangkut, aplikasi Node.js loop): restart layanannya dengan systemctl restart nama.service, lalu cari akar masalah di log.
  • Layanan yang perlu dibatasi permanen: pasang kuota CPU lewat systemd, misalnya systemctl set-property nama.service CPUQuota=50%.
  • Query database berat: masuk ke MySQL dan jalankan SHOW FULL PROCESSLIST; untuk melihat query yang lama berjalan.
  • Proses asing: perlakukan sebagai insiden keamanan seperti di kotak peringatan di atas.

Hindari kill -9 sebagai langkah pertama. Sinyal itu menghentikan proses tanpa kesempatan menyimpan data, yang bisa merusak tabel database atau file yang sedang ditulis. Coba kill 12345 (SIGTERM) dulu.

Bagaimana kalau CPU penuh karena memang kurang?

Kadang tidak ada proses yang salah. Trafik naik, aplikasi bertambah, dan CPU memang sudah tidak cukup. Tandanya: pemakaian tinggi merata di banyak proses yang wajar, terjadi di jam sibuk, dan terus berulang setiap hari. Kalau steal time (st) yang tinggi, itu urusan kapasitas host di sisi penyedia, bukan aplikasimu. Untuk menimbang kapan saatnya menambah sumber daya, baca kapan VPS perlu upgrade RAM atau CPU.

Ringkasan alat yang dipakai

AlatKegunaan utamaCatatan
uptimeMelihat load averageBandingkan dengan nproc
topPemakaian CPU saat ini per prosesTekan P, 1, H
htopVersi top yang lebih nyamanTampilan pohon dengan F5
ps --sort=-%cpuDaftar yang mudah disalin%cpu adalah rata-rata seumur proses
pidstatRekaman per intervalPaket sysstat
systemd-cgtopCPU per layanan atau containerButuh systemd

Pertanyaan yang sering diajukan

Kenapa top menunjukkan proses lebih dari 100%?

Di top, 100% berarti satu core penuh. Proses multi-thread yang memakai beberapa core sekaligus bisa tampil 200%, 400%, dan seterusnya.

Apa arti kworker atau ksoftirqd yang memakai banyak CPU?

Itu thread kernel. Pemakaian tinggi biasanya gejala dari hal lain, misalnya lalu lintas jaringan sangat besar atau masalah disk, jadi periksa trafik dan I/O, bukan menghentikan thread tersebut.

Bagaimana cara melihat thread mana yang boros di dalam satu proses?

Jalankan top -H -p PID atau pidstat -t -p PID 5. Ini berguna untuk aplikasi Java atau database yang punya banyak thread.

Apakah aman membatasi CPU layanan dengan CPUQuota?

Aman bila angkanya wajar. Layanan tetap jalan, hanya tidak boleh melewati batas, sehingga responsnya bisa lebih lambat saat sibuk. Uji di jam sepi dulu.

Lonjakan CPU terjadi tengah malam saat saya tidur, bagaimana melacaknya?

Aktifkan pengumpulan data sysstat agar sar merekam riwayat, atau pasang alat monitoring yang menyimpan grafik per proses. Cocokkan jamnya dengan jadwal cron dan backup.

Checklist singkat

  • Cek uptime dan nproc, pastikan masalahnya CPU, bukan disk.
  • Baca us, sy, wa, dan st di top.
  • Temukan proses teratas dengan top, htop, atau pidstat.
  • Kelompokkan per layanan dengan systemd-cgtop.
  • Pastikan identitas proses lewat systemctl status dan /proc/PID.
  • Pilih tindakan paling ringan: renice, restart, batasi, baru hentikan.

Baca juga