Як змінити частоту контекстного перемикання Linux?


17

Як можливо змінити частоту контексту комутації Linux (linaro, ubuntu, debian)?

Я гаразд, що торгувати менш чутливою системою за більш ефективну.

EDIT1: У мене є основний процес, який я хочу запустити якомога швидше (максимальні тактові цикли в секунду), тому я подумав зменшити частоту переключення контексту (= збільшення часового відрізка). Питання в тому, як це зробити, і чи матиме це суттєвий ефект. Чи можу я розрахувати вартість контекстного комутатора? Значить, чи можу я оцінити, якщо я збільшить часовий відрізок удвічі, який показник підвищення ефективності буде складати у% для основного процесу, який мене хвилює?


1
Я очікую, що ефект від цього параметра буде мінімальним та релевантним лише у тому випадку, якщо у вас працює більше процесів, ніж ядра CPU. Якщо жодного іншого завдання не чекає конкретний процесор, немає потреби взагалі встановлювати таймер короткого часу перемикання завдань, оскільки все, що могло б зробити іншу задачу запущеною, було б системним викликом або апаратним перериванням, обидва з яких поверне процесор до ядра.
Саймон Ріхтер

Вибачте, що тут давно, але хтось може пояснити, що означає "частота переключення контексту" в контексті цього питання?
користувач1717828

@sourcejedi дивіться мій EDIT1 - чи можу я оцінити поліпшення пропускної здатності у%, коли зменшу частоту контекстного комутатора?
Надав Б

@NadavB Я відповідно відредагував свою відповідь. Конкретні вимірювання найкращі при оптимізації. Не потрібно вважати це чорним полем, наприклад, ви можете використовувати perf для вимірювання пропусків кешу, якщо ваш процесор хороший. AIUI, різні типи пропуску кеш-процесора (включаючи пропуск TLB) є найважливішими індивідуальними витратами на переключення контексту.
sourcejedi

Відповіді:


17

Якщо ваше завдання є єдиним процесом, який вимагає часу на певний процесор, між завданнями не буде контекстних переключень :-). Але процесор все одно може бути перерваний, викликаючи переключення контексту в ядро ​​і назад. І однією з можливих причин є таймер попереднього виходу, перевірка, чи є інше завдання для запуску цього процесора ...

Linux може уникнути генерації будь-якого переривання таймера на процесорі, коли для цього не буде ніяких причин. Див CONFIG_NO_HZ_FULL. Щоб скористатися цією функцією, її потрібно ввімкнути під час побудови ядра, і його потрібно активувати за допомогою параметра завантаження.

За замовчуванням жоден процесор не буде процесором адаптивного тикання. Параметр завантаження "nohz_full =" вказує процесори адаптивних тиків. Наприклад, "nohz_full = 1,6-8" говорить, що процесори 1, 6, 7 і 8 повинні бути процесорами з адаптивним тиком. Зауважте, що вам заборонено позначати всі процесори як адаптивно-галочкові процесори [...]

LWN.net стверджує, що "за даними Інго Молнар, 1% часу процесора буде заощаджено" для процесорів адаптивних кліщів. У документі на ядро ​​сказано, що це має шість різних витрат, а також є список "ЗНАНИХ ПРОБЛЕМ".

Цей коефіцієнт порівняно невеликий, особливо порівняно з потенційним збільшенням пропускної здатності зменшення частоти переключення контексту між декількома завданнями, на яке посилається у цій відповіді: Як змінити тривалість часових відрізків, які використовує планувальник процесорів Linux?

Дрібний шрифт: ці вимірювання попередньо підтримують Spectre, Meltdown, KPTI та x86 ASID :-(. І я думаю, вони також стосуються дещо старшого обладнання. Запитайте експерта з ядра або проведіть свої власні вимірювання того, як коштує переключення контексту змінився у вашій конкретній версії ядра та апаратному забезпеченні ... PTI в основному повинен був бути пом'якшений ASID, за винятком програмного забезпечення, яке дзвонить в ядро ​​дуже часто, головним прикладом є бази даних. Але я не дуже добре розумію цифри .

Надія Моллара в оригінальному патчі RFC полягала в тому, що з часом його ", ймовірно, ввімкнуть більшість дистрибутивів Linux". Я помічаю, що Fedora 28 пропонує ядро ​​за замовчуванням, побудоване з NO_HZ_FULLпідтримкою. Debian 9, однак, не має.


Зовсім недавно Linux v4.17 видаляє залишковийnohz_full галочок таймера 1 Гц із процесорів . Я думаю, що вплив на пропускну здатність досить малий :-), але я намагався стежити за станом NO_HZ_FULLпереваг, коли на процесорі є кілька процесів, які можна виконати -

як тільки ми досягнемо 0 Гц, ми можемо [тоді] видалити припущення періодичної галочки з nr_running> = 2, по суті перериваючи зайняті завдання лише так часто, як вимагає від нас обмежень sched_latency - раз на 4-40 мсек, залежно від nr_running .

Це трохи заплутано, оскільки попереднє вимкнення вже почали використовувати окремий, більш точний галочку ще в v2.6.25-rc1, фіксувати 8f4d37ec073c, "sched: галочка передбачення з високою роздільною здатністю" . Знайдено через цей коментар до тієї ж статті LWN.net: https://lwn.net/Articles/549754/ ).


що з ядром.sched_rr_timeslice_ms?
Надав Б

1
@NadavB, якщо ви використовуєте задачі sched_rr в реальному часі, скажіть так. Це спеціалізована тема. Якщо вас немає, то ні :-).
sourcejedi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.