CPU Frekans Yönetimi: cpufreq ile Güç Tüketimini Optimize Etme
Sunucularda CPU’nun tam hızda çalışması her zaman en iyi seçenek değildir. Bazen bir veritabanı sunucusunda ani bir yük artışında performans düşüşü yaşarsın, bazen de idle duran bir sunucunun elektrik faturasına bakıp “bu kadar mı olması lazım?” diye sorarsın. İşte bu iki uç noktayı dengelemek için Linux’ta CPU frekans yönetimi kritik bir rol oynar. Bu yazıda cpufreq altyapısını, governor’ları, pratik kullanım senaryolarını ve güç tüketimi optimizasyonunu derinlemesine inceleyeceğiz.
CPU Frekans Yönetimine Neden İhtiyaç Var?
Modern işlemciler sabit bir frekansta çalışmaz. Intel’in Turbo Boost, AMD’nin Precision Boost teknolojileri sayesinde işlemciler yük durumuna göre frekanslarını dinamik olarak ayarlayabilir. Linux çekirdeği bu süreci cpufreq alt sistemi üzerinden yönetir.
Bir üretim ortamında karşılaşabileceğin iki temel senaryo var:
Senaryo 1: E-ticaret sitenizin Black Friday günü çöküyor. Ekip incelediğinde performance governor yerine powersave governor’ın aktif olduğunu ve CPU’nun maksimum kapasitesinin yüzde 30’unda çalıştığını görüyorsunuz.
Senaryo 2: 50 adet idle sunucudan oluşan bir cluster’ın aylık elektrik maliyeti bütçeyi zorluyor. CPU’lar gereksiz yere tam hızda çalışıyor, powersave veya ondemand governor ile kolayca yüzde 40 tasarruf sağlanabilir.
Her iki durumda da doğru governor seçimi ve yapılandırması hayat kurtarır.
cpufreq Altyapısını Anlamak
Linux’ta cpufreq sistemi birkaç katmandan oluşur:
- CPUfreq Driver: Donanıma özgü sürücü (intel_pstate, acpi-cpufreq vb.)
- CPUfreq Governor: Frekans ayarlama politikasını belirler
- CPUfreq Core: Driver ve governor arasında köprü görevi görür
- sysfs Interface:
/sys/devices/system/cpu/altında kullanıcı alanına açılan arayüz
Sisteminizin hangi driver’ı kullandığını kontrol etmek için:
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_driver
Çıktı genellikle intel_pstate veya acpi-cpufreq olur. Bu iki driver arasındaki fark önemlidir: intel_pstate doğrudan Intel’in P-state mekanizmasını kullanırken, acpi-cpufreq ACPI tablosundaki frekans noktalarını kullanır.
Mevcut Frekans Bilgilerini Okumak
Sistemdeki mevcut CPU frekans durumunu görmek için:
# Tüm CPU'ların mevcut frekanslarını göster
grep -E "^cpu MHz" /proc/cpuinfo
# veya daha ayrıntılı:
cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq
# cpupower aracıyla daha okunaklı çıktı:
cpupower frequency-info
cpupower aracı Ubuntu/Debian’da linux-tools-common paketinde, RHEL/CentOS’ta ise kernel-tools paketinde bulunur:
# Debian/Ubuntu
apt install linux-tools-common linux-tools-$(uname -r)
# RHEL/CentOS/Rocky Linux
dnf install kernel-tools
Governor Türleri ve Ne Zaman Kullanılır
Governor seçimi, sistem performansını ve güç tüketimini doğrudan etkiler. Mevcut governor’ları listelemek için:
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
Yaygın governor’lar şunlardır:
- performance: CPU’yu her zaman maksimum frekansta çalıştırır. Gecikmeye duyarlı uygulamalar, yüksek trafikli web sunucuları ve gerçek zamanlı işlemler için idealdir.
- powersave: CPU’yu her zaman minimum frekansta çalıştırır. Maksimum enerji tasarrufu sağlar, idle veya düşük yük altındaki sunucular için uygundur.
- ondemand: Yük arttıkça frekansı hızla yükseltir, düşünce azaltır. Çoğu genel amaçlı sunucu için iyi bir denge noktasıdır.
- conservative:
ondemand‘a benzer ancak frekans değişimleri daha yavaş ve kademeli gerçekleşir. Ani yük değişimlerinin az olduğu ortamlarda pil tasarrufu için tercih edilir. - schedutil: Linux 4.7 ile gelen, CPU zamanlayıcısına entegre modern governor. Yük bilgisini doğrudan scheduler’dan alır, gecikme açısından
ondemand‘dan daha iyi sonuçlar verir. - userspace: Frekansı kullanıcı alanından manuel olarak ayarlama imkanı verir. Test ve benchmark senaryoları için kullanılır.
Governor Değiştirme ve Yapılandırma
Tek Bir CPU İçin Governor Değiştirme
# cpu0 için performance governor'ı aktif et
echo "performance" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
# cpupower ile tüm CPU'lar için aynı anda:
cpupower frequency-set -g performance
Kalıcı Governor Yapılandırması
Yeniden başlatmadan sonra da geçerli olması için birkaç yöntem var.
systemd-based sistemler için:
# /etc/default/cpufrequtils dosyasını oluştur veya düzenle
cat > /etc/default/cpufrequtils << 'EOF'
GOVERNOR="performance"
MAX_SPEED=0
MIN_SPEED=0
EOF
# Servisi etkinleştir
systemctl enable cpufrequtils
systemctl start cpufrequtils
tuned profilleri ile (RHEL/Rocky/Alma Linux):
tuned, Red Hat ekosisteminde CPU governor yönetimi için tercih edilen araçtır:
# Mevcut profili gör
tuned-adm active
# Performance profilini etkinleştir
tuned-adm profile throughput-performance
# Latency-sensitive uygulamalar için:
tuned-adm profile latency-performance
# Güç tasarrufu için:
tuned-adm profile powersave
# Tüm mevcut profiller:
tuned-adm list
GRUB parametresi ile:
Bazı durumlarda çekirdek boot parametresi ile governor belirlemek gerekebilir. /etc/default/grub dosyasına:
GRUB_CMDLINE_LINUX="... cpufreq.default_governor=performance"
ekleyip update-grub veya grub2-mkconfig -o /boot/grub2/grub.cfg komutunu çalıştırıyoruz.
Gerçek Dünya: Web Sunucusu Optimizasyonu
Diyelim ki Nginx ile çalışan bir web sunucun var ve yoğun saatlerde p99 latency değerlerin normalden yüksek geliyor. İlk yapılacak kontrol:
# Mevcut governor kontrolü
for cpu in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do
echo "$cpu: $(cat $cpu)"
done
# Çıktı şöyle gözükebilir:
# /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor: ondemand
# /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor: ondemand
ondemand governor düşük yük anlarında frekansı düşürür. Nginx yeni bir istek aldığında CPU frekansı hemen yükselmez, bu da ilk response time’ı olumsuz etkiler. Çözüm:
# Tüm CPU'ları performance moduna al
cpupower frequency-set -g performance
# Değişikliği doğrula
cpupower frequency-info | grep "current policy"
# Nginx'in gerçekten faydalandığını görmek için:
# Öncesi ve sonrası için Apache Benchmark ile test yap
ab -n 10000 -c 100 http://localhost/ 2>&1 | grep -E "Requests per second|Time per request"
intel_pstate ve Özel Durumlar
Intel işlemcilerde intel_pstate driver’ı doğrudan P-state kontrolü sağlar. Bu driver aktifken bazı governor’lar çalışmayabilir.
# intel_pstate durumunu kontrol et
cat /sys/devices/system/cpu/intel_pstate/status
# Çıktı: active, passive veya off
# intel_pstate'i passive moda geçir (acpi-cpufreq'ye düş)
echo passive > /sys/devices/system/cpu/intel_pstate/status
# Turbo Boost durumu:
cat /sys/devices/system/cpu/intel_pstate/no_turbo
# 0 = Turbo açık, 1 = Turbo kapalı
# Turbo Boost'u kapat (ısı yönetimi için bazen gerekli):
echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo
Turbo Boost kapatma ne zaman işe yarar? Özellikle yoğun hesaplama yapan ve termal throttling yaşayan sunucularda, Turbo’yu kapatarak sabit ve öngörülebilir bir performans elde edebilirsin. Veri işleme pipeline’larında tutarsız işlem süreleri bu şekilde düzelir.
Güç Tüketimini İzlemek
Governor değişikliklerinin güç tüketimine etkisini ölçmek için birkaç araç kullanabiliriz:
# powertop ile anlık güç tüketimi (root gerekir)
powertop
# turbostat ile CPU frekans ve güç istatistikleri (Intel)
turbostat --interval 5 --quiet 2>&1 | head -30
# rapl ile CPU enerji okuma (Intel)
# RAPL (Running Average Power Limit) sensörleri
ls /sys/class/powercap/intel-rapl/
# Paket güç tüketimini izle:
cat /sys/class/powercap/intel-rapl/intel-rapl:0/energy_uj
sleep 1
cat /sys/class/powercap/intel-rapl/intel-rapl:0/energy_uj
# İki değer arasındaki fark mikro-joule cinsinden 1 saniyelik tüketimi verir
Basit Güç İzleme Script’i
#!/bin/bash
# cpu_power_monitor.sh - CPU frekans ve güç izleme scripti
INTERVAL=${1:-5}
RAPL_PATH="/sys/class/powercap/intel-rapl/intel-rapl:0/energy_uj"
echo "CPU Frekans ve Güç İzleme - ${INTERVAL}s aralık"
echo "================================================"
while true; do
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
# Ortalama CPU frekansı (MHz)
AVG_FREQ=$(grep "cpu MHz" /proc/cpuinfo | awk '{sum+=$4; count++} END {printf "%.0f", sum/count}')
# Governor
GOV=$(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor)
# CPU kullanımı
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
# RAPL güç (varsa)
if [ -f "$RAPL_PATH" ]; then
E1=$(cat "$RAPL_PATH")
sleep "$INTERVAL"
E2=$(cat "$RAPL_PATH")
POWER_W=$(echo "scale=2; ($E2 - $E1) / 1000000 / $INTERVAL" | bc)
echo "[$TIMESTAMP] Gov: $GOV | Freq: ${AVG_FREQ}MHz | CPU: ${CPU_USAGE}% | Güç: ${POWER_W}W"
else
sleep "$INTERVAL"
echo "[$TIMESTAMP] Gov: $GOV | Freq: ${AVG_FREQ}MHz | CPU: ${CPU_USAGE}%"
fi
done
Bu script’i şöyle çalıştırabilirsin:
chmod +x cpu_power_monitor.sh
./cpu_power_monitor.sh 10 # 10 saniyelik aralıkla izle
BIOS/UEFI Ayarlarının Etkisi
Yazılım tarafında ne yaparsan yap, BIOS ayarları her şeyin üzerindedir. Özellikle dikkat edilmesi gereken noktalar:
- C-States: İşlemcinin derin uyku durumlarına geçme kapasitesi. Latency-sensitive uygulamalarda C-States’i devre dışı bırakmak gecikmeyi azaltır.
/etc/default/grubiçineintel_idle.max_cstate=1veyaprocessor.max_cstate=1eklenebilir. - P-States: BIOS’ta “Maximum Performance” veya “OS Control Mode” seçimi, Linux’un bu değerleri yönetip yönetemeyeceğini belirler.
- Hyper-Threading: HT, çekirdek başına enerji tüketimini artırır. Bazı HPC workload’larında kapatmak toplam performansı artırabilir.
GRUB üzerinden C-State optimizasyonu:
# /etc/default/grub
GRUB_CMDLINE_LINUX="intel_idle.max_cstate=1 processor.max_cstate=1 idle=poll"
# Değişiklikleri uygula
grub2-mkconfig -o /boot/grub2/grub.cfg
# veya Debian/Ubuntu için:
update-grub
schedutil Governor’ını Derinlemesine İncelemek
Yeni kernel versiyonlarında varsayılan olarak gelen schedutil, özellikle karışık workload’larda çok iyi sonuçlar verir. Ancak bazı parametrelerini ayarlamak gerekebilir:
# schedutil'in rate_limit_us parametresi (mikrosaniye cinsinden)
# Ne kadar sık frekans güncellemesi yapılacağını belirler
cat /sys/devices/system/cpu/cpufreq/schedutil/rate_limit_us
# Daha hızlı tepki için değeri düşür (varsayılan genelde 1000-4000 arası)
echo 500 > /sys/devices/system/cpu/cpufreq/schedutil/rate_limit_us
# Mevcut politika ayrıntıları:
cpupower frequency-info
schedutil ile ondemand arasındaki temel fark: ondemand periyodik olarak yük ölçer ve frekansı günceller. schedutil ise her zamanlama kararında (task wakeup, context switch vb.) frekansı anlık olarak ayarlar. Bu, daha az gecikme ve daha doğru frekans yönetimi anlamına gelir.
Kubernetes ve Container Ortamlarında CPU Frekans Yönetimi
Container ortamlarında da host makinenin CPU governor’ı etkilidir. Kubernetes worker node’larında performance governor kullanmak, pod başlatma sürelerini ve anlık yük artışlarına tepkiyi iyileştirir.
Node üzerinde governor durumunu kontrol eden basit bir kontrol script’i:
#!/bin/bash
# k8s_cpu_check.sh - Kubernetes node CPU hazırlık kontrolü
EXPECTED_GOVERNOR="performance"
FAILED=0
echo "=== CPU Governor Kontrolü ==="
for gov_file in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do
cpu=$(echo "$gov_file" | grep -oP 'cpud+')
current=$(cat "$gov_file")
if [ "$current" != "$EXPECTED_GOVERNOR" ]; then
echo "UYARI: $cpu governor'ı '$current' (beklenen: '$EXPECTED_GOVERNOR')"
FAILED=$((FAILED + 1))
fi
done
if [ $FAILED -eq 0 ]; then
echo "OK: Tüm CPU'lar '$EXPECTED_GOVERNOR' modunda"
else
echo "HATA: $FAILED CPU'da yanlış governor yapılandırması!"
exit 1
fi
Bu script’i node provisioning sürecine veya Ansible playbook’una ekleyerek tutarlı bir yapılandırma sağlayabilirsin.
Ansible ile Toplu Governor Yönetimi
Onlarca sunucu üzerinde governor ayarlamak için Ansible çok kullanışlıdır:
# ansible_cpufreq.yml
---
- name: CPU Governor Yapılandırması
hosts: webservers
become: yes
tasks:
- name: kernel-tools kur (RHEL tabanlı)
package:
name: kernel-tools
state: present
when: ansible_os_family == "RedHat"
- name: linux-tools kur (Debian tabanlı)
package:
name: "linux-tools-{{ ansible_kernel }}"
state: present
when: ansible_os_family == "Debian"
- name: Performance governor ayarla
command: cpupower frequency-set -g performance
register: gov_result
- name: Governor değişikliğini doğrula
shell: cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
register: current_gov
changed_when: false
- name: Governor durumunu göster
debug:
msg: "Mevcut governor: {{ current_gov.stdout }}"
Çalıştırmak için:
ansible-playbook -i inventory ansible_cpufreq.yml
Sorun Giderme
“No such file or directory” Hatası
/sys/devices/system/cpu/cpu0/cpufreq/ dizini yoksa, cpufreq alt sistemi aktif değil demektir:
# Yüklü modülleri kontrol et
lsmod | grep cpufreq
# acpi-cpufreq modülünü yükle
modprobe acpi-cpufreq
# intel_pstate kontrolü
dmesg | grep -i "pstate|cpufreq"
Governor Değişmiyor
BIOS’ta “Maximum Performance” modunda kilitleme olabilir:
# Mevcut CPU politikasını kontrol et
cpupower frequency-info
# "The governor X may decide..." satırı varsa governor çalışıyordur
# "driver: intel_pstate" ve "active mode" varsa bazı governor'lar kullanılamaz
# intel_pstate'i passive'e almak gerekebilir:
echo passive > /sys/devices/system/cpu/intel_pstate/status
Turbo Boost Beklenmedik Şekilde Kapanıyor
Termal throttling yaşıyorsan:
# Kernel log'larını kontrol et
dmesg | grep -i "thermal|throttl"
# turbostat ile anlık durum:
turbostat --show Core,CPU,Busy%,Bzy_MHz,TSC_MHz,CoreTmp 2>/dev/null | head -20
# sensors ile sıcaklık:
sensors | grep -i "core|package"
Sonuç
CPU frekans yönetimi, Linux sistem yöneticiliğinin en sık göz ardı edilen ama performans ve maliyet açısından kritik konularından biridir. Doğru governor seçimi;
- Yüksek trafikli web sunucularında response time’ı doğrudan etkiler
- Idle veya düşük yük altındaki sunucularda enerji maliyetini anlamlı ölçüde düşürür
- Termal sorunların önüne geçerek donanım ömrünü uzatır
- Tutarsız benchmark sonuçlarını ortadan kaldırır
Genel önerim: Production web ve uygulama sunucularında performance veya schedutil governor kullan. Batch işleme, CI/CD agent veya düşük öncelikli sunucularda ondemand ya da schedutil yeterlidir. Sadece geliştirme ortamlarında veya maksimum tasarruf gereken altyapı bileşenlerinde powersave tercih et. Her değişikliği turbostat, powertop veya kendi izleme araçlarınla ölçerek doğrula; çünkü her workload ve her donanım farklı davranır.
Bu ayarları Ansible gibi yapılandırma yönetim araçlarıyla otomatize etmek ve node provisioning sürecinin bir parçası haline getirmek, uzun vadede hem güvenilirlik hem de operasyonel verimlilik açısından büyük fark yaratır.
