• Indonesian
  • English
  • Optimasi CPU VPS: Panduan Lengkap Workload Berat 2026

    Kecepatan:
    ⏱ 14 min read

    Jadi gini, kemarin sore ada client yang nelpon dengan nada agak gundah. VPS-nya kerasa berat banget pas jam kantor, website rada lola, kadang SSH aja lambat dibales. Aku cek sejenak, eh ternyata CPU-nya nendang terus di 100% pas jam sibuk. Nah, daripada aku njelasin panjang lebar di telepon, mending sekalian aku tulis artikel ini. Siapa tau sampeyan yang lagi baca ini lagi ngalamin hal yang persis sama – semoga panduan cara optimasi CPU VPS Linux untuk workload berat ini bisa bantu.

    Ibarat dapur restoran pas jam makan siang – semua kompor kebuka, tukang masak kewalahan, dan pesanan numpuk sampai ke kasir. Nah, VPS yang CPU-nya penuh itu kurang lebih kayak gitu. Server-nya masih hidup, tapi gak bisa melayani apa-apa dengan baik. Tenang, ini gak selalu berarti harus upgrade. Yang penting tahu dulu sumber masalahnya, baru kita putuskan solusinya. Santai aja, kita jalan pelan-pelan.

    Difficulty: Intermediate
    Last Updated: Agustus 2026
    Tested On: Ubuntu 22.04 & AlmaLinux 9, Nginx 1.24, PHP-FPM 8.2, MariaDB 10.11, systemd 249

    Kenapa CPU VPS Bisa Penuh dan Dampaknya ke Workload Berat

    CPU penuh itu sebenernya bukan cuma soal “server lemot” doang – dampaknya beda-beda tergantung jenis workload-nya. Kalau VPS-nya buat e-commerce atau aplikasi web, response time bisa naik drastis pas jam sibuk, dan itu artinya pengunjung banyak yang kabur ninggalin keranjang belanja. Kalau buat processing data, misalnya cron yang narik API atau olah log, tugas-tugasnya bisa molor dan numpuk sampai besok, malah bisa ketumpuk-tumpuk makin parah. Yang paling bikin sakit kepala: load tinggi bikin MySQL atau Redis kena timeout, dan satu layanan yang down bisa nyeret layanan lain – efek domino yang gak enak banget ditangani tengah malam.

    Kalau ditanya kenapa bisa begitu, penyebabnya biasanya gak jauh dari beberapa hal ini. Paling sering sih proses PHP-FPM yang kebanyakan – tiap request PHP itu single-thread, jadi pas traffic lagi rame, worker-nya numpuk dan rebutan CPU. Terus ada juga query MySQL yang gak pakai index; apalagi kalau tabelnya udah gede, ini bisa makan CPU gila-gilaan tanpa ketahuan. Jangan lupa cron yang overlap – job sebelumnya belum selesai, job baru udah jalan duluan. Ditambah bot atau crawler yang nge-hammer website, sampai backup yang dijadwalin pas jam sibuk. Nah, ini yang sering banget gak disadari orang.

    Gejalanya gampang dikenali kalau sampeyan mau peka. Load average tinggi di atas jumlah core, persentase us dan sy di mpstat nendang, proses di top gonta-ganti terus, dan response time website naek padahal traffic gak terlalu naek. Yang paling khas sih – server masih mau respon, tapi pelan banget, dan tiap ketik command di SSH serasa ada jeda dulu. Itu udah tanda yang jelas kalau CPU lagi jadi bottleneck, bukan disk dan bukan RAM. Beda treatment-nya, makanya diagnosis awal itu penting banget sebelum ngubah-ngubah apa pun di server.

    Jangan Salah Baca Load Average

    Sebelum masuk ke perintah-perintah, ada satu konsep yang sering disalahpahami: bedanya load average sama persentase CPU usage. CPU usage yang 100% itu gak selalu masalah – kalau VPS 4 core, satu core penuh ya cuma 25%. Tapi load average itu ngukur antrean, bukan cuma kesibukan. Ibarat restoran tadi: CPU usage itu ngitung wajan yang lagi dipake, load average itu ngitung semua orang yang antri, termasuk yang belum sempat masak.

    Nah, karena itu aturannya: kalau load average 1 menit, 5 menit, dan 15 menit semuanya tinggi dan cenderung naik, itu antrean beneran. Kalau cuma 1 menit yang tinggi tapi 15 menit santai, itu spike sesaat – mungkin ada cron yang jalan beberapa detik atau satu request gede. Beda perlakuannya. Yang 15 menit tinggi itu yang bikin server makin lemot seiring waktu, dan itu yang harus dikejar.

    Satu lagi yang penting: load tinggi belum tentu CPU. Kalau prosesnya nunggu disk (I/O wait), load ikut naik walau CPU-nya nganggur. Di mpstat, itu keliatan dari kolom %wa. Banyak orang kaget ngeliat load 8 padahal CPU 5% – ya karena disk-nya yang jadi sumbatan. Kalau udah gini, optimasi CPU malah gak ngefek. Makanya aku selalu minta tim cek mpstat dulu sebelum banting setir ke tuning CPU.

    Langkah 1: Diagnosis – Jangan Asal Restart

    Ini saran yang sering aku ulang ke tim: jangan pernah restart service cuma karena CPU tinggi. Restart itu cuma nunda masalah, bukan nyelesain. Kadang malah bikin downtime gak perlu, dan pas server balik, masalahnya langsung muncul lagi. Mulai dari ngukur dulu.

    uptime
    nproc
    lscpu | grep -E 'CPU(s)|Core|Thread'
    top -b -n 1 | head -20

    Perhatiin bagian load average di output uptime. Angkanya ada tiga: rata-rata 1 menit, 5 menit, dan 15 menit. Kalau load average lebih tinggi dari jumlah core (cek dengan nproc), berarti CPU-nya kelebihan beban. Misal VPS 2 core, load 4.5 itu artinya antrean lagi panjang – ibaratnya warung gorengan yang cuma punya 2 wajan tapi diladeni 5 pembeli.

    15:42:03 up 21 days,  3:12,  2 users,  load average: 4.50, 3.20, 2.10

    Kalau load average 15 menit masih tinggi, ini bukan spike temporer – ada yang salah secara permanen. Sekarang kita cek prosesnya siapa yang makan CPU. Liat juga kolom %CPU di top dengan refresh beberapa detik, jangan cuma sekilas – biar dapet gambaran yang stabil, bukan angka kebetulan.

    contoh output top yang menampilkan proses dengan penggunaan CPU tertinggi di VPS Linux

    Langkah 2: Cari Tahu Pelakunya

    Jangan nebak. Lihat langsung siapa yang makan CPU. Top itu udah cukup buat liat sepintas, tapi kalau mau detail per-core dan per-proses, pakai mpstat dan pidstat (dari paket sysstat).

    apt install sysstat htop   # Ubuntu/Debian
    dnf install sysstat htop   # AlmaLinux/Rocky
    
    mpstat -P ALL 1 3
    pidstat 1 5
    ps -eo pid,ppid,user,%cpu,%mem,cmd --sort=-%cpu | head -15

    Ini contoh output ps yang khas pas lagi kena masalah:

    PID   PPID USER  %CPU %MEM CMD
    5231  1     www-data 98.3  2.1 php-fpm8.2: pool www
    5232  1     www-data 97.8  2.0 php-fpm8.2: pool www
    5230  1     www-data 92.4  2.1 php-fpm8.2: pool www
    5229  1     www-data 85.1  2.0 php-fpm8.2: pool www
    4012  1     root   45.2  0.4 /usr/local/bin/backup.sh

    Nih, perhatiin polanya: empat worker PHP-FPM semuanya jebol di atas 85% CPU. Itu bukan kerjaan web normal – entah ada request yang bikin loop, crawler nge-hammer, atau query yang nunggunya malah makan CPU. Dan perhatiin juga backup.sh yang makan 45% – kalau lagi jalan pas jam sibuk, itu bakal nambah beban ke CPU yang udah rame. Dari sini kita udah bisa nentuin arah.

    Btw, aku pernah nemuin kasus yang output-nya malah didominasi proses dengan nama aneh kayak crypto-miner. PID-nya tinggi, user-nya bukan yang biasa, dan persentase CPU-nya di atas 100% karena multithread. Kalau nemu pola kayak gini, itu bukan masalah tuning – itu insiden keamanan. Isolasi dulu VPS-nya, tarik daftar prosesnya, dan tangani breach-nya sebelum ngapa-ngapain. Buat pola yang lebih umum di cPanel, cek artikel troubleshoot load tinggi cPanel.

    Kalau yang nendang malah mysqld atau mariadbd, cek query-nya. Aktifin slow query log sebentar, atau liat processlist:

    mysql -e "SHOW FULL PROCESSLIST;"

    Cari query yang status-nya “Sending data” atau “Copying to tmp table” udah beberapa detik. Itu kandidat query tanpa index atau query yang nge-scan jutaan baris. Jangan lupa jalanin EXPLAIN di query itu sebelum nambah-nambah index, biar gak asal pake.

    Langkah 3: Tuning Level Aplikasi

    Setelah nemu pelakunya, baru kita tuning. Ini bagian yang paling sering disalahpahami, jadi sabar ya. Tuning itu bukan soal menaikin angka – tapi soal nyamain kapasitas sama kebutuhan, plus ngasih headroom yang cukup.

    PHP-FPM: Jangan Asal Naikin Max Children

    Ini kesalahan klasik. Orang lihat traffic naek, langsung naikin pm.max_children. Padahal tiap worker itu makan RAM – kalau RAM habis, server malah pindah ke swap dan makin lemot. Naikin worker harus dibarengi cek memori per worker dulu.

    ps -eo rss,cmd | grep 'php-fpm: pool' | awk '{sum+=$1} END {print "avg:", sum/NR/1024, "MB"}'

    Hitungnya gampang: max_children ideal = RAM tersedia dibagi rata-rata ukuran worker, terus dikurangi headroom buat OS, MySQL, Nginx. Misal VPS 2GB, worker rata-rata 180MB, amannya kasih 8 sampai 10 worker. Contoh konfigurasi yang masuk akal:

    pm = dynamic
    pm.max_children = 10
    pm.start_servers = 3
    pm.min_spare_servers = 2
    pm.max_spare_servers = 5
    pm.max_requests = 500

    pm.max_requests itu penting – bikin worker restart setelah 500 request, jadi memory leak kecil di PHP gak numpuk sampai bikin RAM jebol. Kalau mau tau kondisi pool secara real-time, aktifin pm.status dan liat berapa worker yang sibuk vs nganggur. Kalau “idle” selalu nol dan counter “max children reached” sering naik, baru itu alasan buat nambah worker – bukan cuma karena “load tinggi”.

    Setelah ngubah config, tes dulu sebelum reload:

    php-fpm8.2 -t   # atau php-fpm -t sesuai versi
    systemctl reload php8.2-fpm

    Buat yang pengen lebih detail soal perhitungan isi ulang pool-nya, cek artikel tuning PHP-FPM untuk VPS RAM mini – di sana ada contoh yang lebih rinci.

    Nginx Worker Processes

    Buat VPS, worker_processes auto biasanya udah oke. Yang sering salah itu worker_connections dinaikin gak karuan – koneksi itu murah, tapi kalau backend-nya (PHP-FPM) gak kuat, ya percuma. Mulai dari 1024, ukur, baru naikin kalau perlu.

    worker_processes auto;
    worker_connections 1024;
    keepalive_timeout 65;

    Jangan lupa, Nginx yang sehat gak ngebantu kalau PHP-FPM-nya nyerah. Semua request nongkrong di worker PHP, jadi prioritasnya di situ dulu. Kalau mau bahas Nginx lebih dalam, ada panduan optimasi Nginx worker processes.

    MySQL dan MariaDB Sekilas

    Kalau culprit-nya database, urutannya: pastikan index kepake (jalankan EXPLAIN di tiap query lambat), aktifin slow query log, dan jangan over-provision buffer pool kalau RAM terbatas. Slow query log itu sekutu terbaik sampeyan – dia tunjukin persis query mana yang makan waktu, jadi gak perlu nebak-nebak.

    SET GLOBAL slow_query_log = ON;
    SET GLOBAL long_query_time = 2;

    Tuning database lebih dalam itu artikel sendiri, cek tuning MySQL/MariaDB di VPS RAM terbatas.

    Redis dan Cache Lainnya

    Kalau aplikasinya udah pakai Redis buat cache dan masih sering miss, cek eviction policy-nya. Kalau maxmemory kepotong dan policy-nya noeviction, cache bakal sering ke-reset dan request balik ngehantam database – yang ujung-ujungnya makan CPU juga. Buat cache yang gak masalah dibuang, volatile-lru atau allkeys-lru lebih masuk akal. Dan kalau ini WordPress, pasang object cache yang proper – itu investasi kecil tapi dampaknya gede banget ke CPU.

    Langkah 4: Atur Prioritas Proses

    Ada proses yang emang harus jalan, tapi gak harus rebutan CPU sama yang utama. Ini dia alatnya: nice/renice, cpulimit, dan CPUQuota systemd. Pilih yang paling cocok sama situasinya. nice buat yang dari awal dijadwalin, renice buat yang lagi jalan, cpulimit buat batesin cepat, CPUQuota buat yang dikelola systemd.

    renice buat ngubah prioritas proses yang lagi jalan. Semakin tinggi nice value (sampai 19), semakin rendah prioritasnya. Cocok buat proses backup atau batch job yang lagi jalan manual:

    renice -n 10 -p 5231

    cpulimit buat maksain batas CPU. Misal proses konversi gambar makan 100%, kita batasi 50%:

    cpulimit -p 5231 -l 50 --background

    Kalau prosesnya dikelola systemd, cara paling rapi pakai CPUQuota di unit file. Misal mau batasi service tertentu ke maksimal setengah core:

    [Service]
    CPUQuota=50%

    Nah, bagian ini penting. Sebelum reload atau restart service production, ikuti dulu langkah keamanan ini. Config yang mau diubah, backup dulu:

    cp /etc/php/8.2/fpm/pool.d/www.conf /root/backup/www.conf.$(date +%Y%m%d)

    Terus verifikasi config-nya lulus tes syntax, pastiin sampeyan yakin ini service yang bener, baru reload. Reload itu lebih aman daripada restart – gak motong koneksi yang lagi aktif. Restart itu pilihan terakhir, dan bisa bikin downtime singkat.

    systemctl daemon-reload
    systemctl reload nama-service   # kalau service support reload
    systemctl restart nama-service  # pilihan terakhir

    Inget ya: restart gak nyelesain masalah – dia cuma nunda. Kalau config-nya masih salah, pas restart selesai, CPU bakal nendang lagi dalam hitungan menit.

    Langkah 5: Rapikan Jadwal Cron

    Cron overlap itu biang kerok nomor satu yang sering dilupain. Job yang seharusnya 5 menit, ternyata 30 menit, terus 5 menit kemudian jalan lagi – jadinya dua job jalan bareng, rebutan CPU. Solusinya: kasih nice biar gak rebutan, dan pake flock biar job gak jalan dobel.

    0 3 * * * nice -n 15 /usr/local/bin/backup.sh
    */5 * * * * flock -n /tmp/lock-sync.lock /usr/local/bin/sync.sh || echo "masih jalan, skip"

    flock itu kuncinya: kalau job sebelumnya masih jalan, job baru langsung skip dan keluar. Gak numpuk, gak rebutan. Dan jangan lupa, schedule job berat (backup, sync, report) ke jam off-peak – bukan jam 10 pagi pas website lagi rame.

    Langkah 6: Batasi Bot dan Crawler

    Bot itu sering banget jadi biang kerok CPU tinggi – apalagi kalau aplikasi web-nya gak ada cache yang proper. Tiap request bot itu dihitung sebagai satu request PHP yang full process. Coba bayangin seribu request bot dalam satu menit – itu seribu worker cycle yang gak menghasilkan penjualan apa pun.

    Solusinya berlapis. Pertama, pastikan cache-nya ada – object cache Redis, page cache, opcache PHP. Kedua, rate limit di level Nginx buat path yang gak penting. Ketiga, fail2ban buat yang brutal sampai ke-block. Kalau masalahnya WordPress dan gak mau ribet, plugin cache yang proper dulu sebelum mikir yang lain.

    Langkah 7: Pasang Monitoring dan Alert

    Kalau udah bersih, jangan langsung berhenti – pasang monitoring biar pas CPU mulai aneh, kita tahu duluan sebelum client yang lapor. Ini pola yang selalu aku terapkan: fix dulu, baru pasang alarm, biar gak kejadian dua kali.

    Netdata paling gampang buat mulai – install-nya sekali, langsung dapat grafik real-time di browser.

    curl -fsSL https://get.netdata.cloud/kickstart.sh | bash

    Buat yang mau lebih serius, Grafana + Prometheus + node_exporter. Ada panduan lengkapnya di artikel monitoring server dengan Netdata dan Grafana. Yang penting: set alert di threshold CPU 80-90% selama beberapa menit, biar ada waktu buat cek sebelum beneran ambruk.

    dashboard Netdata yang menampilkan grafik penggunaan CPU VPS secara real-time

    Pro Tips dan Warning dari Pengalaman

    • Jangan langsung percaya angka top tanpa konteks – persentase %CPU di top itu rata-rata sejak proses terakhir di-refresh, bukan nilai instan. Refresh interval 2-3 detik biar dapet gambaran yang bener.
    • Kalau VPS provider-mu pake sistem burst CPU (biasanya di paket murah), load tinggi pas jam tertentu bisa jadi throttling, bukan kerjaan aplikasi. Cek ke provider dulu sebelum beli upgrade.
    • Swap itu penyelamat, bukan musuh – tapi kalau VPS-nya dipasang di HDD, swap-thrash bisa keliatan kayak CPU tinggi padahal sebenernya disk yang lemot. Pertimbangkan zram buat yang RAM-nya pas-pasan.
    • Catat baseline sebelum ngubah apa pun: load, response time, uptime. Jadi pas udah tuning, sampeyan bisa ukur apakah ini beneran ngefek dengan angka, bukan perasaan.

    Kalau Semua Sudah Dicoba Tapi Masih Nendang

    Jujur aja, ada batasnya. Kalau workload emang beneran berat – misal kenaikan traffic legit yang konsisten, atau proses batch yang emang rakus – tuning cuma nunda. Saatnya mikirin pilihan ini, urutannya: 1) pindahin proses berat ke queue (Redis + worker terpisah), 2) naikin batas PHP-FPM dengan RAM yang cukup, atau 3) upgrade CPU VPS. Upgrade itu keputusan terakhir, bukan yang pertama. Prioritaskan efisiensi dulu, ukur lagi, baru putuskan. Kadang upgrade 1 core doang udah cukup, dan justru nambah RAM kadang lebih ngefek ke PHP-FPM daripada nambah core.

    Tabel Troubleshooting Cepat

    Gejala Kemungkinan Penyebab Cek Dengan
    Load tinggi, semua core kepake, %us tinggi CPU-bound: PHP-FPM penuh atau query berat ps –sort=-%cpu, SHOW FULL PROCESSLIST
    %wa tinggi, disk sibuk terus I/O bottleneck, bukan CPU iostat -x 1, iotop
    Satu core nendang, sisanya santai Proses single-thread (PHP, script backup) mpstat -P ALL
    Spike di jam yang sama tiap hari Cron overlap atau backup jam sibuk crontab -l, /var/log/cron
    RAM penuh dan swap kepake banyak Worker oversubscribe – masalah memori, bukan CPU free -h, ps rss

    Kalau RAM yang jadi masalah dan VPS-nya gak bisa ditambah, coba liat artikel setup zram di VPS RAM kecil – ini trik yang sering nolong banget buat VPS murah.

    FAQ

    Q: Berapa load average yang dianggap tinggi untuk VPS 2 core?

    Kalau load average konsisten di atas 2 lebih dari 15 menit, VPS 2 core udah kewalahan. Mulai waspada dari 1.5 sampai 2, apalagi kalau bareng persentase us yang naik. Di bawah itu masih normal.

    Q: Naikin pm.max_children PHP-FPM bisa nurunin CPU?

    Bisa, tapi cuma kalau masalahnya kekurangan worker – tandanya di pm.status nilai “max children reached” sering muncul dan idle worker selalu nol. Kalau worker-nya udah banyak dan malah rebutan CPU, naikin malah makin parah. Cek dulu, baru mutusin.

    Q: Apa bedanya CPU-bound sama I/O wait?

    CPU-bound artinya proses lagi ngitung terus – persentase us/sy tinggi. I/O wait (kolom wa di mpstat) artinya CPU-nya nganggur nungguin disk. Treatment-nya beda jauh: yang satu tuning proses dan code, yang satu masalah disk, index, atau query yang nge-scan.

    Q: Apakah cpulimit aman buat production?

    Relatif aman, tapi inget cara kerjanya: cpulimit ngirim SIGSTOP dan SIGCONT secara cepat, yang pada workload sensitif timing bisa ganggu. Buat proses batch yang gak masalah di-stop sekejap (backup, konversi), oke. Buat service yang harus responsif, lebih baik pakai CPUQuota systemd.

    Q: VPS 4 core tapi load tinggi padahal proses dikit, kenapa?

    Kemungkinannya: throttling dari provider (burst CPU habis), proses kernel yang mendominasi (si/sy tinggi), atau neighbor noise – VM lain di host yang sama lagi rame. Cek pola load average-nya dari waktu ke waktu. Kalau curiga throttling, tanya langsung ke provider.

    Author: Syslog Solutions – NOC & Server Management Team. We handle 500+ servers daily, from shared hosting to enterprise dedicated infrastructure.

    Oke, cukup semene dulu ya. Santai aja ngerjainnya – mulai dari diagnosis dulu, gak perlu buru-buru. Bookmark artikel ini buat referensi pas lagi ada trouble, dan kalau pengen nyambung ke topik lain, cek artikel terkait di atas. Mugi bermanfaat, matur nuwun udah baca sampai sini!