Зв'яжіться з нами

info@serverion.com

Зателефонуйте нам

+1 (302) 380 3902

Пояснення PREEMPT_RT: Функції ядра в режимі реального часу

Пояснення PREEMPT_RT: Функції ядра в режимі реального часу

PREEMPT_RT перетворює ядро Linux на операційну систему реального часу, забезпечуючи точний таймінг для критично важливих завдань. Повністю інтегрована в Linux 6.12 (випущену 20 вересня 2024 року), вона забезпечує можливості роботи в реальному часі для таких архітектур, як x86, ARM64 та RISC-V. Ось що вам потрібно знати:

  • Ключові характеристики:
    • Замінює традиційні спін-блокування на витісняючі сплячі блокування.
    • Перетворює обробники переривань на потоки, роблячи їх планованими та такими, що витісняються.
    • Реалізує успадкування пріоритетів для вирішення проблем інверсії пріоритетів.
    • Робить операції RCU (читання-копіювання-оновлення) повністю переважними.
  • Застосування:
    • Використовується в таких галузях, як автомобілебудування, робототехніка, телекомунікації та медичне обладнання, де точний час є критично важливим.
    • Забезпечує роботу таких систем, як засоби промислової автоматизації, системи керування польотами та середовища розміщення, що потребують віртуальні приватні сервери з низькою затримкою.
  • Налаштування:
    • Увімкнути CONFIG_PREEMPT_RT у конфігурації ядра.
    • Точне налаштування параметрів, таких як КОНФІГУРАЦІЯ_НЕ_ПОВНА і CONFIG_RCU_BOOST для оптимальної продуктивності.
    • Використовуйте такі інструменти, як циклічний тест для вимірювання затримки та перевірки продуктивності.

PREEMPT_RT надає пріоритет часу над пропускною здатністю, що робить Linux придатним для застосувань, де терміни не підлягають обговоренню. Це революційний процес для галузей, що вимагають детермінованої продуктивності.

Основні функції PREEMPT_RT: Як Linux досягає продуктивності в режимі реального часу

Основні функції PREEMPT_RT: Як Linux досягає продуктивності в режимі реального часу

Пояснення PREEMPT_RT: Збірка та оптимізація ядра Linux для роботи в режимі реального часу та наднизької затримки

Основні функції PREEMPT_RT

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

Повне вилучення ядра

Одним з найбільших оновлень є перетворення стандартних спін-блокувань (spinlock_t) та блокування для читання та запису (rwlock_t) у сплячі спін-блокування на основі м'ютексів. Традиційні спін-блокування можуть спричиняти затримки, оскільки вони вимикають випередження, змушуючи завдання переходити в режим зайнятого очікування. PREEMPT_RT змінює це, вводячи блокування, які дозволяють завданням переходити в режим сну та випереджати їх, навіть під час утримання ресурсу.

Це означає, що завдання з високим пріоритетом можуть переривати завдання з нижчим пріоритетом, навіть якщо ці завдання утримують блокування. Однак для певних критичних операцій, таких як планувальник або точки входу обладнання, PREEMPT_RT зберігає сирий_спінблок_т, який поводиться як оригінальні неперевантажувальні блокування. Як зазначає Пол МакКенні, видатний інженер:

"Ключовим моментом патчу PREEMPT_RT є мінімізація кількості коду ядра, який не можна витісняти, а також мінімізація кількості коду, який необхідно змінити, щоб забезпечити цю додаткову витісняючу здатність"."

Далі розглянемо, які переваги цей підхід отримала обробка переривань.

Потокові переривання

PREEMPT_RT перемикає більшість апаратних обробників переривань з контексту "жорсткого IRQ" у потоки ядра виконується в контексті процесу. Це налаштування дозволяє пріоритезувати, витісняти або навіть блокувати обробники переривань.

У стандартному ядрі Linux довготривалий обробник переривань може призвести до необмеженої затримки, оскільки він зупиняє всі інші виконання. Потокові переривання вирішують цю проблему. За замовчуванням ці потоки переривань виконуються з SCHED_FIFO пріоритет 50, але адміністратори можуть налаштувати свої пріоритети за допомогою таких інструментів, як chrt. Наприклад, ви можете надати пріоритет перериванням мережевої карти для промислового керування, одночасно знижуючи пріоритет для дискового вводу/виводу. Оскільки ці потоки використовують сплячі спін-блокування замість необроблених спін-блокувань, вони уникають необхідності вимикати апаратні переривання під час утримання блокування.

Тепер давайте розглянемо, як PREEMPT_RT обробляє проблеми, пов'язані з пріоритетами.

Успадкування пріоритетів та Rtmutex

Інверсія пріоритетів є серйозною проблемою, коли завдання з високим пріоритетом зависає в очікуванні ресурсу, що займається завданням з низьким пріоритетом, тоді як завдання із середнім пріоритетом (якому не потрібен ресурс) витісняє завдання з низьким пріоритетом. PREEMPT_RT вирішує цю проблему за допомогою успадкування пріоритету, тимчасово підвищуючи пріоритет завдання з низьким пріоритетом до рівня завдання з найвищим пріоритетом, яке очікує на ресурс.

The rtmutex Примітив — це інструмент, який робить це можливим. Він гарантує, що у разі виникнення конфлікту завдання з низьким пріоритетом отримує підвищення пріоритету для завершення своєї критичної секції без втручання завдань із середнім пріоритетом. Якщо завдання з підвищеним пріоритетом блокується на іншому блокуванні, підвищення пріоритету каскадно поширюється вниз по ланцюжку залежностей. Як пояснюється в документації ядра Linux:

"Успадкування пріоритетів дозволяє добре розробленим застосункам використовувати блокування простору користувача в критичних частинах потоку з високим пріоритетом, не втрачаючи детермінізму."

Щоб досягти цього, rtmutex використовує прапорець та дерево за пріоритетами для керування завданнями очікування, що дозволяє знизити накладні витрати на підтримувані архітектури.

Нарешті, давайте розглянемо, як PREEMPT_RT покращує роботу RCU.

Випереджувальне RCU (читання-копіювання-оновлення)

РКУ

Читання-Копіювання-Оновлення (RCU) – це метод синхронізації, який широко використовується в ядрі Linux. У стандартних ядрах розділи читання RCU не є витісняючими, що може призвести до непередбачуваних затримок. PREEMPT_RT змінює це, змушуючи розділи читання RCU виконуватися. повністю переважний, гарантуючи, що терміни виконання завдань у режимі реального часу не будуть порушені. Це коригування є наріжним каменем досягнення передбачуваної поведінки, необхідної в системах реального часу.

Як налаштувати та використовувати PREEMPT_RT

PREEMPT_RT повністю інтегрований в основні ядра Linux, а це означає, що зовнішні патчі більше не потрібні. Однак застосування останньої черги патчів все ще є гарною ідеєю для кращої підтримки архітектури та покращення графіки. Після того, як ядро буде готове, вам потрібно буде налаштувати його параметри, щоб повною мірою скористатися його можливостями.

Параметри конфігурації ядра

Щоб увімкнути повністю витісняюче ядро, увімкніть CONFIG_PREEMPT_RT. У новіших ядрах цей параметр знаходиться в розділі "Загальні налаштування", але вам може знадобитися його ввімкнути. CONFIG_EXPERT спочатку зробити його видимим у меню конфігурації.

Для виробництва виділені сервери та інших високопродуктивних середовищах, додаткові опції можуть ще більше оптимізувати продуктивність:

  • КОНФІГУРАЦІЯ_НЕ_ПОВНАЗменшує переривання годинника планування на зайнятих процесорах, що допомагає мінімізувати тремтіння.
  • CONFIG_RCU_BOOSTЗапобігає затримці пільгових періодів для зчитувачів RCU з випередженням.
  • CONFIG_RCU_NOCB_CPU: Переносить обробку зворотних викликів RCU на певні процесори, зменшуючи перешкоди для завдань реального часу.

Також важливо вимкнути параметри налагодження, які можуть призвести до високої затримки. Вимкніть такі налаштування, як CONFIG_DEBUG_LOCKDEP, CONFIG_DEBUG_PREEMPT, ОБ'ЄКТИ_НАЛАГОДЖЕННЯ_КОНФІГУРАЦІЇ, і CONFIG_SLUB_DEBUG. Хоча ці інструменти корисні для розробки, вони можуть значно вплинути на цільові показники затримки. Як пояснюється в kernelconfig.io:

""Ця опція перетворює ядро на ядро реального часу, замінюючи різні примітиви блокування (спін-блокування, rw-блокування тощо) варіантами, що усвідомлюють пріоритетне успадкування, що можуть бути витісненими.""

Після того, як ядро зібрано та завантажено, переконайтеся, що PREEMPT_RT активний, виконавши команду cat /sys/kernel/realtime. Повернене значення 1 вказує на успіх. Ви також можете перевірити, перевіривши наявність "PREEMPT_RT" у виводі uname -a.

Налагодження та оптимізація продуктивності

Точне налаштування ядра є важливим для досягнення оптимальної продуктивності з робочими навантаженнями в реальному часі. Однією з ключових областей, яку слід врахувати, є механізм дроселювання в реальному часі, який за замовчуванням резервує 50 мс на секунду для завдань, що не виконуються в реальному часі. Якщо ваше робоче навантаження повністю виконується в реальному часі, ви можете вимкнути цей механізм, написавши -1 до /proc/sys/kernel/sched_rt_runtime_us. Як зазначає Ян Альтенберг, старший консультант з відкритого коду в OSADL:

"Неконтрольоване‘ завдання реального часу може виснажити систему. Як механізм захисту, час виконання завдань реального часу можна обмежити, встановивши значення в мікросекундах у /proc/sys/kernel/sched_rt_runtime_us.’

Для покращеного детермінізму ізолюйте певні ядра процесора за допомогою таких параметрів, як ізолкпус=2,3, rcu_nocbs=2,3, nohz_full=2,3, і встановити спорідненість з іраком=0. Це резервує ці ядра виключно для завдань реального часу.

Для керування потоками переривань використовуйте chrt інструмент. Ці потоки зазвичай виконуються зі значенням за замовчуванням SCHED_FIFO пріоритет 50, але ви можете налаштувати їх, щоб уникнути конфліктів із вашою програмою. Наприклад, щоб встановити пріоритет потоку IRQ мережевої карти 98, скористайтеся командою: chrt -p -f 98.

Після завершення налаштування вкрай важливо протестувати та перевірити продуктивність затримки. Такі інструменти, як циклічний тест може вимірювати затримку (наприклад, циклічний тест -S -m -p98 -i250), поки ртла (Аналіз Linux у реальному часі) допомагає виявляти та аналізувати піки затримки. Ці інструменти гарантують, що ваша система відповідає вимогам програм реального часу.

Застосування та переваги PREEMPT_RT

Випадки використання застосунків реального часу

PREEMPT_RT є найкращим варіантом у системах, де точність синхронізації не підлягає обговоренню. аерокосмічна, це забезпечує роботу навігації та керування польотом без мікросекундних затримок, які в іншому випадку могли б поставити під загрозу безпеку. Телекомунікації Компанії покладаються на нього для керування маршрутизацією даних у режимі реального часу, забезпечуючи безперебійні голосові та відеодзвінки, усуваючи джиттер та піки затримки.

У автомобільна промисловість, це наріжний камінь для систем керування транспортними засобами, і такі великі гравці, як Continental Automotive, підтримують його впровадження. У промислова автоматизація, PREEMPT_RT забезпечує роботу програмованих логічних контролерів (ПЛК) та систем SCADA, часто працюючи разом із протоколами, такими як EtherCAT, для забезпечення безпеки та ефективності на заводських цехах. Робототехніка також значною мірою покладається на цю технологію для точного керування виконавчими механізмами та миттєвого зворотного зв'язку від датчиків, що дозволяє роботам негайно реагувати на зміни навколишнього середовища.

Можливо, найважливішими застосуваннями є медичні вироби, де точність має першорядне значення. Від моніторів пацієнтів до хірургічних роботів, PREEMPT_RT забезпечує детерміністичну продуктивність, необхідну для забезпечення бездоганного функціонування життєво важливих систем.

Переваги для хостингових середовищ

Переваги PREEMPT_RT поширюються і на середовища хостингу, де швидкість реагування в режимі реального часу є такою ж важливою. VPS та виділені сервери, це мінімізує затримку, дозволяючи планувальнику пріоритезувати завдання з високим пріоритетом над менш критичними. Це забезпечує стабільний час відгуку, що безпосередньо впливає на взаємодію з користувачем та надійність сервісу.

Модель потокових переривань запобігає "штормам переривань" від перевантаження систем під час інтенсивних операцій вводу/виводу. rt_mutex, успадкування пріоритетів гарантує, що низькопріоритетні фонові завдання не блокуватимуть критично важливі служби хостингу. Таймери високої роздільної здатності забезпечують точність планування на мікросекундному рівні, зменшуючи тремтіння у віртуалізованих системах. Хостинг-провайдери, такі як Serionion, пропонують власні збірки ядра з PREEMPT_RT, що дає адміністраторам гнучкість для точного налаштування конфігурацій для певних робочих навантажень. Використовуючи такі параметри, як ізолкопус і іркафінність, постачальники можуть виділити ядра процесора для критично важливих для продуктивності завдань, зберігаючи при цьому рутинні системні операції ізольованими.

Висновок

У цьому посібнику детально розглянуто, як PREEMPT_RT перетворює Linux на операційну систему реального часу, надаючи планувальнику майже повний контроль. З моменту включення до основних ядер, починаючи з Linux 6.12 (вересень 2024 року), він усунув потребу в зовнішніх патчах для таких архітектур, як x86, ARM64 та RISC-V.

Концепція проста: максимально скоротити кількість невитісняючого коду. Перетворюючи спін-блокування на сплячі блокування та запускаючи обробники переривань як потоки, завдання з високим пріоритетом можуть витісняти майже всі дії ядра. Такі функції, як успадкування пріоритетів, запобігають затримці критичних операцій завданнями з низьким пріоритетом, тоді як витісняючий RCU гарантує, що навіть критичні розділи на стороні читання не спричиняють значних затримок. Себастьян Севір, розробник PREEMPT_RT, влучно зазначає:

""Весь контроль належить планувальнику.""

Цей технічний стрибок пропонує практичні переваги. Наприклад, Serionion використовує власні збірки ядра PREEMPT_RT для точного налаштування ізоляції процесора та оптимізації робочих навантажень у реальному часі, забезпечуючи стабільний час відгуку навіть за інтенсивного навантаження на ввод-вивод.

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

Завдяки інтеграції в основне ядро та підтримці корпоративних дистрибутивів, таких як Ubuntu Pro (з лютого 2023 року), PREEMPT_RT став доступнішим для хостинг-провайдерів та системних адміністраторів. Він забезпечує надійну продуктивність з низькою затримкою, необхідну для найвимогливіших та чутливих до часу середовищ сьогодні.

поширені запитання

Чи потрібен мені PREEMPT_RT, чи достатньо стандартного Linux?

Стандартне ядро Linux у поєднанні з Патч PREEMPT_RT, отримує можливості роботи в режимі реального часу. Це робить його сильним вибором для програм, де низька затримка та стабільний час відгуку є критично важливими. Однак саме по собі основне ядро Linux може не відповідати суворим вимогам роботи в режимі реального часу.

Чи зменшить PREEMPT_RT загальну пропускну здатність моєї системи?

Щоб досягти продуктивності в режимі реального часу, PREEMPT_RT зосереджений на скороченні невитягуваного коду ядра, що допомагає покращити швидкість реагування системи. Такий підхід може призвести до незначного зниження загальної пропускної здатності, але він забезпечує послідовну та передбачувану поведінку – критично важливо для програм, чутливих до часу. Цей компроміс є навмисним і є центральним для задоволення потреб систем реального часу.

Яка цільова затримка є реалістичною для PREEMPT_RT?

с PREEMPT_RT, Досягнення затримки в мілісекундному діапазоні є реалістичною метою як для настільних, так і для вбудованих систем. Однак фактична продуктивність значною мірою залежить від того, наскільки добре система налаштована та відповідає конкретним вимогам. Правильне налаштування є ключем до забезпечення бажаного рівня швидкості реагування.

Пов’язані публікації в блозі

uk