- Linuxi kerneli häälestamine nõuab arhitektuurilise konfiguratsiooni, sysctl-i ja latentsusele orienteeritud protsessori ajastamise kombineerimist.
- Kohandatud tuumad ja PREEMPT_RT plaastrid võimaldavad äärmuslikku latentsuse vähendamist, kuid need on keerukamad ja vajavad rohkem hooldust.
- Võrgu, mälu, ketta ja süsteemiteenuste optimeerimist tuleks alati mõõta range jälgimise ja võrdlusanalüüsi abil.
- Iteratiivne, mõõdikutel põhinev lähenemine muudab kerneli täiustused rakenduste ja kasutajate jaoks reaalseks kasuks.

Kui me räägime Linuxi jõudlusest, siis peaaegu kõik osutab lõpuks samale kohale: kernel kui keskne komponent, mis kontrollib latentsust, stabiilsust ja ressursikasutustSelle õige peenhäälestamine võib olla määrava tähtsusega süsteemi vahel, mis lihtsalt „saab hakkama“, ja sellise, mis reageerib sujuvalt serverites, töölaudades, pilvekeskkondades või isegi siseruumides. väga vana riistvara.
See juhend keskendub sellele, kuidas Optimeerige Linuxi kerneli, et minimeerida latentsust ilma turvalisust või hooldatavust kahjustamataKäsitleme kõike alates arhitektuuri põhikontseptsioonidest kuni sysctl-iga kohandamise, kohandatud kernelide kompileerimise, reaalajas paranduste kasutamise, madala latentsusega võrkude häälestamiseni (nagu EC2-s) ning jälgimis- ja võrdlusanalüüsi tehnikateni, et mõõta, kas teie kohandamine tegelikult midagi parandab.
Linuxi kerneli arhitektuur ja latentsuse põhipunktid
Linuxi tuum toimib vahendajana rakenduste ja riistvara vahel, hallates mälu, protsessid, katkestused, draiverid ja failisüsteemid. Su monoliitne, kuid modulaarne disainTänu laaditavatele moodulitele võimaldab see funktsioone paindlikult aktiveerida või deaktiveerida ilma kogu süsteemi uuesti kompileerimata.
Latentsusaegade päritolu mõistmiseks on oluline teada mitmeid alamsüsteeme: protsesside planeerija (ajastaja)Mälu haldamine ja katkestuste käsitlemine on üliolulised. Halvasti konfigureeritud ajastaja, agressiivne mälupoliitika või liiga palju kontrollimatuid katkestusi võivad põhjustada aeglast reageerimisaega isegi võimsa riistvara korral.
Kerneli konfiguratsioon hõlmab selliseid valikuid nagu CONFIG_PREEMPT, CONFIG_PREEMPT_VOLUNTARY või CONFIG_SMPNeed tegurid määravad, mil määral saab kerneli tööd katkestada kiireloomulisemate ülesannete täitmiseks ja kuidas see mitmetuumalisi süsteeme ära kasutab. Õige ennetusmudeli valimine muudab oluliselt tajutavat latentsust lauaarvutites, madala latentsusega serverites või tööstussüsteemides.
Kaasaegsetes serverites on oluline ka riistvara topoloogia: tuumade, soklite, NUMA ja vahemälu hierarhia jaotusProtsessori afiinsuste ja NUMA-poliitikate peenhäälestamine (nt protsesside ja mälu määramine samale sõlmele) aitab lühendada juurdepääsuaegu ja parandada vahemälu tabamusmäära, mis on võtmetähtsusega, kui soovime minimeerida värinat ja ettearvamatuid latentsusaegu.
Lisaks on protsessori planeerija ja alamsüsteemide vaheline interaktsioon I/O (ketas ja võrk) määrab läbilaskevõime ja otsast lõpuni latentsuse mida rakendused näevad. Enne millegi puudutamist on soovitatav dokumenteerida praegune olek (kerneli konfiguratsioon, sysctl, GRUB, laaditud moodulid), et saaksite kiiresti tagasi pöörduda, kui muudatus jõudlust halvendab.
sysctl-i kaudu tehtavad kohandused latentsuse ja jõudluse parandamiseks
liides sysctl võimaldab kerneli parameetreid lennult muuta /proc/sys kaudu, ilma et peaks uuesti kompileerima. See on ideaalne alguspunkt häälestamiseks ilma kompileerimisega veel tegelema hakkamata.
Võrgustiku valdkonnas parameetrid nagu net.core.rmem_max, net.core.wmem_max või net.ipv4.tcp_congestion_control Need mõjutavad otseselt läbilaskevõimet, latentsust ja TCP-ühenduse käitumist. Puhvrite ja ummikualgoritmi õige reguleerimine on ülioluline suure liiklusega veebiserverite või madala latentsusega pilveteenuste jaoks.
Mälu jaoks on sellised väärtused nagu vm.swappiness, vm.dirty_ratio, vm.vfs_cache_pressure või vm.overcommit_memory Need võimaldavad teil kontrollida, kui palju swappi kasutatakse, kuidas lehe vahemälu hallatakse ja virtuaalmälu käitumist. Swappivuse vähendamine (näiteks 10-ni) aitab tavaliselt vältida süsteemi liiga sagedast swappi kasutamist, vähendades ketta I/O latentsuse järsku tõusu.
Kui töötate suurte andmebaaside või rakendustega, mis kasutavad tohutul hulgal jagatud mälu, on oluline kohandada kernel.shmmax, kernel.shmall ja maksimaalne failide arv, mida saab sellega avada fs.file-max ja fs.nr_openNeed halvasti mõõdetud piirid võivad põhjustada kitsaskohti ja vigu, mida on koormuse all raske diagnoosida.
Parim lähenemisviis on rakendada väikeseid muudatusi, mõõta nende mõju jälgimisvahenditega ja alles seejärel salvestage need faili /etc/sysctl.conf või /etc/sysctl.d/Konteineriseeritud keskkondades tuleb meeles pidada, et paljud kerneli parameetrid on hosti jaoks globaalsed: nende hooletu muutmine võib mõjutada kõiki teenuseid, seega on sysctl kombineerimine cgroups'ide ja nimeruumidega peaaegu kohustuslik.
Kohandatud kernelide kompileerimine ja haldamine
Kohandatud kerneli kompileerimine on endiselt väga võimas tööriist, kui soovite vähendage latentsust, eemaldage ebavajalikud lisakulud või toetage haruldast riistvaraKuigi distributsioonidel on üsna mitmekülgsed tuumad, on teatud olukordades konkreetne tuum määrava tähtsusega.
Klassikaline töövoog hõlmab koodi allalaadimist kernel.org või paigatud puud nagu xanmod või liköörija kasutage tööriistu nagu make menuconfig valikute tegemiseks. .config-faili salvestamine oma giti repositooriumisse koos ehitusskriptidega võimaldab teil ehitusversioone reprodutseerida ja säilitada versioonide vahel järjepidevust.
Kui kasutate Debianit või selle derivaate, on kompileerimine väga mugav.Debiani stiilis"Kerneli, päiste ja seotud teekide .deb-pakettide hankimiseks. See võimaldab teil selle kohandatud kerneli mitmesse masinasse juurutada, lihtsalt installides paketid ja hallates versioone oma hoidla abil."
Päris elus on käsitsi kompileerimine sageli mõttekas, kui töötate vana või väga piiratud riistvaraTüüpiline näide on vana netbook Atomi protsessori ja 1 GB muutmäluga, kus moodne geneeriline kernel, mis on täis ebavajalikke draivereid ja serverivalikuid, toob kaasa latentsusaega ja täiendavat protsessori tarbimist, mida te endale lubada ei saa.
Levinud strateegia on alustada praegusest kerneli konfiguratsioonist (näiteks kopeerides /boot konfiguratsioon) ja sealt kärpige või kohandage. Saate eelistusmudeli muuta väärtuseks „Eelistatav tuum (madala latentsusega töölaud)"interaktiivse töölaua vastuse prioriseerimiseks või konkreetsete I/O ajastajate lisamiseks, näiteks Bfq mooduli kujul, et parandada mehaaniliste ketaste kogemust.
Et mitte pool oma elust kompileerimisele kulutada, on mõistlik teha build võimsamal masinal ja vajadusel kasutada ristkompileerimine (Näiteks 32-bitise kerneli kompileerimine Atomile x86_64 arvutist lihtsalt ARCH-i ja vastavate tööriistakettide kohandamise abil). Seejärel tuleb lihtsalt .deb-failid sihtarvutisse installida ja GRUB-i vastav kirje lisada.
Keeruline osa on hooldus: see on soovitatav uue kerneli testimine Kanaari saarte sõlmedel, omama käivitushalduris selgeid tagasipööramisteid ning salvestama ülemineku ajal logisid ja mõõdikuid, et tuvastada jõudluse või draiverite ühilduvuse regressioone.
Eelistusmudelid ja PREEMPT_RT plaastrid madala latentsusega süsteemidele
Kerneli ennetusmudel dikteerib, kui palju saab töötavat ülesannet katkestada, et kõrgema prioriteediga ülesanne saaks üle võtta, mis mõjutab otseselt vastuse latentsusSee hõlmab nii standardseid konfiguratsioonivalikuid kui ka reaalajas parandusi.
Üldised tuumad pakuvad mitmeid valikuid: eelisõiguse puudumine (keskendub rohkem serveri läbilaskevõimele), vabatahtlik eelisõigus ja töölauale mõeldud ennetatav kernelSee seab esikohale interaktiivsete rakenduste kiire reageerimisaja. Selle sätte muutmine võib oluliselt parandada lauaarvutite, heli või isegi vanemate, tugevalt koormatud masinate jõudlust.
Kui on vaja sammu edasi astuda, kuvatakse järgmine teave: PREEMPT ja PREEMPT_RT plaastridNeed modifikatsioonid muudavad kerneli olulisi osi, et minimeerida mitte-eemaldatavaid sektsioone. PREEMPT_RT on mõeldud süsteemidele, kus halvimal juhul peab latentsusaeg olema väga madal ja prognoositav: tööstusautomaatika, professionaalne heli, telekommunikatsioon või kõrgsageduslik kauplemine.
PREEMPT_RT kasutuselevõtu otsus ei tohiks põhineda moel, vaid latentsuse ja värina spetsiifilised mõõtmisedEsiteks on soovitatav enne hoolduse keerulisemaks muutmist RT-puuga täielikult ära kasutada ajastaja sätteid, protsessori afiinsusi, sysctl-i ja vajadusel ka konfiguratsioone, näiteks dünaamilist tickless-i.
Samuti tuleb arvestada ühilduvusega: mõned Draiverid ja alamsüsteemid pole RT-ga täielikult kohandatud ja see võib vajada spetsiifilisi versioone või täiendavaid parandusi. Mõistlik lähenemisviis on koostada hooldusplaan, mis selgelt kirjeldab, millal ja kuidas integreerida põhikerneli uusi versioone RT haruga, mis küll perioodiliselt sünkroniseerub, kuid jääb siiski mõnevõrra maha.
Protsessori ajastamise häälestamine, kiire töö ja südamiku isoleerimine
Lisaks eelistusmudeli valimisele saate latentsust peenhäälestada, mängides protsessori ajastamise ja kerneli taimeri käitumisega, eriti ettevõttekesksetes distributsioonides nagu RHEL.
Näiteks Red Hat Enterprise Linux 8-l on kaasas tuuma vaikimisi tiksumisvaba jõudeolekus protsessorite jaoksSee vähendab energiatarbimist, vältides perioodilisi katkestusi, kui tuum on jõudeolekus. Latentsusaja suhtes tundlike töökoormuste jaoks saab lubada režiimi. dünaamiline tiksumatu tuumade komplektisnii et ainult üks protsessor ("kodutuum") tegeleb enamiku ajapõhiste ülesannetega ja ülejäänud on perioodilistest katkestustest võimalikult vabad.
See konfiguratsioon tehakse sobivate parameetrite lisamisega kerneli käsurida GRUBiskonfiguratsiooni taasgenereerimine ja seejärel kriitiliste kerneli lõimede, näiteks RCU lõimede või lõimede afiinsuse reguleerimine bdi-flush, nii et nad asuvad hoolduseks reserveeritud südamikus.
Seda lähenemisviisi saab täiendada parameetriga isolkpusSee võimaldab tuumad tavapärastest kasutajaruumi ülesannetest isoleerida. Madala latentsusega stsenaariumides on väga tavaline reserveerida mitu tuuma ainult kriitilise rakenduse jaoks, samal ajal kui ülejäänud süsteemi (deemonid, katkestused jne) haldavad teised tuumad.
Dünaamilise tiksumisvaba režiimi toimimise kontrollimiseks saab teha lihtsaid teste stress või skripte, mis hoiavad protsessori sekundiks hõivatud ja jälgivad koos taimeri tiksude loendurid Kuidas katkestuste arv sekundis langeb isoleeritud südamikes tuhandetest vaid ühele, mis on märk perioodilise taimeri kadumisest.
Mälu ja salvestusruumi haldamine, keskendudes latentsusele
Sellel, kuidas kernel mälu ja ketta sisend-/väljundit haldab, on tohutu mõju. rakenduste poolt tajutav latentsuseriti andmebaasides ja teenustes, mis teevad palju väikeseid ja sagedasi toiminguid.
Mälu poolel vähendage vm.vahetus minimeerida swap-mälu kasutamist (mis on peaaegu alati palju aeglasem kui RAM), vm.vfs_cache_pressure See kontrollib, kui kiiresti süsteem üritab inode ja dentry vahemälu tühjendada, ja vm.nr_hugepages See võimaldab reserveerida staatilisi HugePages'e suurtele koormustele, näiteks andmebaasidele või JVM-idele, vähendades TLB üldkulu.
Ladustamise ajal vali sobiv I/O ajakava vastavalt ketta tüübile See on kriitilise tähtsusega. Kaasaegsete SSD-de puhul on tavaliselt hea mõte kasutada... none o mq-deadlineKuigi mehaaniliste ketaste ja multitegumsüsteemide puhul võivad õigluse tagamiseks loodud algoritmid olla paremad, näiteks BfqLisaks saab failisüsteemide paigaldamist selliste valikutega nagu noatime y nodiratime Vältige ebavajalikke kirjutusi iga kord, kui failile või kataloogile juurde pääsetakse.
Failisüsteemide osas, ext4 ja XFS Need on endiselt kõige levinumad valikud: hästi häälestatud ext4 on kindel valik, samas kui XFS kipub paremini skaleeruma suure samaaegsuse korral. Väga nõudlikes stsenaariumides võib RAID-i (RAID 10 andmebaaside jaoks, RAID 0 ajutiseks krüpteeritud salvestusruumiks) kombineerimine hea ajastajaga vähendada keskmist latentsusaega ja ennekõike muutlikkust.
Võrgu ja kerneli optimeerimine Linuxi ja EC2 madala latentsuse saavutamiseks
Suure jõudlusega võrgurakendustes ei sõltu latentsus ainult riistvarast või kaugusest, vaid ka kuidas TCP/IP pinu ja kerneli enda konfiguratsioon onSee on eriti nähtav pilvepõhistes eksemplarides, näiteks Amazon EC2-s ENA liidestega.
Alustuseks on oluline vähendada väliseid tegureid, näiteks võrguhüpped mida paketid toimivad: otsesemate topoloogiate, serveripoolsete koormuse tasakaalustajate või optimeeritud kättesaadavustsoonide kasutamine vähendab edastusaega millisekundites enne operatsioonisüsteemiga kokkupuudet.
Kernelis hõlmab võrgu konfigureerimine suurendamist failikirjeldajad (ulimit -n), suuruse vastuvõtu- ja saatmispuhvrid koos net.core.rmem_max, net.core.wmem_max, net.ipv4.tcp_rmem, net.ipv4.tcp_wmemja aktiveerige valikud, näiteks TCP Fast Open ühenduse loomise latentsuse vähendamiseks.
AWS ENA liidestes mängib katkestuste modereerimine olulist rolli: vaikimisi grupeerib draiver pakette, et vähendada IRQ-de arvu. rx-usecs ja tx-usecsKui soovite latentsust absoluutse miinimumini vähendada, saate selle modereerimise keelata, tehes järgmist. ethtool -CRx-usecs ja tx-usecs nulli seadmine vähendab latentsust, kuid suurendab katkestuste üldkulu, seega tuleb leida tasakaal olenevalt koormusest.
Seda saab kasutada ka irqbalance IRQ-de jaotamiseks mitme tuuma vahelvõi keelake see ja määrake katkestuste ja võrgujärjekorra (RSS/RPS) afiinsused käsitsi konkreetsetele tuumadele, mis on väga tüüpiline ülimadala latentsusega keskkondades või DPDK kasutamisel ja kerneli pinu suure osa vahelejätmisel.
Teine parameeter, mida arvestada, on Protsessori C olekudSügavad uneseisundid vähendavad energiatarbimist, kuid tekitavad viivitusi, kui tuum "ärkab". Reaktsiooni latentsuse vähendamiseks saate neid sügavaid olekuid piirata, aktsepteerides suuremat energiatarbimist ja vähemat vabadust Turbo Boosti jaoks teistel tuumadel. Igal keskkonnal on oma optimaalne punkt tarbitud vattide ja võidetud mikrosekundite vahel.
Protsessori, teenuse ja rakenduste optimeerimine latentsuse vähendamiseks
Lisaks kernelile endale on ümbritseval keskkonnal üldise latentsuse kohta palju öelda: alates süsteemis olevad aktiivsed teenused iga rakenduse konkreetse konfiguratsioonini.
Suure jõudlusega server peaks käitama ainult deemonid, mis on tõeliselt vajalikudTagaserverites olevad teenused nagu Bluetooth, printimine või võrgu automaatne tuvastamine (CUPS, Avahi jne) tarbivad ainult protsessorit, mälu ja sisend-/väljundvõimsust, pakkumata mingit kasu. Vaadake üle koos systemctl list-unit-files --state=enabled Ja ebavajalike asjade keelamine on üks odavamaid ja tõhusamaid asju, mida teha saad.
Kriitiliste protsesside tähtsuse järjekorda seadmiseks võite kasutada selliseid tööriistu nagu renice, chart ja tasksetProtsessi prioriteedi muutmine (renice), sellele reaalajas ajastamine (chrt -f 99) või selle määramine kindlatele tuumadele (taskset) vähendab häireid teiste ülesannetega, parandades protsessori prognoositavust andmebaaside, VoIP, voogedastus- või kauplemisteenuste jaoks.
Rakenduse tasandil on häälestamine sama oluline kui kerneli häälestamine. Veebiserverid, näiteks Nginx või Apache Nad vajavad töötajate peenhäälestamist, elushoidmist, vahemälu ja tihendamist. Andmebaasid nagu PostgreSQL või MySQL Madala ja stabiilse latentsuse saavutamiseks peavad nad üle vaatama puhvrite suurused, kontrollpunktid, ühenduste kogumi ja sünkroonse kirjutamise parameetrid.
JVM-idel on samuti oma roll: prügikorjajate valimine, näiteks G1GC või ZGC Heap-suuruste reguleerimine aitab vähendada pause, mis väliselt vaadatuna paistavad latentsusena. Virtualiseeritud ja konteinerdatud keskkondades on õige jaotus ülioluline. vCPU, vRAM ja I/O kvoodid See väldib vaikset konkurentsi, mis hiljem ilmneb lõputute järjekordadena kettal või küllastunud protsessorina.
Kerneli ja süsteemi jälgimine ja võrdlusanalüüs
Kogu see häälestamine on kasutu, kui sa ei mõõda selle mõju. Võti peitub kombineerimises. pidev jälgimine korratavate jõudlustestideganii et iga kerneli või sysctli muudatust saab objektiivsete andmetega hinnata.
Süsteemi üldise oleku nägemiseks võite kasutada klassikalisi tööriistu, näiteks htop, vmstat, iotop o sarKui vajate rohkem üksikasju, tulevad mängu spetsiifilised kerneli tööriistad, näiteks perf ja ftracemis võimaldavad teil märkimisväärse täpsusega jälgida ajastaja, katkestuste ja sisekõnede käitumist.
Tootmiskeskkondades on soovitatav juurutada mõõdikute süsteeme, näiteks Prometheus, kogutud või süstematiseeritud eksportijatega mis paljastavad protsessori loendurid, sisend-/väljundandmed, ketta- ja võrgu latentsused, protsesside järjekorrad jne. Need andmed, mis visualiseeritakse Grafanas või sarnastes tööriistades, aitavad tuvastada regressioone või anomaaliaid enne, kui lõppkasutaja probleeme märkab.
Võrdlusuuringute puhul on idee korrata tegelikku töökoormust ja võrrelda iga muudatuse "enne ja pärast" olekut. Tööriistad, näiteks sysbench (protsessorite ja andmebaaside jaoks) FiO (ketta jaoks) või iperf3 (Võrgustike puhul) võimaldavad need luua korduvaid stsenaariume. Dokumentatsioon on hädavajalik. kerneli versioonid, sysctl konfiguratsioonid, riistvara ja testiparameetrid et võrdlused aja jooksul loogilised oleksid.
Praktikas on Linuxi kerneli optimeerimine iteratiivne protsess: testitakse mitmeid muudatusi, mõõdetakse tulemusi, säilitatakse need, mis pakuvad reaalset kasu, ja loobutakse ülejäänust. Hea muudatuste haldamise abil saab uute kerneli versioonide täiustusi (näiteks hiljutisi seeriaid ajastaja, graafika, võimsuse või võrgu täiustustega) tõlkida mõõdetavateks eelisteks teie rakenduste jaoks, olgu need siis kohapealsed serverid, pilves või nõudlikel tööjaamadel.
Kerneli arhitektuurialaste teadmiste, sysctl-iga peenhäälestamise, kontrollitud kompileerimise, reaalajas paikade valikulise kasutamise ja hea mõõdikute süsteemi kombinatsioon võimaldab administraatoril või operatsioonimeeskonnal saavutada järgmist: Kiiremad reageeringud, madalam latentsusaeg ja parem üldine stabiilsus ilma et peaksite vähimagi provokatsiooni korral riistvara vahetama või süsteemi turvalisust ohtu seadma.
Sisukord
- Linuxi kerneli arhitektuur ja latentsuse põhipunktid
- sysctl-i kaudu tehtavad kohandused latentsuse ja jõudluse parandamiseks
- Kohandatud kernelide kompileerimine ja haldamine
- Eelistusmudelid ja PREEMPT_RT plaastrid madala latentsusega süsteemidele
- Protsessori ajastamise häälestamine, kiire töö ja südamiku isoleerimine
- Mälu ja salvestusruumi haldamine, keskendudes latentsusele
- Võrgu ja kerneli optimeerimine Linuxi ja EC2 madala latentsuse saavutamiseks
- Protsessori, teenuse ja rakenduste optimeerimine latentsuse vähendamiseks
- Kerneli ja süsteemi jälgimine ja võrdlusanalüüs