Превод на статията “Мащабиране на процесора”
Изрових тук в един от броевете на списание BSD статия за възможността да контролирам честотата на процесора във FreeBSD. Информацията ме прикова и след редица опити в природата реших да преведа статията.
FreeBSD, подобно на много други съвременни Unix операционни системи, предлага възможността да се контролира честотата на процесора, за да се намали консумацията на енергия от процесора и генерирането на топлина (което косвено също намалява консумацията на енергия).
В сравнение с други системи, като Solaris или фамилията Linux, които точно следват дефинираните C- и P-състояния на Intel (C-състояния и P-състояния) на процесора, FreeBSD отива малко по-далеч и позволява на потребителя да зададе произволна честота на процесора, на която този процесор може да работи. Това може да е малко объркващо, но всичко ще стане ясно, след като прочетете следващия параграф.
Нека да видим какви честоти ни препоръчва Intel да използваме в процесора T7300 2 GHz: 800, 1200, 1600, 2000 MHz. Тези "стъпки" от честоти са налични в операционните системи, споменати по-горе, но FreeBSD предлага следния набор от честоти на същия процесор: 150, 300, 450, 600, 750, 900, 1050, 1200, 1400, 1600, 1750, 2000, което означава повече възможности за пестене на енергия и повече гъвкавост при избора желаната честота. В случай на използване на същия процесор Intel E6320, който разбира се поддържа технологията Intel SpeedStep, Solaris или Linux предлагат използването на 1600 или 1866 MHz, докато FreeBSD може да започне от 250 MHz...
АктивиранеДемонът на FreeBSD, наречен powerd(8), който отговаря за контролирането на честотата на процесора, е деактивиран по подразбиране. За да го активирате с други настройки по подразбиране(които са доста добри, между другото), трябва да направите следното: добавете редаpowerd_enable="YES"към файла/etc/rc.confи всъщност стартирайте самия демон:
Проверете далиpowerd(8)наистина работи:
Контролът на скоростта изисква ядрото да бъде компилирано с опциятаcpufreq(която е активирана по подразбиране в ядрото на FreeBSD от версия 7.1-RELEASE) или модулътcpufreqтрябва да бъде зареден, ако ядрото е изградено без тази опция.
Можете да конфигурирате демонаpowerd(8)да превключва между по-високи и по-ниски часовници на процесора в зависимост от текущото натоварване на процесора и ако не сте доволни от праговете на часовника по подразбиране, можете да зададете свои собствени. Това става чрез задаване на подходящи стойности за параметъраpowerd_flagsвъв файла/etc/rc.conf. Вижте страницата на powerd man за подробности.
И така, стартирахме демонаpowerd(8), сега той контролира честотата на нашия процесор. За да видите до каква степенpowerd(8)може да промени честотата на процесора, трябва да изпълните командата:
И, разбира се, можем да изключимpowerd(8)и да зададем желаната честота ръчно, така:
И така, за да обобщим, модулът на ядротоcpufreqни позволява да задаваме честоти на процесора, различни от тези, предоставени от процесора по подразбиране, а демонътpowerd(8)може автоматично да променя честотата на процесора в зависимост от текущото натоварване на процесора, което пести енергия.
Задаване на минималната честотаМожем да зададем минималната честота, която бихме искалиpowerd(8)да използва. За да направите това, трябва да промените стойносттаsysctl параметър, нареченdebug.cpufreq.lowest. Можете също така да напишете промяна на този параметър във файла/boot/loder.conf, така че тази промяна да стане постоянна и да се активира автоматично след рестартиране на системата. Но можете да зададете минималната честота без рестартиране, за това просто трябва да рестартиратеpowerd(8), за да знае, че минималната честота е зададена на различна (вижте списък 1):
Списък 1. Задайте минималната честота.
box# sysctl dev.cpu.0.freq dev.cpu.0.freq: 150 box# sysctl debug.cpufreq.lowest debug.cpufreq.lowest: 0 box# sysctl debug.cpufreq.lowest=450 debug.cpufreq.lowest: 0 -> ; 450 box# /etc/rc.d/powerd restart Спиране на powerd. Стартиране на powerd. box# sysctl dev.cpu.0.freq dev.cpu.0.freq: 450 box#
кутия# cd /usr/src/sys/kern кутия# корекция
--- kern_cpu.c.orig 2008-11-08 13:12:24.000000000 -0500 +++ VER_MODULE(cpufreq, cpu, cpufreq_driver, cpufreq_dc, 0, 0);
static int cf_lowest_freq; +static int cf_highest_freq; статичен int cf_verbose; TUNABLE_INT("debug.cpufreq.lowest", &cf_lowest_freq); +TUNABLE_INT("debug.cpufreq.highest", &cf_highest_freq); TUNABLE_INT("debug.cpufreq.verbose", &cf_verbose); sysctl_NODE(_debug, OID_AUTO, cpufreq, CTLFLAG_RD, NULL, "cpufreq debugging"); sysctl_INT(_debug_cpufreq, OID_AUTO, най-ниско, CTLFLAG_RW, &cf_lowest_freq, 1, "Не предоставяйте нива под тази честота."); +sysctl_INT(_debug_cpufreq, OID_AUTO, най-високо, CTLFLAG_RW, &cf_highest_ freq, 1 , + "Не предоставяйте нива над тази честота."); sysctl_INT(_debug_cpufreq, OID_AUTO, подробен, CTLFLAG_RW, &cf_verbose, 1, "Печатмногословни съобщения за отстраняване на грешки»);
+ /* Отхвърляне на нива, които са над посочения от нас праг. */ + if (cf_highest_freq > 0 && level->total_set.freq > cf_highest_freq) + CF_DEBUG("отхвърляне на честота %d, по-голямо от %d ограничение\n", + level->total_set.freq, cf_highest_freq); + грешка = EINVAL; + излизане; + > + * Ако вече сте на това ниво, просто се върнете */ if (cpufreq_CMP(sc->curr_level.total_set.freq, level->total_set.freq)) CF_DEBUG("пропускане на честота %d, същото като текущото ниво %d\n", @@ -617.8 +629.13 @@ продължи; >
— /* Пропускане на нива, които имат твърде ниска честота. */ - ако (lev->total_set.freq total_set.freq 0 && + lev->total_set.freq > cf_highest_freq)) sc->all_count—; продължение; >
Ако искате да бъдете снежинка (не cpufreq снежинка, можете да го направите отново в опцията в ядре). Не забравяйте да изтеглите Наръчника на FreeBSD. Не изтегляйте приложението cpufreq в sysctl, например debug.cpufreq.highest, Това е първият път, когато виждам бой със снежни топки благодарение на powerd(8). Как в случай с мииучшим място за установяване Ако искате да инсталирате зареждащия файл, имате нужда от файла/boot/loader.conf. Преди да тръгнете, можете да получите най-добрите резултати и най-важните неща, сняг За съжаление можете да изтеглите пакетаdev.cpu.0.freq_levels, вчерашно описание на следните страници:
Ако искате да можете да се докопате до снежинка, не забравяйте да разгледате часовника T7300, който си заслужава цената. Всички измерения на външния прибор за промяна на мощността. Малко по-евтините, малко по-скъпите снежинки сь. Разбира се, процесор вмоментът на измерване беше зареден на 100% от 4 процеса на python, изчисляващи стойността 999999999999 на степен 999999999999 (вижте таблица 1).
Изглежда, че 1200 MHz е най-добрата честота за използване на този тип процесор, по-високите честоти увеличават драстично консумацията на енергия.
Измерих и консумацията на процесора на празен ход, но разликата в консумацията на енергия дори между крайните честоти от 150 Hz и 2000 MHz е твърде малка - около 3 вата, което предполага, че най-важният критерий е консумацията на процесора в режим на максимално натоварване.
Използване на C-състоянияСега знаем как да променим честотата, на която работи процесорът. Време е да научите как да променяте C-състоянията, които определят различни нива на "сън" на процесора (по-точно на неговите ядра), когато той е неактивен за известно време. По-долу има таблица, която изброява всички C-състояния, които са налични за процесора Intel T7300. По-новите версии на платформата Montevina имат дори повече C-състояния, с дори по-дълбоки нива на сън (вижте Таблица 2).
За да разберете кои C-състояния се поддържат и са налични от FreeBSD за вашия тип процесор, изпълнете следната команда:
Вижда се, че в нашия случай FreeBSD поддържа състояния от C0 до C3 и е възможно да се получи/зададе "най-ниското" C-състояние за всяко ядро. Това се прави по следния начин:
Има обаче една тънкост, която трябва да знаете за C-състоянията. Ако поставите процесора в „най-дълбокото“ C-състояние (C3 в примера по-горе), тъчпадът на лаптопа ще се забави малко, преди да може да се използва (закъснението ще бъде приблизително 1 секунда), което може да започне да става много силно с течение на времето.дразня. Решението би било да поставите едно процесорно ядро в състояние, което ще осигури по-ниска латентност за „събуждане“. В този пример това е състояние C2. Всички други ядра могат да бъдат поставени в най-"дълбокото" налично състояние на заспиване, за да се гарантира възможно най-голямото спестяване на енергия.
За да запазите всички тези промени след рестартиране, както обикновено, можете да използвате файла/boot/loader.conf. Можете също да видите статистика за използването на C-състояния със следната команда:
Други опцииМожете също да намалите честотата на таймера на ядрото, като промените опцията sysctl(8) kern.hz от стойността по подразбиране от 1000 на например 100. Но това може да стане само по време на зареждане, така че трябва да добавите редаkern.hz=100към/boot/loader.confи да рестартирате. Предполага се, че стойността на kern.hz от 100 ще стане по подразбиране в бъдеще, но изглежда не виждаме това до 8.0-RELEASE (между другото, в 8.0-RELEASE стойността наkern.hzвсе още е 1000). Друго нещо, което можете да направите, което е много зависимо от процесора, е да монтирате файлови системи с опцията noatime.
И няколко думи за собствениците на процесори AMD. FreeBSD също така поддържа контрол на часовника за тези процесори, използвайки технологията AMD Cool'n'Quiet. Работи точно както е описано за процесорите на Intel в тази статия.
Е, това всъщност е всичко, което се отнася до контрола на честотата на процесора във FreeBSD. Ако използвате FreeBSD на вашия компютър, надявам се тази информация да ви бъде полезна.