Processor scaling під FreeBSD, або заощаджуємо мегагерці

Викопав тут на одному з номерів жерла BSD magazine статтю про можливість керувати частотою процесора в FreeBSD. Інформація мене приколола і після низки експериментів на натурі вирішила перевести статтю.

FreeBSD, як і багато інших сучасних ОС сімейства Unix, пропонують можливість керування частотою процесора для зменшення споживаної процесором електроенергії та тепловиділення (що опосередковано також знижує споживання енергії).

У порівнянні з іншими системами, такими як Solaris або сімейство Linux'ів, які точно слідують певними фірмою Intel C- і P-станами (C-states and P-states) процесора, FreeBSD пішла трішки далі, і дає можливість користувачеві встановити будь-яку частоту процесора, на якій цей процесор може працювати. Це може дещо збивати користь, але все стане ясно після прочитання наступного абзацу.

Давайте подивимося, які частоти Intel рекомендує для використання в процесорі T7300 2 ГГц: 800, 1200, 1600, 2000 МГц. Ці «сходинки» частот доступні в згаданих вище операційних системах, але FreeBSD пропонує наступний набір частот на цьому самому процесорі: 150, 300, 450, 600, 750, 900, 1050, 1200, 1400, 1600, 1750, 2 ширші можливості в енергозбереженні та більшу гнучкість при виборі бажаної частоти. У разі використання одного і того ж процесора Intel E6320, який, звичайно ж, підтримує технологію Intel SpeedStep, Solaris або Linux, пропонують використовувати частоту 1600 або 1866 МГц, тоді як FreeBSD може почати з 250 МГц.

Демон FreeBSD, який називається powerd(8), і відповідає за керування частотою процесора, за замовчуванням вимкнено. Щоб увімкнути його при інших налаштуваннях за умовчанням (які досить непогані, до речі), потрібно зробитинаступні дії: додати рядок powerd_enable=«YES» у файл /etc/rc.conf, і, власне, запустити демон:

box# /etc/rc.d/powerd start Starting powerd. box#

Перевіримо, чи дійсно powerd(8) запустився: box# pgrep powerd 893 box#

Для керування частотою потрібно, щоб ядро ​​було скомпільоване із зазначенням опції cpufreq (яка за замовчуванням включена в ядрі FreeBSD, починаючи з версії 7.1-RELEASE), або повинен бути завантажений модуль cpufreq, якщо ядро ​​було зібране без зазначення цієї опції.

Ви можете налаштувати демон powerd(8) перемикатися між більш високою і нижчою частотами процесора, залежно від поточного завантаження процесора, причому якщо вас не влаштовують пороги перемикання частот за умовчанням, ви можете задати свої. Робиться це за допомогою завдання відповідних значень дляpowerd_flagsу файлі /etc/rc.conf. Для отримання докладних відомостей зверніться до сторінки посібникаman powerd.

powerd_fags="-i 85 -r 60 -p 100"

Отже, ми запустили демон powerd(8), тепер він керує частотою нашого процесора. Щоб подивитися, у яких межах powerd(8) може змінювати частоту процесора, потрібно виконати команду:

box# sysctl dev.cpu.0.freq_levels dev.cpu.0.freq_levels: 2000/31000 1750/27125 1600/22000 1400/19250 1200/13000 17 5 600/6500 450/ 4875 300/3250 150/1625 box#

І, звичайно, ми можемо вимкнути powerd(8), і встановити бажану частоту вручну, типу того:

box# /etc/rc.d/powerd stop Stopping powerd. box# sysctl dev.cpu.0.freq=450 dev.cpu.0.freq: 2000 -> 450 box#

Отже, підіб'ємо підсумки: модуль ядра cpufreq дозволяє нам встановлювати інші частоти роботи процесора, а не тільки ті, що передбачені впроцесор за замовчуванням, і демонpowerd(8)може автоматично змінювати частоту процесора в залежності від поточного завантаження CPU, що дозволяє економити енергію.

Встановлюємо мінімальну частоту

Ми можемо встановити мінімальну частоту, яку нам хотілося б, щобpowerd(8)використав. Для цього потрібно змінити значення параметра sysctl, який називаєтьсяdebug.cpufreq.lowest. Також можна прописати зміну цього параметра у файлі/boot/loder.conf, щоб ця зміна стала постійною і автоматично вмикалася після перезавантаження системи. Але можна мінімальну частоту встановити і без перезавантаження, для цього доведеться лише перезапустити powerd(8), щоб він дізнався про те, що мінімальна частота встановлена ​​інша (див. Listing 1):

Listing 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 Stopping powerd. Starting powerd. box# sysctl dev.cpu.0.freq dev.cpu.0.freq: 450 box#

Встановлюємо максимальну частоту

box# cd /usr/src/sys/kern box# patch

Listing 2. Патч, що дозволяє встановити обмеження максимальної частоти.

--- kern_cpu.c.orig 2008-11-08 13:12:24.000000000 -0500 +++ kern_cpu.c 2008-11-08 10:33:18.000000000 -0500 @@ +131,16 @@ DRIVER_MODULE(cpufreq, cpu, cpufreq_driver, cpufreq_dc, 0, 0);

static int cf_lowest_freq; +static int cf_highest_freq; static 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 налагодження"); sysctl_INT(_debug_cpufreq, OID_AUTO, lowest, CTLFLAG_RW, &cf_lowest_freq, 1, "Не надавати рівні нижче цієї частоти."); +sysctl_INT(_debug_cpufreq, OID_AUTO, high, CTLFLAG_RW, &cf_highest_ freq, 1, + "Не надавати рівні вище цієї частоти."); sysctl_INT(_debug_cpufreq, OID_AUTO, verbose, 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 Handbook. Після перезавантаження системи або модуля cpufreq в sysctl з’явиться параметрdebug.cpufreq.highest, який можна використовувати для встановлення максимальної частоти процесора за допомогоюpowerd(8). Як і в разі мінімальної частоти, найбільшим місцем для встановлення значення максимальної частоти,це файл /boot/loader.conf. Після того, як ви встановите максимальну та мінімальну частоти, список доступних частот, які виводяться під час опитування параметраdev.cpu.0.freq_levels, буде обмежений цими значеннями:

box# sysctl dev.cpu.0.freq_levels dev.cpu.0.freq_levels: 1200/13000 1050/11375 900/9750 750/8125 600/6500 box#

У наведеній нижче таблиці можна переглянути таблицю розподілу споживання енергії процесором T7300, залежно від частоти. Усі виміри проведені зовнішнім приладом для вимірювання потужності. Ноутбук працював лише від мережі, споживання під час роботи від батареї не вимірювалося. Звичайно ж, процесор у момент вимірювання був завантажений на 100% чотирма процесами python, що обчислюють значення 999999999999 ступенем 9999999999999 (див. Table 1).

Схоже, що частота 1200 МГц - найкраща для використання на даному типі процесорів, вищі частоти різко збільшують енергоспоживання.

Я також виміряв споживання в режимі простою процесора, але відмінність в енергоспоживання навіть між крайніми частотами 150 Гц і 2000 МГц занадто невелика - близько 3 Вт, з чого випливає, що найважливішим критерієм є споживання процесора в режимі максимального навантаження.

Використовуємо C-стан (C-states)

Тепер ми знаємо, як змінювати частоту, з якою працює процесор. Настав час навчитися змінювати C-стани, які визначають різні рівні «засипання» процесора (точніше, його ядер), коли він якийсь час перебуває у стані простою. Нижче наведена таблиця, в якій перераховані всі стани, які доступні для процесора Intel T7300. Нові версії платформи Montevina мають навіть більше C-станів, з ще більш глибоким ступенем «засинання» (див. Table 2).

Щоб дізнатися, якіЗ-стани підтримуються і доступні з FreeBSD для вашого типу процесора, виконайте таку команду:

box# sysctl dev.cpu.0.cx_supported dev.cpu.0.cx_supported: C1/1 C2/1 C3/57 box# Зрозуміло, що в нашому випадку FreeBSD підтримує стани з C0 до C3, і можна отримати/встановити найнижчий C-стан для кожного ядра. Робиться це так:

box# sysctl dev.cpu.0.cx_lowest dev.cpu.0.cx_lowest: C1 box# sysctl dev.cpu.0.cx_lowest=C3 dev.cpu.0.cx_lowest: C1 - > C3 box# sysctl dev.cpu.1.cx_lowest dev.cpu.1.cx_lowest: C1 box# sysctl dev.cpu.1.cx_lowest=C2 dev.cpu.1. cx_lowest: C1 -> C2 box# Існує, правда, одна тонкість, яку ви повинні знати про C-стан. Якщо ви переведете процесор у найбільш «глибокий» С-стан (у наведеному прикладі це стан C3), тачпад ноутбука злегка пригальмовуватиме, перш ніж його можна буде використовувати (затримка складатиме приблизно 1 секунду), що може з часом почати сильно дратувати . Рішенням буде переведення одного ядра процесора в стан, який забезпечить меншу затримку для прокидання. У цьому прикладі це стан C2. Всі інші ядра можна перевести в стан «найглибшого» сну з доступних станів, щоб забезпечити максимально можливу економію енергії.

Щоб зберегти всі ці зміни і після перезавантаження, як завжди, можна скористатися файлом /boot/loader.conf. Можна також подивитися статистику використання C-станів наступною командою:

box# sysctl dev.cpu.0.cx_usage dev.cpu.0.cx_usage: 0.00% 0.04% 99.95% box# sysctl dev.cpu.1.cx_usage dev.cpu.1.cx_usage : 0.00% 100.00% 0.00% box#

Інші параметри

Можна також зменшити частоту таймера ядра, змінюючипараметр 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 на своєму комп'ютері, сподіваюся, ця інформація виявиться для вас корисною.

А у нас тут можна отримати грант на тестовий період Яндекс.Хмари. Варто лише у полі «секретний пароль» запровадити «Хабр»

Написав гарний текст – отримав запрошення.

У «Пісочниці» діє премодерація: перед публікацією всі матеріали проходять через дбайливе проміння НЛО.

З великою ймовірністю не пройдуть премодерацію: