PREEMPT_RT selitettynä: Reaaliaikaiset ytimen ominaisuudet
PREEMPT_RT muuttaa Linux-ytimen reaaliaikaiseksi käyttöjärjestelmäksi varmistaen kriittisten tehtävien tarkan ajoituksen. Täysin integroituna Linux 6.12:een (julkaistu 20. syyskuuta 2024) se mahdollistaa reaaliaikaiset ominaisuudet arkkitehtuureille, kuten x86, ARM64 ja RISC-V. Tässä on mitä sinun tulee tietää:
- Tärkeimmät ominaisuudet:
- Korvaa perinteiset spinlockit ennaltaehkäisevillä nukkuvilla lukoilla.
- Muuntaa keskeytyskäsittelijät säikeiksi, jolloin ne ovat ajoitettavia ja ennakko-oikeutettuja.
- Toteuttaa prioriteetin periytymisen prioriteetin inversio-ongelmien ratkaisemiseksi.
- Tekee RCU (Read-Copy-Update) -toiminnoista täysin ennakko-oikeudellisia.
- Sovellukset:
- Käytetään esimerkiksi autoteollisuudessa, robotiikassa, televiestinnässä ja lääkinnällisissä laitteissa, joissa tarkka ajoitus on kriittistä.
- Voimanlähteenä toimivat järjestelmät, kuten teollisuusautomaatiotyökalut, lennonohjaimet ja hosting-ympäristöt, jotka vaativat matalan latenssin virtuaaliset yksityispalvelimet.
- Asennus:
- Ota käyttöön
CONFIG_PREEMPT_RTytimen kokoonpanossa. - Hienosäädä asetuksia, kuten
CONFIG_NO_HZ_FULLjaCONFIG_RCU_BOOSToptimaalisen suorituskyvyn saavuttamiseksi. - Käytä työkaluja, kuten
syklinen testilatenssin mittaamiseksi ja suorituskyvyn validoimiseksi.
- Ota käyttöön
PREEMPT_RT asettaa ajoituksen etusijalle läpimenon sijaan, mikä tekee Linuxista sopivan sovelluksille, joissa määräajoista ei voida neuvotella. Se on mullistava tekijä determinististä suorituskykyä vaativilla toimialoilla.
PREEMPT_RT:n ydinominaisuudet: Miten Linux saavuttaa reaaliaikaisen suorituskyvyn
PREEMPT_RT selitettynä: Rakenna ja optimoi Linux-ydin reaaliaikaista ja erittäin lyhyttä latenssia varten
sbb-itb-59e1987
PREEMPT_RT-ydinominaisuudet
PREEMPT_RT keskittyy neljään pääominaisuuteen, jotka on suunniteltu vähentämään ennaltaehkäisemätöntä koodia ja parantamaan tehtävien ajoituksen hallintaa. Tässä on tarkempi katsaus kuhunkin.
Täysi ytimen etuoikeus
Yksi suurimmista päivityksistä on standardien spinlock-lukkojen muuttaminen (spinlock_t) ja lukija-kirjoittaja-lukot (rwlock_t) osaksi mutex-pohjaiset nukkuvat spinlockit. Perinteiset spin-lukitukset voivat aiheuttaa viiveitä, koska ne poistavat käytöstä ennakko-oikeuden ja pakottavat tehtävät odottamaan. PREEMPT_RT muuttaa tämän ottamalla käyttöön lukitukset, jotka sallivat tehtävien nukkua ja tulla ennakko-oikeutetuiksi, vaikka resurssia olisi tallessa.
Tämä tarkoittaa, että korkean prioriteetin tehtävät voivat keskeyttää alemman prioriteetin tehtävät, vaikka alemman prioriteetin tehtävissä olisi lukitus. Tietyille kriittisille toiminnoille – kuten ajoitukselle tai laitteiston aloituspisteille – PREEMPT_RT kuitenkin säilyttää raw_spinlock_t, joka käyttäytyy kuten alkuperäiset ei-ennaltaehkäisevät lukot. Kuten Paul McKenney, arvostettu insinööri, asian ilmaisee:
""PREEMPT_RT-korjauksen keskeinen tarkoitus on minimoida ydinkoodin määrä, jota ei voida preemptoida, samalla kun minimoidaan koodin määrä, jota on muutettava tämän lisätyn preemptoitavuuden tarjoamiseksi.""
Seuraavaksi katsotaan, miten tämä lähestymistapa hyötyy keskeytysten käsittelyssä.
Säikeitetyt keskeytykset
PREEMPT_RT siirtää useimmat laitteistokeskeytysten käsittelijät "hard IRQ" -kontekstista tilaan ytimen säikeet käynnissä prosessikontekstissa. Tämä säätö mahdollistaa keskeytysten käsittelijöiden priorisoinnin, ennakoinnin tai jopa estämisen.
Tavallisessa Linux-ytimessä pitkään suoritettava keskeytyskäsittelijä voi johtaa rajattomaan latenssiin, koska se pysäyttää kaiken muun suorituksen. Säikeitetyt keskeytykset ratkaisevat tämän ongelman. Oletusarvoisesti nämä keskeytyssäikeet suoritetaan SCHED_FIFO prioriteetti on 50, mutta järjestelmänvalvojat voivat säätää prioriteettejaan työkaluilla, kuten kaavio. Voit esimerkiksi priorisoida verkkokortin keskeytyksen teollisuusohjaukselle ja samalla laskea levyn I/O:n prioriteettia. Koska nämä säikeet käyttävät nukkuvia spinlockeja raakojen spinlockien sijaan, ne välttävät tarpeen poistaa laitteistokeskeytyksiä käytöstä lukituksen aikana.
Tutkitaanpa nyt, miten PREEMPT_RT käsittelee prioriteetteihin liittyviä haasteita.
Prioriteettiperintä ja Rtmutex
Prioriteettikäännös on merkittävä ongelma, jossa korkean prioriteetin tehtävä jää jumiin odottamaan matalan prioriteetin tehtävän hallussa olevaa resurssia, kun taas keskitason prioriteetin tehtävä (joka ei tarvitse resurssia) ohittaa matalan prioriteetin tehtävän. PREEMPT_RT ratkaisee tämän funktiolla etuoikeutettu perintö, nostamalla väliaikaisesti matalan prioriteetin tehtävän prioriteettia vastaamaan resurssia odottavan korkeimman prioriteetin tehtävää.
The rtmutex Primitiivi on työkalu, joka mahdollistaa tämän. Se varmistaa, että konfliktin syntyessä matalan prioriteetin tehtävä saa prioriteetinlisäyksen kriittisen osuutensa loppuun saattamiseksi ilman keskitason prioriteetin tehtävien häiriöitä. Jos lisätty tehtävä estyy toisessa lukossa, prioriteetinlisäys siirtyy alaspäin riippuvuusketjussa. Kuten Linux-ytimen dokumentaatio selittää:
""Prioriteettiperintä mahdollistaa hyvin suunniteltujen sovellusten käyttää käyttäjätilan lukkoja korkean prioriteetin säikeen kriittisissä osissa menettämättä determinismiä.""
Tämän saavuttamiseksi, rtmutex käyttää lippua ja prioriteettijärjestyksessä olevaa puuta odottavien tehtävien hallintaan pitäen yleiskuorman alhaisena tuetuissa arkkitehtuureissa.
Lopuksi tarkastellaan, miten PREEMPT_RT parantaa RCU:n toimintaa.
Preemptible RCU (luku-kopio-päivitys)

Read-Copy-Update (RCU) on synkronointitekniikka, jota käytetään laajasti Linux-ytimessä. Vakioytimissä RCU:n lukuosiot eivät ole ennaltaehkäiseviä, mikä voi johtaa arvaamattomiin viiveisiin. PREEMPT_RT muuttaa tätä tekemällä RCU:n lukuosioista... täysin etuoikeutettu, varmistaen, että reaaliaikaisten tehtävien määräajat eivät vaarannu. Tämä mukautuminen on kulmakivi reaaliaikaisissa järjestelmissä vaadittavan ennustettavan käyttäytymisen saavuttamiseksi.
PREEMPT_RT:n konfigurointi ja käyttö
PREEMPT_RT on täysin integroitu Linuxin pääversioiden ytimiin, mikä tarkoittaa, että ulkoisia korjauksia ei enää tarvita. Uusimman korjausjonon asentaminen on kuitenkin edelleen hyvä idea paremman arkkitehtuurituen ja grafiikan parantamiseksi. Kun ydin on valmis, sinun on muutettava sen asetuksia, jotta voit hyödyntää sen ominaisuuksia täysimääräisesti.
Ytimen määritysasetukset
Ota täysin preemptiivinen ydin käyttöön ottamalla käyttöön CONFIG_PREEMPT_RT. Uudemmissa ytimissä tämä asetus sijaitsee kohdassa "Yleiset asetukset", mutta sinun on ehkä otettava se käyttöön. ASETUSASIANTUNTIJA ensin, jotta se näkyy asetusvalikossa.
Tuotantoa varten omistettu palvelimet ja muissa tehokkaissa ympäristöissä, lisäasetukset voivat optimoida suorituskykyä entisestään:
CONFIG_NO_HZ_FULLVähentää aikataulutuskellon keskeytyksiä kiireisillä suorittimilla, mikä auttaa minimoimaan jitteriä.CONFIG_RCU_BOOSTEstää ennalta määrättyjä RCU-lukijoita viivästyttämästä lisäaikoja.CONFIG_RCU_NOCB_CPU: Siirtää RCU:n takaisinkutsujen käsittelyn tiettyjen suorittimien vastuulle, mikä vähentää häiriöitä reaaliaikaisissa tehtävissä.
On myös tärkeää poistaa käytöstä virheenkorjausasetukset, jotka voivat aiheuttaa suuren viiveen. Poista käytöstä asetukset, kuten CONFIG_DEBUG_LOCKDEP, CONFIG_DEBUG_PREEMPT, CONFIG_DEBUG_OBJECTS, ja CONFIG_SLUB_DEBUG. Vaikka nämä työkalut ovat hyödyllisiä kehitykselle, ne voivat merkittävästi vahingoittaa latenssitavoitteita. Kuten kernelconfig.io selittää:
""Tämä vaihtoehto muuttaa ytimen reaaliaikaiseksi ytimeksi korvaamalla erilaisia lukitusprimitiivejä (spinlockit, rwlockit jne.) preemptible-tyyppisillä prioriteettiperiytymistä tunnistavilla muunnelmilla.""
Kun ydin on käännetty ja käynnistetty, varmista, että PREEMPT_RT on aktiivinen suorittamalla komennon cat /sys/kernel/realtime. Paluuarvo on 1 osoittaa onnistumista. Voit varmistaa tämän myös tarkistamalla, onko funktion tulosteessa "PREEMPT_RT". uname -a.
Virheenkorjaus ja suorituskyvyn optimointi
Ytimen hienosäätö on olennaista optimaalisen suorituskyvyn saavuttamiseksi reaaliaikaisissa työkuormissa. Yksi keskeinen käsiteltävä alue on reaaliaikainen kuristusmekanismi, joka varaa oletusarvoisesti 50 ms sekunnissa ei-reaaliaikaisille tehtäville. Jos työmääräsi on puhtaasti reaaliaikainen, voit poistaa tämän mekanismin käytöstä kirjoittamalla -1 että /proc/sys/kernel/sched_rt_runtime_us. Kuten Jan Altenberg, OSADL:n vanhempi avoimen lähdekoodin konsultti, huomauttaa:
""'Karkaava' reaaliaikainen tehtävä voi näännyttää järjestelmän. Suojausmekanismina reaaliaikaisten tehtävien suoritusaikaa voidaan rajoittaa asettamalla mikrosekunteina arvo tiedostoon /proc/sys/kernel/sched_rt_runtime_us."‘
Parannetun determinismin saavuttamiseksi eristä tietyt suorittimen ytimet käyttämällä parametreja, kuten isolkpus=2,3, rcu_nocbs=2,3, nohz_full=2,3, ja aseta irqaffiniteetti=0. Tämä varaa kyseiset ytimet yksinomaan reaaliaikaisiin tehtäviin.
Keskeytyssäikeiden hallintaan käytä kaavio työkalu. Nämä säikeet toimivat tyypillisesti oletusarvoisesti SCHED_FIFO prioriteetti on 50, mutta voit säätää niitä välttääksesi ristiriitoja sovelluksesi kanssa. Esimerkiksi verkkokortin IRQ-säikeen prioriteetin asettamiseksi prioriteettiin 98, käytä komentoa: kaavio -p -f 98.
Konfiguroinnin jälkeen on tärkeää testata ja validoida latenssi. Työkaluja, kuten syklinen testi voi mitata latenssia (esim., syklinen testi -S -m -p98 -i250), samalla kun rtla (Real-time Linux Analysis) auttaa tunnistamaan ja analysoimaan viivepiikkejä. Nämä työkalut varmistavat, että kokoonpanosi täyttää reaaliaikaisten sovellusten vaatimukset.
PREEMPT_RT-sovellukset ja -edut
Reaaliaikaisten sovellusten käyttötapaukset
PREEMPT_RT loistaa järjestelmissä, joissa ajoituksen tarkkuus ei ole neuvoteltavissa. ilmailu- ja avaruustekniikka, se varmistaa, että navigointi ja lennonohjaus toimivat ilman mikrosekunnin viiveitä, jotka muutoin voisivat vaarantaa turvallisuuden. Televiestintä Yritykset luottavat siihen reaaliaikaisen datan reitityksen hallinnassa, varmistaen sujuvat ääni- ja videopuhelut poistamalla jitterin ja viiveen piikit.
Sisään autoteollisuus, se on ajoneuvojen ohjausjärjestelmien kulmakivi, ja suuret toimijat, kuten Continental Automotive, tukevat sen käyttöönottoa. teollisuusautomaatio, PREEMPT_RT käyttää ohjelmoitavia logiikkaohjaimia (PLC) ja SCADA-järjestelmiä ja toimii usein rinnakkain protokollien, kuten EtherCATin, kanssa turvallisuuden ja tehokkuuden ylläpitämiseksi tehdasalueilla. Robotiikka luottaa myös vahvasti tähän teknologiaan tarkan toimilaitteiden ohjauksen ja välittömän anturipalautteen saamiseksi, minkä ansiosta robotit voivat reagoida välittömästi ympäristön muutoksiin.
Ehkä kriittisimmät sovellukset ovat lääkinnälliset laitteet, joissa tarkkuus on ensiarvoisen tärkeää. Potilasmonitoreista kirurgisiin robotteihin, PREEMPT_RT tarjoaa deterministisen suorituskyvyn, jota tarvitaan elämänkriittisten järjestelmien moitteettoman toiminnan varmistamiseksi.
Edut hosting-ympäristöille
PREEMPT_RT:n edut ulottuvat hosting-ympäristöihin, joissa reaaliaikainen reagointikyky on aivan yhtä ratkaisevan tärkeää. VPS ja dedikoidut palvelimet, se minimoi viiveen antamalla ajoittajalle mahdollisuuden priorisoida korkean prioriteetin tehtäviä vähemmän kriittisten edelle. Tämä varmistaa yhdenmukaiset vasteajat, jotka vaikuttavat suoraan käyttökokemukseen ja palvelun luotettavuuteen.
Säikeistetty keskeytysmalli estää "keskeytysmyrskyjä" ylikuormittamasta järjestelmiä raskaiden I/O-toimintojen aikana. rt_mutex, Prioriteetin periytyminen varmistaa, että matalan prioriteetin taustatehtävät eivät estä kriittisiä hosting-palveluita. Korkean resoluution ajastimet mahdollistavat mikrosekunnin tason aikataulutustarkkuuden, mikä vähentää jitteriä virtualisoiduissa kokoonpanoissa. Hosting-palveluntarjoajat, kuten Serverion, tarjoavat mukautettuja ytimen koontiversioita PREEMPT_RT:n avulla, mikä antaa järjestelmänvalvojille joustavuutta hienosäätää tiettyjen työkuormien asetuksia. Käyttämällä parametreja, kuten isolkpus ja irqaffiniteetti, palveluntarjoajat voivat omistaa suorittimen ytimiä suorituskyvyn kannalta kriittisille tehtäville ja pitää samalla rutiininomaiset järjestelmätoiminnot erillään.
Johtopäätös
Tässä oppaassa on syventynyt siihen, miten PREEMPT_RT muuttaa Linuxin reaaliaikaiseksi käyttöjärjestelmäksi antamalla ajoittajalle lähes täydellisen hallinnan. Sen jälkeen, kun se sisällytettiin pääversioihin Linux 6.12:sta (syyskuu 2024) alkaen, se on poistanut ulkoisten korjauspäivitysten tarpeen eri arkkitehtuureissa, kuten x86, ARM64 ja RISC-V.
Konsepti on yksinkertainen: vähennä ei-preemptoitavaa koodia niin paljon kuin mahdollista. Muuntamalla spinlockit nukkuviksi lukkoiksi ja suorittamalla keskeytyskäsittelijöitä säikeinä, korkean prioriteetin tehtävät voivat preemptoida lähes kaikki ytimen toiminnot. Ominaisuudet, kuten prioriteetin periytyminen, estävät matalan prioriteetin tehtäviä viivästyttämästä kriittisiä toimintoja, kun taas preemptoitava RCU varmistaa, että edes lukupuolen kriittiset osiot eivät aiheuta merkittäviä viiveitä. Sebastian Siewior, PREEMPT_RT-ylläpitäjä toteaa osuvasti:
""Kaikki hallinta aikatauluttajalla.""
Tämä tekninen harppaus tarjoaa käytännön etuja. Esimerkiksi, Serverion käyttää mukautettuja PREEMPT_RT-ytimen koontiversioita suorittimen eristämisen hienosäätöön ja reaaliaikaisten työkuormien optimointiin varmistaen vakaat vasteajat jopa suuren I/O-paineen alla.
Reaaliaikaiset järjestelmät eivät erotu muista pelkästään nopeuden, vaan myös ennustettavuuden ansiosta. PREEMPT_RT minimoi jitterin, varmistaen, että tehtävät suoritetaan tarkasti tarvittaessa. Tämä on ratkaisevan tärkeää sovelluksissa, kuten teollisuusautomaatiossa, televiestinnässä ja suorituskykykriittisissä hosting-palveluissa. Se tuo mukanaan deterministisen käyttäytymisen, jota tavalliset ytimet eivät yksinkertaisesti pysty tarjoamaan.
Sen integrointi pääytimeen ja tuki yritysjakeluille, kuten Ubuntu Pro (helmikuusta 2023 lähtien) PREEMPT_RT on tullut helpommin saatavilla hosting-palveluntarjoajille ja järjestelmänvalvojille. Se tarjoaa luotettavan ja matalan latenssin suorituskyvyn, jota nykypäivän vaativimmat ja aikaherkimmät ympäristöt edellyttävät.
UKK
Tarvitsenko PREEMPT_RT:n vai riittääkö tavallinen Linux?
Tavallinen Linux-ydin yhdistettynä PREEMPT_RT-korjaus, saa reaaliaikaisia ominaisuuksia. Tämä tekee siitä vahvan valinnan sovelluksille, joissa pieni latenssi ja yhdenmukaiset vasteajat ovat kriittisiä. Yksinään pääasiallinen Linux-ydin ei kuitenkaan välttämättä pysty täyttämään tiukkoja reaaliaikaisia vaatimuksia.
Vähentääkö PREEMPT_RT järjestelmäni kokonaiskapasiteettia?
Reaaliaikaisen suorituskyvyn saavuttamiseksi, PREEMPT_RT keskittyy vähentämään ei-preemptoitavaa ydinkoodia, mikä auttaa parantamaan järjestelmän reagointikykyä. Tämä lähestymistapa voi johtaa kokonaisläpivirtausnopeuden lievään laskuun, mutta se varmistaa yhdenmukaisen ja ennustettavan toiminnan – mikä on kriittistä aikaherkille sovelluksille. Tämä kompromissi on tarkoituksellinen ja keskeinen reaaliaikaisten järjestelmien vaatimusten täyttämiseksi.
Mikä latenssitavoite on realistinen PREEMPT_RT:n kanssa?
Kanssa PREEMPT_RT, millisekuntien latenssin saavuttaminen on realistinen tavoite sekä pöytätietokoneille että sulautetuille järjestelmille. Todellinen suorituskyky riippuu kuitenkin suuresti siitä, kuinka hyvin järjestelmä on konfiguroitu ja viritetty vastaamaan tiettyjä vaatimuksia. Oikea asennus on avainasemassa halutun reagointitason varmistamiseksi.