CPU Frequency Scaling
Cpu Frequency Scaling katmanı, Linux çekirdeğinin güç tüketimini azaltmak için işlemci çalışma frekansını azaltıp artırmasına imkan verir.
Frekans yönetimini sağlayan conservative, ondemand, userspace, powersave ve performance adında 4 farklı governor (yönetici) opsiyonu bulunmaktadır.
Linux çekirdeği versiyon 3.4 ve yukarısında gerekli modüller otomatik olarak yüklenmekte ve ondemand governor aktif edilmektedir.
Cpufreq Governor
Her bir governor basitçe CPU çalışma frekansının ne olması gerektiğine dinamik olarak karar veren algoritmalar olarak düşünülebilir.
Governor algoritmaları, belirlenen minimum ve maksimum değerler içerisinde kalmak şartıyla, istatistiki olarak seçilen politikaya uygun olarak kararlar vermeye çalışırlar.
Performance Governor
Bu governor sistemden sürekli maksimum performans istendiği durumda kullanılır.
Seçilen çalışma frekansı, scaling_max_freq değerini geçemez.
Powersave Governor
Sistemde güç tüketimini minimuma getirmeye çalışır.
Anlık cpu kullanım isteklerine tepkisi daha yavaş olur.
Seçilen değerler scaling_min_freq ve scaling_max_freq arasında olur.
Güç tüketiminin çok önemli olduğu senaryolarda önerilir.
Ondemand Governor
Bu governorda CPU frekansı ihtiyaç doğrultusunda anlık olarak değiştirilir.
Seçim algoritması cpu kullanımına dair aralıklarla örnekler alır ve bu örneklemi karar mekanizmasında kullanır.
Algoritma, sysfs üzerinden optimize edilebilir.
ondemand/sampling_rate dosyası üzerinden kaç mikrosaniyede bir örnek alınacağı belirtilebilir.
Bunun yanı sıra up_threshold, ignore_nice_load, sampling_down_factor, powersave_bias parametreleriyle algoritmanın karar üretme süreci daha hassas biçimde ayarlanabilir.
Conservative Governor
Ondemand governor'un özelleştirilmiş bir hali olarak düşünülebilir.
Ondemand'dan farklı olarak, Cpu frekansını azaltmak veya artırmak gerektiğinde bu işlemi kademeli olarak yapmaktadır.
freq_step, down_threshold ve sampling_down_factor parametreleriyle algoritmanın davranışında bir takım özelleştirmeler yapmak mümkündür.
Userspace Governor
Bu governor sistemdeki root kullanıcısının CPU frekansını spesifik olarak belirli bir değere ayarlayabilmesini sağlar.
Governor yüklendikten sonra, sysfs üzerinden scaling_setspeed dosyası aracılığıyla istenen çalışma frekansı ayarlanabilir.
Herhangi bir cpu hızını seçmek mümkün değildir. İlgili CPU için kullanılabilecek CPU hız değerleri sysfs üzerinde scaling_available_frequencies dosyasında belirtilmiştir:
$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies
300000 600000 800000 1000000
Aktif Governor Seçimi
Sistemde o anda aktif olan governor scaling_governor dosyası üzerinden öğrenilebilir:
$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
performance
Aktif governor bu dosyaya ilgili governor ismi yazılmak suretiyle değiştirilebilir. Örnek olarak userspace governor kullanmak için:
# echo userspace > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
Örnek Uygulama - 5000 Asal Sayı Bulma
Aşağıdaki örnek uygulamayı prime.c
adıyla kaydedip farklı cpu governor'lar aktif iken test edelim.
/* prime.c */
#include <stdio.h>
int main()
{
int n = 5000;
int i = 3, count, c;
for (count = 2; count <= n;) {
for (c = 2; c <= i - 1; c++) {
if (i % c == 0) {
break;
}
}
if (c == i) {
count++;
}
i++;
}
printf("found %d prime numbers\n", count);
return 0;
}
Uygulamayı şu şekilde derleyebilirsiniz:
$ gcc -o prime prime.c
Ardından sistemdeki farklı cpu governor veya saat frekansları için toplam zamanları time
komutu yardımıyla ölçtüğümüzde aşağıdakine benzer bir sonuç alınmaktadır:
Aktif Governor | İşlem Süresi |
---|---|
Powersave | 15.91 s |
Conservative | 6.84 s |
Ondemand | 5.05 s |
Performance | 4.70 s |
Userspace - 300 Mhz | 15.91 s |
Userspace - 1000 Mhz | 4.70 s |
cpufreq-utils
Frekans değişimi işlemlerini kolaylaştırmak amaçlı cpufreq-utils
paketinden çıkan uygulamalar kullanılabilir.
cpufreq-utils
paketini, http://ftp.sunet.se/pub/Linux/kernel.org/linux/utils/kernel/cpufreq/cpufrequtils.html adresinden indirip derleyebilirsiniz. Paket içerisinden çıkan cpufreq-info
ve cpufreq-set
uygulamaları ile işlemleri kolay bir şekilde gerçekleştirmek mümkündür.
cpufreq-info
$ sudo cpufreq-info
cpufrequtils 008: cpufreq-info (C) Dominik Brodowski 2004-2009
Report errors and bugs to [email protected], please.
analyzing CPU 0:
driver: generic_cpu0
CPUs which run at the same hardware frequency: 0
CPUs which need to have their frequency coordinated by software: 0
maximum transition latency: 300 us.
hardware limits: 300 MHz - 1000 MHz
available frequency steps: 300 MHz, 600 MHz, 800 MHz, 1000 MHz
available cpufreq governors: conservative, ondemand, userspace, powersave, performance
current policy: frequency should be within 300 MHz and 1000 MHz.
The governor "powersave" may decide which speed to use
within this range.
current CPU frequency is 300 MHz (asserted by call to hardware).
cpufreq stats: 300 MHz:nan%, 600 MHz:nan%, 800 MHz:nan%, 1000 MHz:nan%
cpufreq-set
-d
parametresi ile minimum frekans,-u
parametresi ile maksimum frekans,-g
parametresi ile governor seçilir.Minimum 300 Mhz, maksimum 600 Mhz ve ondemand governor seçmek için:
$ sudo cpufreq-set -d 300000 -u 600000 -g ondemand
- userspace governor aktif iken
-f
parametresi ile spesifik bir frekans seçimi yapmak için:
$ sudo cpufreq-set -g userspace
$ sudo cpufreq-set -f 600000