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

results matching ""

    No results matching ""