Skontaktuj się z nami

info@serverion.com

Zadzwoń do nas

+1 (302) 380 3902

Wyjaśnienie PREEMPT_RT: funkcje jądra w czasie rzeczywistym

Wyjaśnienie PREEMPT_RT: funkcje jądra w czasie rzeczywistym

PREEMPT_RT przekształca jądro Linuksa w system operacyjny czasu rzeczywistego, zapewniając precyzyjne synchronizowanie krytycznych zadań. W pełni zintegrowany z Linuksem 6.12 (wydanym 20 września 2024 r.), umożliwia obsługę funkcji czasu rzeczywistego w architekturach takich jak x86, ARM64 i RISC-V. Oto, co musisz wiedzieć:

  • Główne cechy:
    • Zastępuje tradycyjne blokady spinlock blokadami uśpionymi z możliwością wywłaszczenia.
    • Konwertuje programy obsługi przerwań na wątki, dzięki czemu można je planować i wywłaszczać.
    • Implementuje dziedziczenie priorytetów w celu rozwiązania problemów związanych z inwersją priorytetów.
    • Umożliwia pełne wywłaszczanie operacji RCU (Odczyt-Kopiowanie-Aktualizacja).
  • Aplikacje:
    • Stosowany w takich gałęziach przemysłu jak motoryzacja, robotyka, telekomunikacja i sprzęt medyczny, w których precyzyjne ustalenie czasu ma kluczowe znaczenie.
    • Systemy zasilania, takie jak narzędzia automatyki przemysłowej, sterowanie lotem i środowiska hostingowe wymagające wirtualne serwery prywatne o niskim opóźnieniu.
  • Organizować coś:
    • Włączać KONFIG_PREEMPT_RT w konfiguracji jądra.
    • Dopasuj ustawienia takie jak KONFIG_NO_HZ_FULL i KONFIGURACJA_RCU_BOOST dla optymalnej wydajności.
    • Użyj narzędzi takich jak cykliczny test do pomiaru opóźnień i sprawdzania wydajności.

PREEMPT_RT priorytetyzuje czas nad przepustowością, dzięki czemu Linux nadaje się do aplikacji, w których terminy nie podlegają negocjacjom. To przełom dla branż wymagających deterministycznej wydajności.

Główne funkcje PREEMPT_RT: Jak Linux osiąga wydajność w czasie rzeczywistym

Główne funkcje PREEMPT_RT: Jak Linux osiąga wydajność w czasie rzeczywistym

Wyjaśnienie PREEMPT_RT: Kompilacja i optymalizacja jądra Linuxa w celu zapewnienia działania w czasie rzeczywistym i bardzo niskich opóźnień

Główne funkcje PREEMPT_RT

PREEMPT_RT koncentruje się na czterech głównych funkcjach, które mają na celu redukcję kodu, którego nie można wywłaszczyć, i poprawę kontroli nad harmonogramowaniem zadań. Przyjrzyjmy się im bliżej.

Pełne wywłaszczenie jądra

Jedną z największych aktualizacji jest transformacja standardowych spinlocków (spinlock_t) i blokady czytelnika-pisarza (rwlock_t) do śpiące spinlocki oparte na mutexach. Tradycyjne spinlocki mogą powodować opóźnienia, ponieważ wyłączają wywłaszczanie, zmuszając zadania do przejścia w stan oczekiwania. PREEMPT_RT zmienia to, wprowadzając blokady, które pozwalają zadaniom na uśpienie i wywłaszczenie, nawet jeśli posiadają zasób.

Oznacza to, że zadania o wysokim priorytecie mogą przerywać zadania o niższym priorytecie, nawet jeśli zadania o niższym priorytecie utrzymują blokady. Jednak w przypadku niektórych krytycznych operacji – takich jak harmonogram lub punkty wejścia sprzętu – PREEMPT_RT zachowuje raw_spinlock_t, który zachowuje się jak oryginalne blokady niewywłaszczalne. Jak ujął to Paul McKenney, wybitny inżynier:

"Kluczem do sukcesu poprawki PREEMPT_RT jest minimalizacja ilości kodu jądra, którego nie można wywłaszczyć, a także minimalizacja ilości kodu, który należy zmienić, aby zapewnić tę dodatkową możliwość wywłaszczenia"."

Zobaczmy teraz, jakie korzyści przynosi to podejście w obsłudze przerwań.

Przerwania wątkowe

PREEMPT_RT przesuwa większość obsługi przerwań sprzętowych z kontekstu "twardego IRQ" do wątki jądra Działa w kontekście procesu. Ta regulacja pozwala na priorytetyzację, wywłaszczanie, a nawet blokowanie procedur obsługi przerwań.

W standardowym jądrze Linuksa długotrwały program obsługi przerwań może prowadzić do nieograniczonych opóźnień, ponieważ zatrzymuje wszystkie inne operacje. Przerwania wątkowe rozwiązują ten problem. Domyślnie te wątki przerwań działają z… SCHED_FIFO priorytet 50, ale administratorzy mogą modyfikować swoje priorytety za pomocą narzędzi takich jak wykres. Na przykład, można nadać priorytet przerwaniu karty sieciowej dla sterowania przemysłowego, jednocześnie obniżając priorytet dla operacji wejścia/wyjścia na dysku. Ponieważ te wątki używają uśpionych blokad spinlock zamiast surowych, unikają konieczności wyłączania przerwań sprzętowych podczas utrzymywania blokady.

Przyjrzyjmy się teraz, w jaki sposób PREEMPT_RT radzi sobie z wyzwaniami związanymi z priorytetami.

Dziedziczenie priorytetowe i Rtmutex

Inwersja priorytetów to poważny problem, w którym zadanie o wysokim priorytecie utknie w oczekiwaniu na zasób zajmowany przez zadanie o niskim priorytecie, podczas gdy zadanie o średnim priorytecie (które nie potrzebuje zasobu) wypiera zadanie o niskim priorytecie. PREEMPT_RT rozwiązuje ten problem za pomocą dziedziczenie priorytetowe, tymczasowo zwiększając priorytet zadania o niskim priorytecie tak, aby odpowiadał priorytetowi zadania o najwyższym priorytecie oczekującego na zasób.

Ten rtmutex Narzędziem, które to umożliwia, jest Primitive. Gwarantuje ono, że w przypadku wystąpienia konfliktu zadanie o niskim priorytecie otrzyma wyższy priorytet, aby dokończyć swoją sekcję krytyczną bez zakłóceń ze strony zadań o średnim priorytecie. Jeśli zadanie o wyższym priorytecie zostanie zablokowane przez inną blokadę, wyższy priorytet zostanie przeniesiony kaskadowo w dół łańcucha zależności. Jak wyjaśnia dokumentacja jądra Linux:

"Dziedziczenie priorytetów pozwala dobrze zaprojektowanym aplikacjom na stosowanie blokad przestrzeni użytkownika w krytycznych częściach wątku o wysokim priorytecie, bez utraty determinizmu"."

Aby to osiągnąć, rtmutex używa flagi i drzewa o uporządkowanych priorytetach do zarządzania oczekującymi zadaniami, utrzymując narzut na niskim poziomie w przypadku obsługiwanych architektur.

Na koniec przyjrzyjmy się w jaki sposób PREEMPT_RT usprawnia działanie RCU.

Wywłaszczalna RCU (Odczyt-Kopiowanie-Aktualizacja)

RCU

RCU (Read-Copy-Update) to technika synchronizacji szeroko stosowana w jądrze Linuksa. W standardowych jądrach sekcje odczytu RCU nie podlegają wywłaszczeniu, co może prowadzić do nieprzewidywalnych opóźnień. PREEMPT_RT zmienia to, umożliwiając odczyt sekcji RCU. w pełni wywłaszczalny, zapewniając, że terminy realizacji zadań w czasie rzeczywistym nie zostaną naruszone. Ta korekta jest podstawą osiągnięcia przewidywalnego zachowania wymaganego w systemach czasu rzeczywistego.

Jak skonfigurować i używać PREEMPT_RT

Funkcja PREEMPT_RT jest w pełni zintegrowana z głównymi jądrami Linuksa, co oznacza, że zewnętrzne poprawki nie są już potrzebne. Jednak zastosowanie najnowszej kolejki poprawek to nadal dobry pomysł, aby zapewnić lepszą obsługę architektury i lepszą grafikę. Gdy jądro będzie gotowe, należy dostosować jego ustawienia, aby w pełni wykorzystać jego możliwości.

Ustawienia konfiguracji jądra

Aby włączyć w pełni wywłaszczalne jądro, włącz KONFIG_PREEMPT_RT. W nowszych jądrach to ustawienie znajduje się w sekcji "Ustawienia ogólne", ale może być konieczne jego włączenie KONFIG_EKSPERT najpierw należy uczynić ją widoczną w menu konfiguracji.

Do produkcji dedykowane serwery i innych środowiskach o wysokiej wydajności dostępne są dodatkowe opcje, które pozwalają na dalszą optymalizację wydajności:

  • KONFIG_NO_HZ_FULL:Zmniejsza przerwania zegara harmonogramu w przypadku obciążonych procesorów, co pomaga zminimalizować drgania.
  • KONFIGURACJA_RCU_BOOST: Zapobiega opóźnianiu okresów karencji przez wywłaszczone czytniki RCU.
  • KONFIGURACJA_RCU_NOCB_CPU:Przenosi obsługę wywołań zwrotnych RCU na określone procesory, zmniejszając zakłócenia w zadaniach wykonywanych w czasie rzeczywistym.

Ważne jest również wyłączenie opcji debugowania, które mogą powodować duże opóźnienia. Wyłącz ustawienia takie jak KONFIG_DEBUG_LOCKDEP, KONFIG_DEBUG_PREEMPT, KONFIGURACJA_OBIEKTÓW_DEBUGOWANIA, I KONFIGURACJA_SLUB_DEBUG. Chociaż narzędzia te są przydatne w programowaniu, mogą znacząco obniżyć opóźnienia docelowe. Jak wyjaśnia kernelconfig.io:

"Ta opcja przekształca jądro w jądro czasu rzeczywistego poprzez zastąpienie różnych prymitywów blokujących (spinlocków, rwlocków itp.) wariantami uwzględniającymi dziedziczenie priorytetów i umożliwiającymi wywłaszczanie."

Po skompilowaniu i uruchomieniu jądra należy sprawdzić, czy PREEMPT_RT jest aktywny, uruchamiając kot /sys/kernel/realtime. Wartość zwracana 1 oznacza powodzenie. Możesz to również sprawdzić, sprawdzając "PREEMPT_RT" w wynikach uname -a.

Debugowanie i optymalizacja wydajności

Dopracowanie jądra jest niezbędne do osiągnięcia optymalnej wydajności w przypadku obciążeń w czasie rzeczywistym. Jednym z kluczowych obszarów, które należy uwzględnić, jest mechanizm ograniczania przepustowości w czasie rzeczywistym, który domyślnie rezerwuje 50 ms na sekundę na zadania niedziałające w czasie rzeczywistym. Jeśli Twoje obciążenie jest w pełni oparte na czasie rzeczywistym, możesz wyłączyć ten mechanizm, pisząc -1 do /proc/sys/kernel/sched_rt_runtime_us. Jak zauważa Jan Altenberg, starszy konsultant ds. oprogramowania typu open source w OSADL:

"Niekontrolowane‘ zadanie w czasie rzeczywistym może spowodować całkowite zamrożenie systemu. W ramach mechanizmu ochronnego czas wykonywania zadań w czasie rzeczywistym można ograniczyć, ustawiając wartość w mikrosekundach w pliku /proc/sys/kernel/sched_rt_runtime_us.’

Aby zwiększyć determinizm, wyizoluj określone rdzenie procesora, korzystając z parametrów takich jak isolcpus=2,3, rcu_nocbs=2,3, nohz_full=2,3, i ustaw irqaffinity=0. Dzięki temu rdzenie te są zarezerwowane wyłącznie do zadań w czasie rzeczywistym.

Aby zarządzać wątkami przerwań, użyj wykres narzędzie. Te wątki zazwyczaj działają z domyślnym SCHED_FIFO Priorytet 50, ale możesz go dostosować, aby uniknąć konfliktów z aplikacją. Na przykład, aby ustawić wątek IRQ karty sieciowej na priorytet 98, użyj polecenia: chrt -p -f 98.

Po zakończeniu konfiguracji kluczowe jest przetestowanie i sprawdzenie wydajności opóźnienia. Narzędzia takie jak cykliczny test może mierzyć opóźnienie (np., cykliczny test -S -m -p98 -i250), chwila rtla (Analiza Linuksa w czasie rzeczywistym) pomaga identyfikować i analizować skoki opóźnień. Te narzędzia gwarantują, że Twoja konfiguracja spełnia wymagania aplikacji działających w czasie rzeczywistym.

Zastosowania i korzyści PREEMPT_RT

Przykłady zastosowań aplikacji w czasie rzeczywistym

PREEMPT_RT sprawdza się w systemach, w których precyzja pomiaru czasu jest nie do negocjacji. lotnictwo i kosmonautyka, zapewnia działanie nawigacji i sterowania lotem bez mikrosekundowych opóźnień, które mogłyby zagrozić bezpieczeństwu. Telekomunikacja Firmy liczą na nią w zakresie zarządzania routingiem danych w czasie rzeczywistym, co zapewnia płynność połączeń głosowych i wideo poprzez eliminację drgań i skoków opóźnień.

W przemysł motoryzacyjny, jest to kamień węgielny dla systemów sterowania pojazdami, a jego wdrożenie wspierają główni gracze, tacy jak Continental Automotive. automatyka przemysłowa, PREEMPT_RT obsługuje sterowniki PLC i systemy SCADA, często współpracując z protokołami takimi jak EtherCAT w celu utrzymania bezpieczeństwa i wydajności w halach fabrycznych. Robotyka Technologia ta w dużym stopniu opiera się na precyzyjnym sterowaniu siłownikami i natychmiastowym sprzężeniu zwrotnym z czujników, co pozwala robotom na natychmiastową reakcję na zmiany w otoczeniu.

Być może najbardziej krytyczne zastosowania znajdują się w urządzenia medyczne, gdzie precyzja jest najważniejsza. Od monitorów pacjenta po roboty chirurgiczne, PREEMPT_RT zapewnia deterministyczną wydajność niezbędną do zapewnienia bezbłędnego funkcjonowania systemów o znaczeniu krytycznym.

Korzyści dla środowisk hostingowych

Zalety PREEMPT_RT rozciągają się na środowiska hostingowe, w których responsywność w czasie rzeczywistym jest równie istotna. Serwery VPS i dedykowane, Minimalizuje opóźnienia, umożliwiając harmonogramowi nadawanie priorytetu zadaniom o wysokim priorytecie w stosunku do zadań mniej krytycznych. Zapewnia to spójny czas reakcji, co bezpośrednio wpływa na komfort użytkownika i niezawodność usługi.

Model przerwań wątkowych zapobiega "burzom przerwań" przytłaczającym systemy podczas intensywnych operacji wejścia/wyjścia. rt_mutex, Dziedziczenie priorytetów gwarantuje, że zadania w tle o niskim priorytecie nie blokują krytycznych usług hostingowych. Timery o wysokiej rozdzielczości umożliwiają precyzję planowania na poziomie mikrosekund, redukując wahania w konfiguracjach zwirtualizowanych. Dostawcy hostingu, tacy jak Serverion, oferują niestandardowe kompilacje jądra z PREEMPT_RT, dając administratorom elastyczność w dostosowywaniu konfiguracji do konkretnych obciążeń. Używając parametrów takich jak izolcpus i powinowactwo irqaffinity, Dostawcy mogą przeznaczyć rdzenie procesora do zadań o krytycznym znaczeniu dla wydajności, zachowując jednocześnie izolację rutynowych operacji systemowych.

Wniosek

W tym przewodniku zagłębiliśmy się w to, jak PREEMPT_RT Przekształca Linuksa w system operacyjny czasu rzeczywistego, dając harmonogramowi niemal pełną kontrolę. Od momentu dodania go do jąder Linuksa od wersji 6.12 (wrzesień 2024 r.) wyeliminował on potrzebę stosowania zewnętrznych poprawek w architekturach takich jak x86, ARM64 i RISC-V.

Koncepcja jest prosta: maksymalnie ograniczyć kod, którego nie można wywłaszczyć. Konwertując blokady spinlock na blokady uśpione i uruchamiając procedury obsługi przerwań jako wątki, zadania o wysokim priorytecie mogą wywłaszczać niemal wszystkie działania jądra. Funkcje takie jak dziedziczenie priorytetów zapobiegają opóźnianiu krytycznych operacji przez zadania o niskim priorytecie, a wywłaszczalna funkcja RCU gwarantuje, że nawet krytyczne sekcje po stronie odczytu nie powodują znacznych opóźnień. Sebastian Siewior, osoba utrzymująca PREEMPT_RT, trafnie stwierdza:

"Cała kontrola w rękach planisty"."

Ten techniczny skok oferuje praktyczne korzyści. Na przykład, Serverion korzysta ze specjalnych kompilacji jądra PREEMPT_RT, które umożliwiają precyzyjne dostrojenie izolacji procesora i optymalizację obciążeń w czasie rzeczywistym, gwarantując stabilny czas reakcji nawet przy intensywnym obciążeniu wejścia/wyjścia.

Systemy czasu rzeczywistego wyróżniają się nie tylko szybkością, ale także przewidywalnością. PREEMPT_RT minimalizuje jitter, zapewniając precyzyjne wykonywanie zadań w razie potrzeby. Jest to kluczowe w przypadku aplikacji takich jak automatyka przemysłowa, telekomunikacja i usługi hostingowe o krytycznym znaczeniu dla wydajności. Zapewnia deterministyczne zachowanie, którego standardowe jądra po prostu nie są w stanie zapewnić.

Dzięki integracji z głównym jądrem i wsparciu dystrybucji korporacyjnych, takich jak Ubuntu Pro (Od lutego 2023 r.) PREEMPT_RT stał się bardziej dostępny dla dostawców hostingu i administratorów systemów. Zapewnia niezawodną wydajność i niskie opóźnienia, niezbędne w dzisiejszych najbardziej wymagających i wrażliwych na czas środowiskach.

Często zadawane pytania

Czy potrzebuję PREEMPT_RT, czy wystarczy standardowy Linux?

Standardowe jądro Linuksa w połączeniu z Łatka PREEMPT_RT, zyskuje możliwości pracy w czasie rzeczywistym. To czyni go doskonałym wyborem dla aplikacji, w których niskie opóźnienia i spójny czas reakcji są kluczowe. Jednak samo główne jądro Linuksa może nie sprostać surowym wymaganiom pracy w czasie rzeczywistym.

Czy PREEMPT_RT zmniejszy ogólną przepustowość mojego systemu?

Aby osiągnąć wydajność w czasie rzeczywistym, PREEMPT_RT Koncentruje się na redukcji kodu jądra, którego nie można wywłaszczyć, co pomaga poprawić responsywność systemu. Takie podejście może prowadzić do nieznacznego spadku ogólnej przepustowości, ale zapewnia spójne i przewidywalne zachowanie – kluczowe dla aplikacji wrażliwych na czas. Ten kompromis jest celowy i ma kluczowe znaczenie dla spełnienia wymagań systemów czasu rzeczywistego.

Jaki docelowy poziom opóźnienia jest realistyczny w przypadku PREEMPT_RT?

Z PREEMPT_RT, Osiągnięcie opóźnień rzędu milisekund jest realistycznym celem zarówno dla systemów stacjonarnych, jak i wbudowanych. Rzeczywista wydajność w dużej mierze zależy jednak od tego, jak dobrze system jest skonfigurowany i dostrojony do konkretnych wymagań. Prawidłowa konfiguracja jest kluczowa dla zapewnienia pożądanego poziomu responsywności.

Powiązane wpisy na blogu

pl_PL