Lonjakan penggunaan CPU (Central Processing Unit) hingga 100% adalah salah satu masalah kinerja paling kritis yang dihadapi administrator sistem dan pemilik situs web. Kondisi ini bukan hanya menyebabkan perlambatan signifikan, tetapi juga menghentikan respons server sepenuhnya, berakibat pada down-time yang mahal.
Masalah ini lazim terjadi pada lingkungan hosting web yang didukung oleh PHP (khususnya PHP-FPM, yang digunakan oleh platform seperti WordPress, Laravel, dan Drupal) dan berinteraksi dengan server web (Apache atau Nginx). Lonjakan CPU 100% hampir selalu menunjukkan ketidakseimbangan parah antara volume load yang diterima server dan kemampuan layanan PHP-FPM untuk memprosesnya secara efisien.
Kami akan menyajikan panduan komprehensif untuk mendiagnosis, mengkonfigurasi, dan mengoptimalkan tiga pilar utama—PHP-FPM, Kode PHP, dan Server Web—untuk mencapai stabilitas dan skalabilitas, memastikan CPU Anda tetap bekerja dalam batas yang sehat.
Memahami Akar Masalah Lonjakan CPU pada Lingkungan PHP
Sebelum kita melakukan penyesuaian konfigurasi, kita harus mengidentifikasi penyebab utama mengapa proses PHP dapat melumpuhkan CPU.
1. Proses PHP Berlebihan (Overshooting)
Server web (Nginx/Apache) mungkin mengirimkan terlalu banyak request ke PHP-FPM, melebihi batas yang dapat ditangani oleh hardware (RAM dan CPU). Setiap request memicu proses PHP-FPM yang membutuhkan memori dan siklus CPU. Jika proses ini terlalu banyak, mereka akan bersaing ketat untuk mendapatkan sumber daya.
2. Proses PHP yang Tidak Efisien (Stuck)
Sebuah skrip PHP tunggal dapat menghabiskan waktu CPU yang lama karena:
-
Kueri Database yang Lambat: Permintaan basis data yang tidak diindeks atau terlalu kompleks.
-
Loop Tidak Terbatas atau Rekursi: Skrip yang tersangkut dalam perulangan yang tidak pernah berakhir.
-
Pemrosesan File Berat: Tugas seperti membuat thumbnail gambar, mengompres video, atau memproses laporan besar.
3. Kebocoran Memori (Memory Leaks)
Proses PHP yang berjalan dalam waktu lama dapat perlahan-lahan mengonsumsi lebih banyak memori daripada yang seharusnya (kebocoran memori). Meskipun ini masalah RAM, server yang kehabisan RAM akan mulai menggunakan Swap Space (disk). Operasi swapping yang intensif secara drastis meningkatkan beban I/O, yang secara tidak langsung meningkatkan beban kerja CPU.
Strategi 1: Menguasai Konfigurasi PHP-FPM (FastCGI Process Manager)
PHP-FPM adalah middleware kunci. Mengkonfigurasinya dengan benar adalah langkah terpenting untuk mencegah spikes CPU. File konfigurasi utama biasanya ada di /etc/php-fpm.d/www.conf atau serupa.
A. Menghitung Jumlah Proses Anak yang Optimal
Kami harus menetapkan nilai pm.max_children yang aman. Jika nilai ini terlalu tinggi, server akan kehabisan RAM dan mulai swapping—menyebabkan CPU spike.
Langkah 1: Tentukan RAM Efektif
Kami harus mengukur RAM yang tersedia secara aman untuk dialokasikan ke PHP.
| Variabel | Deskripsi | Contoh Nilai (Server 8GB) |
| A. Total RAM Server | Kapasitas total memori fisik. | 8000 MB |
| B. Penggunaan RAM Sistem | RAM untuk OS, kernel, MySQL/PostgreSQL, Nginx/Apache, dll. | 1000 MB |
| C. RAM Efektif (A – B) | RAM yang aman untuk PHP-FPM. | 7000 MB |
Langkah 2: Tentukan Rata-rata Memori per Proses PHP-FPM
Anda menggunakan perintah ps aux | grep php-fpm atau top/htop untuk menemukan rata-rata memori (Resident Set Size / RSS) yang digunakan satu proses PHP-FPM ketika load sedang. Kami berasumsi satu proses PHP-FPM menggunakan 100 MB untuk aplikasi CMS menengah.
Langkah 3: Hitung Proses Maksimum (pm.max_children)
Proses Maksimum (pm.max_children) = RAM Efektif / Rata-rata Memori per Proses PHP-FPM
RAM Efektif: 7000 MB Rata-rata Memori per Proses PHP-FPM: 100 MB pm.max_children = 7000 MB / 100 MB = 70
Kami menetapkan pm.max_children ke nilai yang konservatif (misalnya, 60 hingga 70), memberikan buffer keamanan.
B. Memilih Manajer Proses (pm) yang Tepat
Parameter pm (Process Manager) mengatur bagaimana PHP-FPM menelurkan (spawn) dan mengelola prosesnya.
| Mode PM | Deskripsi | Rekomendasi CPU Stabil |
| static | Proses anak selalu berjalan. | Hindari: Hanya bagus jika RAM melimpah. Risiko spikes CPU/RAM tinggi. |
| dynamic | Menelurkan proses sesuai kebutuhan hingga batas max_children. |
Direkomendasikan: Terbaik untuk beban kerja yang bervariasi. |
| ondemand | Hanya menelurkan proses ketika request benar-benar tiba, menghentikannya setelah idle. | Bagus untuk low-traffic: Menghemat RAM, tetapi latensi sedikit lebih tinggi. |
Konfigurasi dynamic yang Direkomendasikan:
-
pm = dynamic -
pm.max_children = 70(Berdasarkan perhitungan di atas.) -
pm.start_servers = 15(Jumlah worker yang dimulai saat FPM dimulai. Sekitar 20% darimax_children.) -
pm.min_spare_servers = 10(Minimum worker idle yang dipertahankan.) -
pm.max_spare_servers = 25(Maksimum worker idle yang diizinkan.)
C. Batasi dan Daur Ulang Proses
Untuk mencegah satu proses memonopoli CPU dan untuk mengatasi kebocoran memori, kami harus memberlakukan batasan waktu dan siklus.
-
request_terminate_timeout = 60s: Kami menghentikan skrip PHP yang berjalan lebih dari 60 detik. Ini mencegah proses yang stuck (misalnya, kueri database yang gagal) mengunci worker FPM secara permanen. -
request_slowlog_timeout = 5s: Kami mencatat setiap skrip yang berjalan lebih dari 5 detik. Log ini memberikan diagnosis yang Anda butuhkan untuk memperbaiki kode yang lambat. -
pm.max_requests = 500: Kami mendaur ulang proses anak (mematikannya dan memulai yang baru) setelah proses tersebut melayani 500 request. Hal ini penting untuk membersihkan memori dan mencegah kebocoran memori terakumulasi.
Strategi 2: Mengoptimalkan Kode PHP dan Caching
Proses PHP yang dioptimalkan hanya efektif jika kode PHP itu sendiri efisien. Kami fokus pada kecepatan eksekusi, mengurangi beban CPU per request.
A. Aktifkan OPcache (Akselerator PHP)
OPcache adalah akselerator built-in PHP yang secara signifikan meningkatkan kinerja tanpa membutuhkan perubahan kode.
-
Cara Kerja: OPcache menyimpan bytecode pra-kompilasi skrip PHP di memori bersama server. Kami memastikan PHP tidak perlu membaca dan mengkompilasi ulang kode pada setiap request.
-
Konfigurasi Kritis (di
php.ini):-
opcache.enable=1 -
opcache.memory_consumption=128(atau lebih tinggi, bergantung pada ukuran kode Anda) -
opcache.validate_timestamps=0(Di lingkungan produksi: Kami menghindari pemeriksaan timestamp yang memakan waktu, yang dapat memicu spike CPU kecil.)
-
B. Menerapkan Caching Objek (Redis/Memcached)
Jika Anda menjalankan aplikasi yang menggunakan basis data berulang kali (queries), seperti WordPress atau Magento, object caching sangat penting.
-
Tindakan Aktif: Kami mengimplementasikan Redis atau Memcached. Tool ini menyimpan hasil kueri database yang kompleks dan objek PHP yang sering diakses di RAM server. Kami mengurangi waktu tunggu kueri MySQL, yang berarti proses PHP-FPM selesai lebih cepat, membebaskan CPU.
C. Identifikasi dan Perbaiki Kode yang Lambat (Profiling)
Lonjakan CPU yang berkala sering disebabkan oleh plugin, tema, atau fungsi kustom yang buruk.
-
Tindakan Aktif: Kami menggunakan profiler seperti Xdebug, New Relic, atau Blackfire untuk memetakan secara detail fungsi atau baris kode mana yang menghabiskan sebagian besar waktu CPU. Kami mengatasi masalah performance secara spesifik (misalnya, mengganti kueri
SELECT *dengan kueri yang lebih spesifik).
D. Offload Tugas Berat ke Queue
Tugas yang tidak perlu diselesaikan secara instan (misalnya, mengirim email massal, mengolah data batch, pemrosesan laporan) seharusnya tidak dijalankan oleh web request PHP-FPM.
-
Tindakan Aktif: Kami menggunakan queue (antrian, misalnya, Redis Queue atau Amazon SQS) yang diproses oleh worker latar belakang terpisah (misalnya, Supervisor atau Laravel Horizon). Kami memindahkan beban CPU dari web request yang time-sensitive ke worker yang dapat berjalan pada load terisolasi.
Strategi 3: Konfigurasi Server Web (Nginx dan Apache)
Server web harus bertindak sebagai penjaga gerbang yang melindungi PHP-FPM dari overload. Kami harus memastikan server web tidak menelurkan lebih banyak proses anak daripada yang dapat ditangani oleh PHP-FPM.
A. Nginx: Kinerja Berbasis Event
Nginx unggul dalam kinerja CPU karena model event-driven-nya, memungkinkannya menangani ribuan koneksi dengan sumber daya minimal.
-
Penyesuaian
worker_processes: Kami menetapkanworker_processes auto;di konfigurasi utama. Nginx akan membuat proses worker sebanyak jumlah inti CPU, yang optimal. -
fastcgi_buffer_size: Kami tingkatkan buffer untuk PHP FastCGI. Buffer yang terlalu kecil memaksa Nginx melakukan I/O disk untuk menangani respons PHP yang besar, yang menghabiskan siklus CPU.
B. Apache: Memilih MPM yang Tepat
Jika Anda menggunakan Apache, pemilihan MPM (Multi-Processing Module) sangat penting.
-
MPM
event: Kami merekomendasikaneventkarena jauh lebih efisien dalam hal memori dan CPU daripadapreforkatauworker. Ini menggunakan model threaded yang skalabel. -
MPM
prefork(Jika Terpaksa): Jika Anda terpaksa menggunakanprefork(misalnya, untuk kompatibilitas modul lama), Anda harus membatasiMaxRequestWorkers. Nilai ini harus selalu sinkron (dan tidak melebihi) bataspm.max_childrenPHP-FPM Anda. Jika Apache menelurkan 150 worker tetapi PHP-FPM hanya dapat menangani 70, 80 request akan macet dan menyebabkan timeout.
C. Rate Limiting dan Bot Protection
Terkadang, lonjakan CPU disebabkan oleh bot jahat, web scraper agresif, atau serangan brute force yang membanjiri server dengan request yang tidak berguna.
-
Tindakan Aktif: Kami menerapkan rate limiting di Nginx atau Apache (misalnya, menggunakan modul
ngx_http_limit_req_moduledi Nginx) untuk membatasi jumlah request yang dapat dilakukan satu IP dalam periode waktu tertentu. Kami menggunakan Firewall Aplikasi Web (WAF) seperti Cloudflare atau Sucuri untuk memblokir traffic jahat sebelum mencapai server utama.
Strategi 4: Pemantauan dan Debugging Lanjutan
Konfigurasi optimal adalah proses yang berkelanjutan, bukan set-and-forget. Kami harus memantau dan menyesuaikan konfigurasi sesuai dengan load nyata server.
A. Analisis Saat Terjadi Spike
Ketika CPU mencapai 100%:
-
Gunakan
htopatautop: Anda segera mengidentifikasi proses mana yang menggunakan CPU tertinggi. Apakah ituphp-fpm,mysqld, atauhttpd/nginx? -
Identifikasi Status FPM: Jika
php-fpmadalah pelakunya, Anda memeriksa log slowlog (yang telah Anda aktifkan di Strategi 1) untuk melihat skrip mana yang dieksekusi saat itu. -
Cek Load Average: Kami melihat load average server. Angka yang jauh lebih tinggi dari jumlah inti CPU menunjukkan antrian tugas yang parah.
B. Manfaatkan Log PHP-FPM Slowlog
Slowlog adalah alat diagnosis Anda yang paling kuat. Kami mengkonfigurasinya untuk mencatat setiap skrip yang melebihi waktu eksekusi yang wajar (misalnya, 5 detik).
-
Contoh Keluaran: Slowlog akan menunjukkan trace lengkap dari skrip, termasuk fungsi yang dipanggil dan waktu yang dibutuhkan, memberikan lokasi persis kode yang memerlukan perbaikan.
C. Pengujian Beban (Load Testing)
Kami melakukan stress testing secara berkala (menggunakan alat seperti JMeter, k6, atau Locust) untuk mensimulasikan lalu lintas pengguna.
-
Tujuan: Anda menemukan titik kegagalan (ambang batas di mana CPU mulai spike) dan menguji konfigurasi FPM baru Anda (misalnya, menaikkan atau menurunkan
pm.max_children) dalam kondisi tekanan yang terkontrol.

Kesimpulan: Mencapai Stabilitas Skalabilitas
Mencegah lonjakan CPU 100% pada lingkungan PHP memerlukan pendekatan berlapis dan disiplin teknis. Ini dimulai dengan perhitungan yang hati-hati pada alokasi memori untuk PHP-FPM, diikuti dengan implementasi caching yang agresif, dan diakhiri dengan pemeliharaan kode PHP yang bersih.
Tiga Kunci Utama untuk Stabilitas Jangka Panjang:
-
Konfigurasi Konservatif: Kami selalu menetapkan
pm.max_childrensedikit di bawah batas RAM teoretis Anda untuk mencegah swapping. -
Code Profiling: Anda harus secara aktif mencari dan memperbaiki skrip yang lambat, karena hardware tidak dapat memperbaiki kode yang tidak efisien.
-
Caching Menyeluruh: Kami menggunakan kombinasi OPcache, Object Caching (Redis), dan Page Caching (Varnish/Nginx Cache) untuk meminimalkan request yang mencapai PHP-FPM dan CPU.
Dengan menerapkan strategi ini secara proaktif, Anda membangun server web yang kuat dan skalabel, memastikan CPU Anda tetap berada di zona aman, dan layanan Anda selalu tersedia.
