---
title: "Cara Menemukan Proses yang Menghabiskan CPU Server"
description: "Langkah melacak proses yang membuat CPU server Linux penuh dengan top, ps, pidstat, dan systemd-cgtop, lalu cara menanganinya tanpa asal kill."
url: "https://nivelva.com/insight/cara-menemukan-proses-menghabiskan-cpu-server"
category: "Server \u0026 Infrastruktur"
tags: ["cpu","linux","top","troubleshooting","server"]
author: "Theresia Candiawan"
published: "2026-11-07T05:20:00+07:00"
updated: "2026-11-07T05:20:00+07:00"
language: "id"
publisher: "Nivelva (https://nivelva.com)"
---

# Cara Menemukan Proses yang Menghabiskan CPU Server

> **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.

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](https://nivelva.com/insight/load-average-tinggi-linux-artinya-solusinya). Kalau load tinggi tetapi CPU terlihat santai, kemungkinan besar penyebabnya I/O disk, dan kasus itu dibahas di [server lambat padahal CPU rendah](https://nivelva.com/insight/server-lambat-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.

> **Waspadai proses asing:**
>
> Proses dengan nama acak, berjalan dari `/tmp`, `/var/tmp`, atau `/dev/shm`, dan memakai CPU hampir penuh terus-menerus adalah tanda umum penambang kripto hasil peretasan. Jangan hanya di-kill, karena biasanya ia hidup lagi lewat cron atau layanan palsu. Periksa `crontab -l` untuk semua user, unit systemd yang tidak dikenal, dan log login, lalu tutup celah masuknya.

### 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](https://nivelva.com/insight/vps-perlu-upgrade-ram-cpu).

## Ringkasan alat yang dipakai

| Alat | Kegunaan utama | Catatan |
|:--|:--|:--|
| `uptime` | Melihat load average | Bandingkan dengan `nproc` |
| `top` | Pemakaian CPU saat ini per proses | Tekan `P`, `1`, `H` |
| `htop` | Versi top yang lebih nyaman | Tampilan pohon dengan `F5` |
| `ps --sort=-%cpu` | Daftar yang mudah disalin | %cpu adalah rata-rata seumur proses |
| `pidstat` | Rekaman per interval | Paket `sysstat` |
| `systemd-cgtop` | CPU per layanan atau container | Butuh 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.

---

Diterbitkan oleh Nivelva Insight (https://nivelva.com/insight/). Artikel ini: https://nivelva.com/insight/cara-menemukan-proses-menghabiskan-cpu-server
Kontak Nivelva: WhatsApp https://wa.me/6285111245007, email hello@nivelva.com
