Kelaparan Proses dalam Sistem Operasi: Penyebab, Mekanisme, dan Solusi Tingkat Produksi
Kelaparan proses terjadi ketika sebuah proses terus-menerus ditolak waktu CPU, memori, atau bandwidth I/O yang dibutuhkan untuk membuat kemajuan — bukan karena sumber daya tidak ada, tetapi karena kebijakan penjadwalan secara konsisten mengutamakan proses lain. Tidak seperti deadlock, di mana semua proses yang bersaing diblokir, kelaparan memungkinkan sistem tampak berfungsi sambil secara diam-diam menurunkan atau menghentikan beban kerja tertentu.
Perbedaan ini penting secara operasional: proses yang kelaparan tidak menghasilkan kesalahan di tingkat kernel, tidak menghasilkan crash dump, dan mungkin tidak memicu ambang peringatan standar — menjadikannya salah satu patologi kinerja paling berbahaya di lingkungan server multi-tenant dan konkurensi tinggi.
Apa yang Sebenarnya Dimaksud Kelaparan di Tingkat Kernel
Istilah ini dipinjam dari ekologi sumber daya: sebuah proses "kelaparan" ketika terus-menerus kalah bersaing untuk mendapatkan sumber daya yang terbatas. Dalam sistem operasi modern, Linux Completely Fair Scheduler (CFS), antrian prioritas Windows NT, dan penjadwal BSD ULE semuanya mengimplementasikan mekanisme untuk mencegah kelaparan — namun tetap muncul dalam produksi dalam kondisi tertentu.
Di tingkat kernel, kelaparan termanifestasi sebagai proses yang runtime virtualnya (dalam terminologi CFS) atau waktu tunggunya tumbuh tanpa batas tanpa pernah dipilih untuk dieksekusi. Proses tetap dalam status TASK_RUNNING — siap dan memenuhi syarat — tetapi penjadwal tidak pernah memberikannya irisan CPU karena tugas berprioritas lebih tinggi atau lebih sering dapat dijalankan selalu mendahuluinya.
Perbedaan teknis utama:
- Deadlock: Dua atau lebih proses saling diblokir, masing-masing menunggu sumber daya yang dipegang oleh yang lain. Sistem tidak membuat kemajuan sama sekali pada tugas-tugas tersebut.
- Kelaparan: Satu atau lebih proses terus-menerus dilewati oleh penjadwal. Proses lain terus berjalan secara normal.
- Livelock: Proses tidak diblokir tetapi terus-menerus mengubah status sebagai respons satu sama lain tanpa membuat kemajuan nyata.
Penyebab Utama Kelaparan Proses
Memahami kelaparan memerlukan pemeriksaan mekanisme spesifik yang menghasilkannya, bukan hanya mencantumkan "sumber daya terbatas" sebagai penyebab.
1. Inversi Prioritas Statis Tanpa Penuaan
Sebagian besar penjadwal berbasis prioritas menetapkan prioritas tetap atau semi-tetap untuk setiap proses. Jika proses berprioritas rendah selalu didahului oleh aliran tugas berprioritas menengah dan tinggi, proses tersebut tidak pernah dieksekusi. Mode kegagalan kritis di sini adalah ketiadaan penuaan — teknik di mana prioritas efektif suatu proses ditingkatkan secara bertahap semakin lama ia menunggu. Tanpa penuaan, pekerjaan latar belakang berprioritas rendah pada server yang sibuk dapat menunggu tanpa batas.
Di Linux, rentang nilai nice (-20 hingga +19) dan prioritas real-time (SCHED_FIFO, SCHED_RR) menciptakan risiko ini. Proses yang berjalan di bawah SCHED_FIFO dengan prioritas 99 akan mendahului setiap proses SCHED_OTHER pada inti CPU yang sama hingga secara sukarela mengalah atau diblokir.
2. Antrian yang Tidak Adil dalam Penjadwal I/O
Kelaparan CPU terdokumentasi dengan baik, tetapi kelaparan I/O sama-sama merusak dan sering diabaikan. Penjadwal I/O Linux (secara historis CFQ, sekarang BFQ atau mq-deadline tergantung pada versi kernel dan jenis penyimpanan) mengelola urutan permintaan perangkat blok yang dilayani. Di bawah beban kerja penulisan sekuensial yang berat — umum di server database dan aplikasi intensif log — penjadwal I/O dapat menurunkan prioritas permintaan baca acak dari proses lain, secara efektif membuat mereka kelaparan akses disk.
Ini adalah masalah yang sering terjadi di lingkungan VPS Hosting di mana beberapa tenant berbagi infrastruktur penyimpanan yang mendasarinya dan persaingan I/O merupakan masalah operasional nyata.
3. Tekanan Memori dan OOM Killer
Ketika RAM fisik habis, Out-Of-Memory (OOM) killer kernel Linux memilih proses untuk dihentikan berdasarkan oom_score. Meskipun ini secara teknis merupakan penghentian daripada kelaparan, kondisi pendahulunya — di mana proses berulang kali ditukar ke disk dan tidak pernah diberi memori residen yang cukup untuk dieksekusi secara efisien — merupakan kelaparan memori. Proses secara teknis berjalan tetapi membuat kemajuan yang dapat diabaikan karena kesalahan halaman yang konstan dan swap I/O.
4. Persaingan Kunci dan Kelaparan Mutex
Dalam aplikasi multi-thread, kelaparan terjadi di tingkat primitif sinkronisasi. Jika mutex atau semaphore menggunakan kebijakan akuisisi yang tidak adil (last-in-first-out atau pemilihan acak di antara thread yang menunggu), thread tertentu dapat terus-menerus dilewati meskipun kunci sering dilepaskan. Ini berbeda dari penjadwalan tingkat OS dan terjadi sepenuhnya dalam userspace atau subsistem sinkronisasi kernel.
5. Kelaparan Bandwidth Jaringan
Dalam lingkungan yang dikontainerisasi dan divirtualisasi, proses atau kontainer yang mengonsumsi seluruh bandwidth jaringan yang tersedia dapat membuat proses lain kelaparan I/O jaringan. Tanpa pembentukan lalu lintas melalui tc (traffic control) dan cgroups, satu proses yang tidak terkendali dapat memonopoli throughput NIC.
Kelaparan vs. Deadlock vs. Livelock: Perbandingan Teknis
| Properti | Kelaparan | Deadlock | Livelock |
|---|---|---|---|
| Kemajuan sistem | Ya (proses lain berjalan) | Tidak (proses yang diblokir berhenti) | Tampak (tidak ada kemajuan nyata) |
| Status diblokir | Tidak (proses dapat dijalankan) | Ya (proses menunggu sumber daya) | Tidak (proses aktif) |
| Sumber daya dipegang | Tidak | Ya (hold-and-wait melingkar) | Tidak |
| Dapat diselesaikan sendiri | Kadang-kadang (dengan penuaan) | Tidak pernah (memerlukan intervensi) | Jarang |
| Kesulitan deteksi | Tinggi (tidak ada kesalahan eksplisit) | Sedang (deteksi siklus) | Tinggi (tampak sebagai aktivitas) |
| Penyebab utama | Kebijakan penjadwalan yang tidak adil | Ketergantungan sumber daya melingkar | Loop perubahan status reaktif |
| Sinyal kernel Linux | Tidak ada | Tidak ada (soft lockup mungkin terjadi) | Tidak ada |
Cara Penjadwal Modern Mengatasi Kelaparan
Linux Completely Fair Scheduler (CFS)
CFS, yang diperkenalkan di kernel Linux 2.6.23, mengatasi kelaparan dengan melacak runtime virtual (vruntime) untuk setiap proses. Penjadwal selalu memilih proses dengan vruntime terendah — artinya proses yang menerima lebih sedikit waktu CPU secara sistematis diprioritaskan. Desain ini membuat kelaparan CPU murni hampir tidak mungkin terjadi di bawah CFS untuk proses SCHED_OTHER.
Namun, CFS tidak melindungi terhadap kelaparan dari proses real-time. Setiap proses yang dijadwalkan di bawah SCHED_FIFO atau SCHED_RR mendahului semua tugas SCHED_OTHER. Parameter kernel /proc/sys/kernel/sched_rt_runtime_us (default: 950.000 mikrodetik per detik) menyediakan 5% waktu CPU untuk tugas non-real-time khusus untuk mencegah hal ini.
Penuaan Prioritas
Algoritma penuaan klasik menaikkan prioritas efektif suatu proses dengan jumlah tetap untuk setiap siklus penjadwalan yang dihabiskannya dalam menunggu. Setelah prioritas efektif mencapai level tertinggi, proses dijamin untuk dieksekusi. Setelah berjalan, prioritasnya direset ke nilai dasarnya. Ini adalah solusi buku teks untuk kelaparan berbasis prioritas dan diimplementasikan dalam berbagai bentuk di Windows NT, Solaris, dan penjadwal Linux yang lebih lama.
Antrian Adil dan Weighted Fair Queuing (WFQ)
Untuk sumber daya jaringan dan I/O, Weighted Fair Queuing menetapkan setiap aliran atau proses bagian bandwidth yang proporsional dengan bobotnya. Bahkan jika aliran berbobot tinggi menghasilkan lebih banyak lalu lintas, aliran berbobot rendah dijamin tingkat layanan minimum. Linux mengimplementasikan ini melalui disiplin Hierarchical Token Bucket (HTB) dan Stochastic Fair Queuing (SFQ) dalam subsistem tc.
Mendiagnosis Kelaparan di Sistem Linux Produksi
Mengidentifikasi kelaparan memerlukan korelasi beberapa sumber data secara bersamaan.
Analisis Penjadwalan CPU
# Check per-process CPU wait time and scheduling statistics
cat /proc/<PID>/schedstat
# Monitor scheduler latency with perf
perf sched latency --sort max
# Identify processes with high voluntary/involuntary context switches
pidstat -w 1 10
# Check real-time process priorities that may be starving others
ps -eo pid,comm,cls,pri,ni --sort=-pri | head -20Output schedstat memberikan waktu kumulatif yang dihabiskan proses menunggu di antrian run (run_delay dalam nanodetik) — ukuran langsung dari kelaparan penjadwalan.
Indikator Kelaparan Memori
# Check swap activity — high si/so values indicate memory starvation
vmstat 1 10
# Identify processes with high major page fault rates
pidstat -r 1 10
# Check OOM kill history
dmesg | grep -i "oom|killed process"
# Inspect per-process memory pressure
cat /proc/<PID>/status | grep -E "VmRSS|VmSwap|VmPeak"Deteksi Kelaparan I/O
# Per-process I/O wait statistics
iotop -b -n 5
# Block device queue depth and wait times
iostat -x 1 5
# Check I/O scheduler in use for each block device
cat /sys/block/sda/queue/scheduler
# Identify processes blocked on I/O
ps aux | awk '$8 ~ /D/ {print}'Proses dalam status D (tidur tidak dapat diinterupsi) diblokir pada I/O. Populasi proses status D yang persisten adalah indikator kuat kelaparan I/O atau saturasi subsistem penyimpanan.
Solusi Tingkat Produksi dan Strategi Mitigasi
Implementasikan cgroups v2 untuk Isolasi Sumber Daya
Control Groups (cgroups v2) menyediakan mekanisme paling kuat untuk mencegah kelaparan di lingkungan multi-proses dan yang dikontainerisasi. Dengan menetapkan kuota CPU, memori, dan I/O yang eksplisit ke grup proses, Anda menjamin alokasi sumber daya minimum terlepas dari beban sistem.
# Create a cgroup with CPU weight (higher weight = more CPU share)
mkdir /sys/fs/cgroup/my_service
echo "100" > /sys/fs/cgroup/my_service/cpu.weight
# Set memory limit to prevent memory starvation of other groups
echo "2G" > /sys/fs/cgroup/my_service/memory.max
# Assign process to cgroup
echo <PID> > /sys/fs/cgroup/my_service/cgroup.procsBobot CPU dalam cgroups v2 menggunakan rentang 1–10000, di mana defaultnya adalah 100. Grup proses dengan bobot 200 menerima dua kali bagian CPU dari yang berbobot 100 dalam kondisi persaingan.
Sesuaikan Penjadwal Linux untuk Beban Kerja Anda
# Increase scheduler migration cost to reduce cache thrashing (latency-sensitive workloads)
echo 500000 > /proc/sys/kernel/sched_migration_cost_ns
# Reduce scheduler granularity for more frequent preemption (throughput workloads)
echo 1000000 > /proc/sys/kernel/sched_min_granularity_ns
# Ensure real-time tasks cannot starve normal tasks
echo 950000 > /proc/sys/kernel/sched_rt_runtime_usTerapkan Kebijakan Penjadwalan yang Tepat Per Proses
# Set a process to batch scheduling (explicitly low-priority, won't starve interactive tasks)
chrt -b -p 0 <PID>
# Set a CPU-intensive background job to idle scheduling class
chrt -i -p 0 <PID>
# Adjust nice value for a running process
renice -n 10 -p <PID>
# Run a new command with reduced priority
nice -n 15 ./my_background_script.shKelas SCHED_IDLE (chrt -i) adalah alat yang tepat untuk tugas latar belakang yang benar-benar — hanya berjalan ketika tidak ada proses lain yang dapat dijalankan, sepenuhnya menghilangkan kemampuannya untuk membuat beban kerja lain kelaparan.
Pemilihan Penjadwal I/O
# For NVMe SSDs (low-latency, no rotational penalty): use none or mq-deadline
echo "mq-deadline" > /sys/block/nvme0n1/queue/scheduler
# For HDDs with mixed workloads: use bfq for fairness
echo "bfq" > /sys/block/sda/queue/scheduler
# Make persistent across reboots (add to /etc/udev/rules.d/)
echo 'ACTION=="add|change", KERNEL=="sda", ATTR{queue/scheduler}="bfq"'
> /etc/udev/rules.d/60-scheduler.rulesBFQ (Budget Fair Queuing) dirancang khusus untuk mencegah kelaparan I/O dengan menjamin setiap proses bagian bandwidth disk yang proporsional. Ini adalah penjadwal yang direkomendasikan untuk lingkungan shared hosting dan server database.
Kontrol Bandwidth Jaringan dengan tc
# Create a root HTB qdisc on the primary interface
tc qdisc add dev eth0 root handle 1: htb default 30
# Add a parent class with total bandwidth
tc class add dev eth0 parent 1: classid 1:1 htb rate 1gbit
# Add child classes with guaranteed minimums (prevents starvation)
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 100mbit ceil 1gbit
tc class add dev eth0 parent 1:1 classid 1:20 htb rate 100mbit ceil 1gbit
# Add SFQ leaf to each class for per-flow fairness
tc qdisc add dev eth0 parent 1:10 handle 10: sfq perturb 10
tc qdisc add dev eth0 parent 1:20 handle 20: sfq perturb 10Konfigurasi ini menjamin setiap kelas minimum 100 Mbps sambil memungkinkan penggunaan burst hingga kapasitas tautan penuh 1 Gbps ketika bandwidth tersedia.
Overcommit Memori dan Penyetelan Swap
# Reduce swappiness to minimize swap-induced memory starvation
echo 10 > /proc/sys/vm/swappiness
# Enable memory overcommit accounting (prevents OOM from surprising processes)
echo 2 > /proc/sys/vm/overcommit_memory
# Set overcommit ratio (total allocatable = RAM * ratio + swap)
echo 80 > /proc/sys/vm/overcommit_ratioMengatur vm.swappiness=10 menginstruksikan kernel untuk lebih memilih mengklaim kembali cache halaman daripada menukar memori proses, secara signifikan mengurangi kemungkinan kelaparan memori di bawah beban sedang.
Kelaparan di Lingkungan yang Divirtualisasi dan Dikontainerisasi
Pada Dedicated Servers yang menjalankan hypervisor (KVM, VMware ESXi, Hyper-V), kelaparan dapat terjadi di dua lapisan yang berbeda:
Kelaparan tingkat hypervisor: Mesin virtual ditolak siklus CPU oleh penjadwal hypervisor. KVM menggunakan CFS kernel host untuk penjadwalan vCPU, artinya VM dengan bobot berbagi CPU yang lebih rendah dapat dikelaparan oleh VM dengan bobot lebih tinggi dalam kondisi persaingan. DRS (Distributed Resource Scheduler) VMware menggunakan berbagi, reservasi, dan batas untuk mengontrol ini.
Kelaparan tingkat OS tamu: Di dalam VM itu sendiri, dinamika penjadwalan tingkat OS yang sama berlaku. Beban kerja yang dikontainerisasi yang berjalan di bawah Docker atau Kubernetes tanpa batas sumber daya eksplisit dapat memonopoli CPU dan memori OS tamu, membuat kontainer yang berdampingan kelaparan.
Untuk lingkungan Kubernetes, selalu tentukan requests dan limits dalam spesifikasi pod:
resources:
requests:
cpu: "250m"
memory: "512Mi"
limits:
cpu: "1000m"
memory: "1Gi"Nilai requests menentukan penempatan penjadwalan dan bobot berbagi CPU cgroup. Tanpanya, penjadwal Kubernetes tidak memiliki dasar untuk penempatan yang adil, dan runtime kontainer menetapkan bobot default (sama) — yang masih memungkinkan kelaparan jika satu kontainer secara konsisten memenuhi batas CPU-nya.
Kelaparan di Server Database dan Aplikasi
Mesin database mengimplementasikan penjadwal internal mereka sendiri yang independen dari penjadwal OS. PostgreSQL menggunakan model proses-per-koneksi di mana setiap proses backend bersaing untuk sumber daya OS secara normal, tetapi persaingan kunci dalam database (kunci tingkat baris, kunci advisory) dapat menyebabkan kelaparan tingkat aplikasi di mana kueri tertentu menunggu tanpa batas untuk akuisisi kunci.
MySQL/InnoDB menggunakan thread pool dengan batas konkurensi yang dapat dikonfigurasi (innodb_thread_concurrency). Mengatur nilai ini terlalu rendah menyebabkan kelaparan kueri karena thread mengantri menunggu slot eksekusi. Mengaturnya terlalu tinggi menyebabkan thrashing CPU. Nilai awal yang direkomendasikan adalah 2 × number of CPU cores.
Untuk server web, Nginx dan Apache memiliki profil kelaparan yang berbeda. Model berbasis event Nginx secara inheren tahan terhadap kelaparan worker, tetapi kelelahan pool koneksi upstream (misalnya, ke PHP-FPM atau API backend) menciptakan kelaparan tingkat aplikasi. MPM prefork Apache dapat menghabiskan batas MaxRequestWorkers-nya, menyebabkan koneksi baru mengantri tanpa batas — suatu bentuk kelaparan koneksi.
Pertimbangan ini langsung relevan saat mengonfigurasi VPS dengan cPanel untuk beban kerja shared web hosting, di mana beberapa situs bersaing untuk pool worker PHP-FPM dan batas koneksi MySQL.
Infrastruktur Pemantauan untuk Pencegahan Kelaparan
Diagnosis reaktif tidak cukup untuk sistem produksi. Tumpukan pemantauan proaktif harus mencakup:
Metrik Prometheus + Node Exporter yang perlu dipantau:
node_schedstat_waiting_seconds_total— waktu tunggu antrian run CPU kumulatif per CPUnode_vmstat_pgmajfault— kesalahan halaman utama yang mengindikasikan tekanan memorinode_disk_io_time_weighted_seconds_total— saturasi antrian I/Onode_pressure_cpu_waiting_seconds_total— Linux PSI (Pressure Stall Information) tekanan CPUnode_pressure_memory_full_seconds_total— waktu stall penuh PSI memori
Linux PSI (tersedia sejak kernel 4.20) adalah indikator kelaparan paling langsung yang tersedia di kernel. Ini melaporkan persentase waktu tugas terhenti menunggu sumber daya CPU, memori, atau I/O:
# Real-time PSI monitoring
cat /proc/pressure/cpu
cat /proc/pressure/memory
cat /proc/pressure/ioFormat output: some avg10=X.XX avg60=X.XX avg300=X.XX total=NNNN di mana some menunjukkan setidaknya satu tugas terhenti. Nilai di atas 10–15% pada avg60 memerlukan investigasi segera.
Untuk tim yang mengelola VPS Control Panels atau tumpukan server kustom, mengintegrasikan metrik PSI ke dalam dashboard Grafana memberikan peringatan dini sebelum kelaparan menurunkan kinerja yang dihadapi pengguna.
Matriks Keputusan Praktis: Memilih Mekanisme Anti-Kelaparan yang Tepat
| Gejala | Jenis Sumber Daya | Alat yang Direkomendasikan | Target Konfigurasi |
|---|---|---|---|
| Pekerjaan latar belakang tidak pernah selesai | CPU | SCHED_IDLE atau nice +19 | Hilangkan persaingan CPU latar belakang |
| Lonjakan latensi interaktif di bawah beban | CPU | Penyetelan CFS + bobot CPU cgroups v2 | Jamin bagian proses interaktif |
| Kueri database habis waktu | CPU + Kunci | innodb_thread_concurrency, batas waktu kunci | Batasi waktu tunggu kunci |
| Pekerjaan intensif disk memblokir penyajian web | I/O | Penjadwal BFQ + cgroups v2 io.weight | Alokasi I/O proporsional |
| OOM kill kontainer di bawah beban | Memori | cgroups v2 memory.min + vm.swappiness | Jamin memori residen minimum |
| Proses intensif jaringan membuat yang lain kelaparan | Jaringan | HTB + SFQ melalui tc | Jaminan bandwidth per kelas |
| VM dikelaparan oleh hypervisor | vCPU | Reservasi/berbagi CPU hypervisor | Cadangkan siklus vCPU minimum |
Poin Teknis Utama
- Jangan pernah mengandalkan penjadwalan default untuk server beban kerja campuran. Klasifikasikan proses secara eksplisit menggunakan
chrt,nice, dan cgroups v2 berdasarkan sensitivitas latensi dan prioritas bisnis mereka. - Aktifkan pemantauan PSI (
/proc/pressure/*) di semua sistem Linux produksi. Ini adalah indikator kelaparan real-time paling akurat di kernel dan memiliki overhead yang hampir nol. - Gunakan BFQ untuk disk berputar dan perangkat NVMe apa pun yang melayani beban kerja acak/sekuensial campuran di lingkungan multi-tenant. Jaminan keadilan sepadan dengan overhead throughput marginal.
- Tetapkan permintaan sumber daya Kubernetes tanpa pengecualian.
requests.cpuyang tidak ditetapkan bukan berarti "tidak terbatas" — ini adalah kewajiban penjadwalan yang memungkinkan kelaparan CPU tingkat kontainer. - Bedakan kelaparan dari deadlock sebelum melakukan intervensi. Mematikan dan memulai ulang proses yang kelaparan tidak memperbaiki ketidakseimbangan penjadwalan yang mendasarinya; itu hanya menghilangkan gejala sementara.
- Audit penugasan prioritas real-time (
SCHED_FIFO/SCHED_RR) pada sistem apa pun yang menggunakannya. Satu proses real-time yang salah dikonfigurasi dapat membuat semua beban kerja berprioritas normal pada inti CPU kelaparan tanpa batas. - Untuk lingkungan Shared Web Hosting, terapkan kuota CPU dan I/O per akun di tingkat cgroup daripada hanya mengandalkan pembatasan laju tingkat aplikasi.
Pertanyaan yang Sering Diajukan
Apa perbedaan antara kelaparan dan deadlock dalam sistem operasi?
Deadlock terjadi ketika dua atau lebih proses diblokir secara permanen, masing-masing memegang sumber daya yang dibutuhkan yang lain — tidak ada proses yang membuat kemajuan. Kelaparan terjadi ketika sebuah proses terus-menerus dilewati oleh penjadwal meskipun dapat dijalankan; proses lain terus dieksekusi secara normal. Deadlock memerlukan pemutusan ketergantungan melingkar; kelaparan memerlukan perbaikan kebijakan penjadwalan, biasanya dengan mengimplementasikan penuaan atau antrian adil.
Bagaimana penjadwal Linux CFS mencegah kelaparan CPU?
CFS melacak runtime virtual (vruntime) untuk setiap proses dan selalu memilih proses dengan vruntime terendah untuk dieksekusi. Ini memastikan bahwa proses yang menerima lebih sedikit waktu CPU secara sistematis diprioritaskan, membuat kelaparan CPU tanpa batas dari proses SCHED_OTHER hampir tidak mungkin. Namun, proses real-time (SCHED_FIFO, SCHED_RR) melewati CFS sepenuhnya dan masih dapat membuat proses normal kelaparan jika parameter sched_rt_runtime_us tidak diatur dengan benar.
Bagaimana cara mendeteksi apakah sebuah proses sedang kelaparan di server Linux?
Baca /proc/<PID>/schedstat untuk memeriksa waktu tunggu antrian run kumulatif. Pantau /proc/pressure/cpu untuk metrik stall PSI. Gunakan perf sched latency --sort max untuk mengidentifikasi proses dengan latensi penjadwalan yang sangat tinggi. Proses dalam status D persisten yang terlihat dalam output ps aux mengindikasikan kelaparan I/O daripada kelaparan CPU.
Apakah kelaparan proses mempengaruhi lingkungan VPS dan server cloud secara berbeda dari bare metal?
Ya. Pada VPS, kelaparan dapat terjadi di lapisan hypervisor (penjadwal hypervisor menolak waktu vCPU ke VM Anda) dan di dalam OS tamu. Kelaparan tingkat hypervisor tidak terlihat oleh alat pemantauan OS standar dan memerlukan metrik khusus hypervisor atau steal time yang terlihat (%st dalam output top). Steal time tinggi — biasanya di atas 5–10% yang berkelanjutan — menunjukkan hypervisor tidak memberikan siklus vCPU yang berhak diterima VM Anda.
Apa cara tercepat untuk mencegah proses tertentu membuat yang lain kelaparan di server yang sibuk?
Tetapkan ke kelas penjadwalan SCHED_IDLE dengan chrt -i -p 0 <PID>. Kelas ini hanya dieksekusi ketika tidak ada proses lain yang dapat dijalankan, menjamin bahwa proses tersebut tidak dapat membuat beban kerja lain kelaparan. Untuk proses latar belakang yang intensif I/O, tambahkan pengaturan prioritas I/O ke kelas idle: ionice -c 3 -p <PID>. Menggabungkan keduanya menghilangkan proses sebagai sumber kelaparan CPU dan I/O dengan dua perintah dan tanpa perubahan aplikasi.
