cpulimit Komutu ile Çalışan Süreçlerin CPU Kullanımını Anlık Olarak Kısıtlama
Bir prodüksiyon sunucusunda beklenmedik bir süreç tüm CPU’yu yutmaya başladığında, o anlık paniği yaşamış herkes bilir: top açıyorsun, %100 görüyorsun, süreci kill etmek istemiyorsun çünkü kritik bir iş yapıyor olabilir, ama öylece bırakmak da olmaz. İşte tam bu noktada cpulimit hayat kurtarıcı bir araç haline geliyor.
cpulimit Nedir ve Ne Zaman Kullanılır?
cpulimit, çalışan bir sürece veya başlatacağınız bir komuta CPU kullanım üst sınırı koymanızı sağlayan, hafif ve son derece pratik bir araçtır. nice ve ionice komutlarından farklı olarak öncelik değiştirmez; süreci gerçek anlamda belirli bir CPU yüzdesiyle sınırlar. Bunu SIGSTOP ve SIGCONT sinyalleri göndererek yapar: süreci durdurup başlatarak zaman dilimleri arasında CPU kullanımını kontrol altında tutar.
Peki hangi senaryolarda işe yarar?
- Gece çalışan backup scriptleri sunucuyu felç ediyorsa
- Bir video dönüştürme işlemi diğer servislerin önüne geçiyorsa
- Geliştirme ortamında bir build süreci CI/CD pipeline’ını bloke ediyorsa
- Paylaşımlı bir sunucuda belirli bir kullanıcının processleri fazla kaynak tüketiyorsa
- Bir web uygulaması aniden CPU spike yapıyorsa ve yeniden başlatmak istemiyorsanız
Önemli bir not: cpulimit gerçek zamanlı çalışır ve sistem çağrısı düzeyinde bir sınırlama yapmaz. Bu yüzden çok kısa süreli spike’ları tam olarak engelleyemeyebilir, ama sürekli yüksek CPU tüketen processleri dizginlemekte oldukça etkilidir.
Kurulum
Çoğu dağıtımda cpulimit standart depolarda yer alır.
# Debian/Ubuntu
sudo apt update && sudo apt install cpulimit
# RHEL/CentOS/Rocky Linux (EPEL gerektirebilir)
sudo dnf install epel-release
sudo dnf install cpulimit
# Fedora
sudo dnf install cpulimit
# Arch Linux
sudo pacman -S cpulimit
Eğer paketi bulamazsanız kaynak koddan derleme seçeneği de var:
git clone https://github.com/opsengine/cpulimit.git
cd cpulimit
make
sudo cp src/cpulimit /usr/local/bin/
Kurulumu doğrulamak için:
cpulimit --version
which cpulimit
Temel Kullanım ve Parametreler
cpulimit kullanımı oldukça sade bir sözdizime sahip. Genel yapısı şu şekilde:
cpulimit [SEÇENEKLER] -- KOMUT [ARGÜMANLAR]
veya mevcut bir process için:
cpulimit -p PID -l YüzdeDegeri
Temel parametrelerin açıklamaları:
-p, –pid: Sınırlamak istediğiniz mevcut bir sürecin PID numarası
-e, –exe: Çalıştırılabilir dosya adıyla süreci belirtir (tam yol veya sadece dosya adı)
-l, –limit: CPU kullanım yüzdesi (0-800 arası, çok çekirdekli sistemlerde her çekirdek için 100 birim)
-b, –background: cpulimit’i arka planda çalıştırır
-i, –include-children: Alt süreçleri de kapsar (fork eden uygulamalar için kritik)
-v, –verbose: Detaylı çıktı verir, ne yaptığını görmek istediğinizde kullanışlıdır
-z, –lazy: Hedef süreç bulunamazsa çıkış yapar, beklemez
-k, –kill: Limit aşıldığında süreci öldürür (dikkatli kullanın)
-s, –signal: Süreç bittiğinde cpulimit’e de sinyal gönderir
Pratik Kullanım Örnekleri
PID ile Mevcut Bir Süreci Kısıtlama
En sık kullanacağınız senaryo bu olacak. Diyelim ki ffmpeg ile bir video dönüştürme işlemi başlattınız ve CPU’nun tamamını yiyor:
# Önce PID'i bulalım
pgrep ffmpeg
# veya
ps aux | grep ffmpeg
# Şimdi %30 ile sınırlayalım
sudo cpulimit -p 18432 -l 30
Bu komutu çalıştırdığınızda terminal o process’i izlemeye devam eder. Arka planda çalıştırmak isterseniz -b flagini ekleyin:
sudo cpulimit -p 18432 -l 30 -b
Yeni Bir Komutu Baştan Kısıtlı Çalıştırma
Eğer süreci başlatmadan önce kısıtlamak istiyorsanız, cpulimit bunu da halleder:
# rsync işlemini %40 CPU ile başlat
cpulimit -l 40 -- rsync -avz /data/backup/ user@remote:/backup/
# Büyük bir arşiv işlemi
cpulimit -l 25 -- tar -czf /backup/sistem.tar.gz /etc /home /var/www
# Python script'i sınırlı çalıştır
cpulimit -l 50 -- python3 /opt/scripts/heavy_analysis.py
Çok Çekirdekli Sistemlerde Kullanım
Bu nokta sıkça karıştırılıyor. Eğer 8 çekirdekli bir sunucunuz varsa, teorik maksimum CPU değeriniz 800’dür (her çekirdek için 100). Bir süreci 2 çekirdeğe denk gelecek şekilde kısıtlamak istiyorsanız:
# 4 çekirdekli sistemde 1 çekirdekle sınırla
cpulimit -p 5421 -l 100
# 8 çekirdekli sistemde 2 çekirdeği geçmesin
cpulimit -p 5421 -l 200
# Toplam CPU kapasitesinin %25'i (8 çekirdekli = 800 toplam, bunun %25'i = 200)
cpulimit -p 5421 -l 200
Pratik bir kontrol olarak sisteminizin çekirdek sayısını şöyle görebilirsiniz:
nproc
# veya
grep -c ^processor /proc/cpuinfo
Alt Süreçleri de Kapsayan Sınırlama
Bazı uygulamalar çalışırken child process’ler oluşturur. Örneğin make komutu paralel derleme yaparken birden fazla süreç başlatır. -i parametresi bu durumda şart:
# Derleme işlemini tüm alt süreçleriyle birlikte kısıtla
cpulimit -l 60 -i -- make -j4
# Bir backup scripti ve oluşturduğu tüm child process'ler
cpulimit -l 40 -i -- /opt/scripts/full_backup.sh
-i olmadan sadece ana process kısıtlanır, fork edilen child’lar serbest kalır. Bunu öğrenmeden önce bir kaç kez “neden çalışmıyor?” diye kafa yorduğumu itiraf edeyim.
Executable Adıyla Kısıtlama
PID aramakla uğraşmak istemiyorsanız ve süreç adını biliyorsanız:
# mysqld sürecini kısıtla
sudo cpulimit -e mysqld -l 70
# nginx worker'larını kısıtla
sudo cpulimit -e nginx -l 80 -b
Dikkat: -e ile kullandığınızda aynı isimde birden fazla process varsa sadece ilkini etkiler.
Gerçek Dünya Senaryoları
Senaryo 1: Gece Yedekleme İşleri
Pek çok sysadmin’in klasik problemi: cron ile çalışan gece yedekleri gündüz mesai saatlerinde de devam ederse veya beklenmedik bir şekilde uzarsa sunucu yanıt vermez hale gelir. Şöyle bir wrapper script yazabilirsiniz:
#!/bin/bash
# /opt/scripts/limited_backup.sh
LOG="/var/log/backup_limited.log"
LIMIT=35 # CPU'nun %35'i
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Yedekleme başlıyor, CPU limiti: %${LIMIT}" >> $LOG
cpulimit -l $LIMIT -i --
rsync -avz --delete
/var/www/html/
backup-server:/mnt/backups/www/
>> $LOG 2>&1
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Yedekleme tamamlandı. Çıkış kodu: $?" >> $LOG
Bu scripti cron’a ekleyebilirsiniz:
# /etc/cron.d/limited-backup
0 2 * * * root /opt/scripts/limited_backup.sh
Senaryo 2: Anlık Müdahale Gereken Durumlar
Prodüksiyon sunucusunda bir uygulama aniden CPU fırtınası yaratmaya başladı. Kill etmek istemiyorsunuz çünkü aktif kullanıcılar var. İşte hızlı müdahale adımları:
# 1. Sorunu tespit et
top -b -n 1 | head -20
# 2. Suçluyu bul
ps aux --sort=-%cpu | head -10
# 3. PID'i al (örneğin java uygulaması)
PROBLEM_PID=$(pgrep -f "java.*myapp" | head -1)
echo "Sorunlu PID: $PROBLEM_PID"
# 4. Anında kısıtla, arka plana al
sudo cpulimit -p $PROBLEM_PID -l 45 -b
# 5. Durumu izle
watch -n 2 'ps -p $PROBLEM_PID -o pid,pcpu,pmem,comm'
Senaryo 3: systemd Servisiyle Birlikte Kullanım
Bir servisi her zaman CPU kısıtlı çalıştırmak istiyorsanız, systemd unit dosyasını düzenlemek daha sağlıklı olur. Ama geçici çözüm olarak ya da systemd kullanmayan bir uygulama için:
#!/bin/bash
# /etc/init.d/benzeri bir wrapper
SERVICE_NAME="data-processor"
SERVICE_CMD="/opt/dataproc/bin/processor --config /etc/processor.conf"
CPU_LIMIT=60
PIDFILE="/var/run/${SERVICE_NAME}.pid"
start() {
echo "Servis başlatılıyor: $SERVICE_NAME"
cpulimit -l $CPU_LIMIT -b -i -- $SERVICE_CMD &
echo $! > $PIDFILE
echo "PID: $(cat $PIDFILE)"
}
stop() {
if [ -f $PIDFILE ]; then
kill $(cat $PIDFILE)
rm -f $PIDFILE
echo "Servis durduruldu."
fi
}
case "$1" in
start) start ;;
stop) stop ;;
*) echo "Kullanım: $0 {start|stop}" ;;
esac
Senaryo 4: Toplu Process Kısıtlama
Bazen aynı uygulamadan birden fazla instance çalışıyor olabilir. Hepsini tek seferde kısıtlamak için küçük bir döngü yeterli:
#!/bin/bash
# Tüm ffmpeg işlemlerini bul ve %20 ile sınırla
LIMIT=20
COUNT=0
for pid in $(pgrep ffmpeg); do
echo "ffmpeg PID $pid kısıtlanıyor..."
cpulimit -p $pid -l $LIMIT -b
COUNT=$((COUNT + 1))
done
echo "Toplam $COUNT adet ffmpeg süreci $LIMIT% ile sınırlandırıldı."
cpulimit’in Sınırlılıkları ve Dikkat Edilmesi Gerekenler
Dürüst olmak gerekirse, cpulimit her derde deva değil. Birkaç önemli kısıtlamasını bilmek gerekir.
SIGSTOP/SIGCONT mekanizması: Bu komut SIGSTOP ve SIGCONT sinyalleri göndererek çalışır. Eğer uygulamanız bu sinyallere karşı özel bir davranış sergiliyorsa (örneğin bazı veritabanı motorları) sorun çıkabilir. Uygulamanın belgelerini kontrol edin.
Kalıcı değildir: Sistem yeniden başladığında veya cpulimit process’i ölürse kısıtlama kalkar. Kalıcı çözüm için cgroups kullanmayı değerlendirin.
Çekirdek yüzdesi karışıklığı: -l parametresi toplam çekirdek sayısıyla orantılıdır. 4 çekirdekli bir sistemde -l 100 demek “tüm sistemin %25’i” demektir, “%100’ü” değil. Bu noktayı ilk kullanışta pek çok kişi atlıyor.
Çok kısa burst’lara etki etmez: Milisaniyeler içinde gerçekleşen CPU spike’larını engelleyemez. Anlık fırtınalar için bu araç yetersiz kalır.
Gerçek zamanlı süreçler için uygun değil: SCHED_FIFO veya SCHED_RR önceliğiyle çalışan gerçek zamanlı süreçleri cpulimit ile kısıtlamaya çalışmak güvenilir sonuç vermez.
cpulimit mi, cgroups mi?
Prodüksiyon ortamında ciddi kaynak yönetimi yapıyorsanız bu soruyu kendinize sormanız gerekir. Kısa bir karşılaştırma:
cpulimit için tercih etmeniz gereken durumlar:
- Anlık, geçici müdahaleler
- Basit kurulum gerektiren durumlar
- Belirli bir komut/script için tek seferlik kısıtlama
- Root yetkisi olmadan da kullanılabilen senaryolar (kendi süreçleriniz için)
cgroups için tercih etmeniz gereken durumlar:
- Kalıcı, servis bazlı kaynak yönetimi
- Bellek, disk I/O ve CPU’yu birlikte kısıtlamak istediğinizde
- Container ortamları (Docker, Podman zaten cgroups kullanır)
- Çok kullanıcılı sistemlerde grup bazlı kısıtlama
Hızlı bir cgroups örneği ile karşılaştırma yapabilmek için:
# systemd ile cgroup üzerinden CPU kısıtlama
sudo systemctl set-property nginx.service CPUQuota=40%
# Anlık kontrol
systemctl show nginx.service | grep CPUQuota
Kalıcı ve güvenilir bir çözüm için cgroups/systemd yolu tercih edilmeli. Ama “şu an, hemen, 5 dakika içinde” dediğinizde cpulimit tartışmasız daha hızlıdır.
cpulimit Çalışırken İzleme
cpulimit aktif olarak çalışırken ne olduğunu gözlemlemek isterseniz:
# Verbose modda çalıştırarak anlık bilgi al
sudo cpulimit -p 1234 -l 30 -v
# Başka bir terminalde htop ile izle
htop -p 1234
# ps ile sürekli izle
watch -n 1 'ps -p 1234 -o pid,pcpu,stat,comm'
# cpulimit'in kendisinin PID'ini de izleyebilirsiniz
ps aux | grep cpulimit
-v (verbose) modu başlangıçta oldukça faydalı; süreci ne zaman durdurduğunu, ne zaman devam ettirdiğini ve anlık CPU yüzdesini ekrana basar. Nasıl çalıştığını anlamak için bunu bir kere kullanmanızı tavsiye ederim.
Sonuç
cpulimit, sysadmin araç çantasında “çok nadiren lazım olur ama o an olmazsa olmaz” kategorisinde yer alan araçlardan biri. Karmaşık bir konfigürasyon gerektirmeden, anlık müdahale gereken durumlarda sisteminizi dengesiz bir sürece karşı korumanızı sağlar.
Uygulamayı kill etmeden frenlemeniz gereken anlarda, gece yedekleme işlerini gündüze taşmadan tutmak istediğinizde, ya da kaynakları adil paylaştırmanız gereken paylaşımlı ortamlarda işinizi görür. Bununla birlikte, kalıcı ve kurumsal düzeyde kaynak yönetimi için cgroups ve systemd’nin sunduğu mekanizmalara geçişi geciktirmeyin.
nice, ionice ve cpulimit üçlüsüne hakim olan bir sysadmin, process yönetimi konusunda pek çok problemi kökten çözebilir. Bu araçları birbirini tamamlar şekilde kullanmak, sunucularınızın kaynaklarını istikrarlı tutmanın en pratik yollarından biridir. Bir sonraki prodüksiyon panik anında, terminale cpulimit -p -l 40 -b yazdığınızda rahat bir nefes alacaksınız.
