Çfarë është Swappiness në Linux? (dhe si ta ndryshoni)


Vlera e shkëmbimit të Linux nuk ka të bëjë me sasinë e RAM-it të përdorur përpara se të fillojë shkëmbimi. Ky është një gabim i raportuar gjerësisht dhe i besuar gjerësisht. Ne shpjegojmë se çfarë është në të vërtetë.

Shkatërrimi i miteve rreth shkëmbimit

Shkëmbimi është një teknikë ku të dhënat në Memorien e Qasjes së Rastit (RAM) shkruhen në një vendndodhje të veçantë në hard diskun tuaj - qoftë një ndarje shkëmbimi ose një skedar shkëmbimi - për të çliruar RAM-in.

Linux ka një cilësim të quajtur vlera e shkëmbimit. Ka shumë konfuzion rreth asaj që kontrollon ky cilësim. Përshkrimi më i zakonshëm i gabuar i shkëmbimit është se ai vendos një prag për përdorimin e RAM-it dhe kur sasia e RAM-it të përdorur arrin atë prag, fillon shkëmbimi.

Ky është një keqkuptim që është përsëritur aq shpesh sa që tani është marrë urtësi. Nëse (pothuajse) të gjithë të tjerët ju thonë se pikërisht kështu funksionon shkëmbimi, pse duhet të na besoni kur themi se nuk është kështu?

E thjeshtë. Ne do ta vërtetojmë atë.

RAM-i juaj është i ndarë në zona

Linux nuk e mendon RAM-in tuaj si një grup të madh memorie homogjene. Ai e konsideron atë të ndarë në një numër rajonesh të ndryshme të quajtura zona. Cilat zona janë të pranishme në kompjuterin tuaj varet nëse është 32-bit ose 64-bit. Këtu është një përshkrim i thjeshtuar i zonave të mundshme në një kompjuter me arkitekturë x86.

  • Qasja e drejtpërdrejtë në memorie (DMA): Kjo është memoria e ulët prej 16 MB. Zona e ka marrë emrin e saj sepse, shumë kohë më parë, kishte kompjuterë që mund të bënin vetëm akses të drejtpërdrejtë të memories në këtë zonë të memories fizike.
  • Qasja direkte në memorie 32: Pavarësisht nga emri i saj, Qasja e memories direkte 32 (DMA32) është një zonë që gjendet vetëm në Linux 64-bit. Është memorie e ulët prej 4 GB. Linux që funksionon në kompjuterë 32-bitësh mund të bëjë DMA vetëm për këtë sasi RAM (përveç nëse ata përdorin kernelin e shtrirjes fizike të adresës (PAE)), kështu që zona e mori emrin e saj. Edhe pse, në kompjuterët 32-bit, ai quhet HighMem.
  • Normal: Në kompjuterët 64-bit, memoria normale është e gjithë RAM-i mbi 4 GB (përafërsisht). Në makinat 32-bitëshe, është RAM midis 16 MB dhe 896 MB.
  • HighMem: Kjo ekziston vetëm në kompjuterët Linux 32-bit. Është e gjitha RAM mbi 896 MB, duke përfshirë RAM mbi 4 GB në makina mjaft të mëdha.

Vlera PAGESIZE

RAM-i ndahet në faqe, të cilat janë të një madhësie fikse. Kjo madhësi përcaktohet nga kerneli në kohën e nisjes duke zbuluar arkitekturën e kompjuterit. Zakonisht madhësia e faqes në një kompjuter Linux është 4 Kbajt.

Ju mund të shihni madhësinë e faqes tuaj duke përdorur komandën getconf:

getconf PAGESIZE

Zonat janë të bashkangjitura me nyjet

Zonat janë bashkangjitur në nyje. Nyjet janë të lidhura me një Njësi Qendrore të Përpunimit (CPU). Kerneli do të përpiqet të ndajë memorie për një proces që ekzekutohet në një CPU nga nyja e lidhur me atë CPU.

Koncepti i lidhjes së nyjeve me CPU-të lejon që llojet e përziera të memories të instalohen në kompjuterë të specializuar me shumë CPU, duke përdorur arkitekturën e aksesit të kujtesës jo të njëtrajtshme.

Kjo është e gjitha shumë e nivelit të lartë. Kompjuteri mesatar Linux do të ketë një nyje të vetme, të quajtur nyja zero. Të gjitha zonat do t'i përkasin asaj nyje. Për të parë nyjet dhe zonat në kompjuterin tuaj, shikoni brenda skedarit /proc/buddyinfo. Ne do të përdorim më pak për ta bërë këtë:

less /proc/buddyinfo

Ky është dalja nga kompjuteri 64-bit mbi të cilin është hulumtuar ky artikull:

Node 0, zone DMA   1  1  1  0  2  1  1  0  1  1  3
Node 0, zone DMA32 2 67 58 19  8  3  3  1  1  1 17

Ekziston një nyje e vetme, nyja zero. Ky kompjuter ka vetëm 2 GB RAM, kështu që nuk ka zonë Normale. Ka vetëm dy zona, DMA dhe DMA32.

Çdo kolonë përfaqëson numrin e faqeve të disponueshme të një madhësie të caktuar. Për shembull, për zonën DMA32, duke lexuar nga e majta:

  • 2: Ka 2 nga 2^(0*PAGESIZE) pjesë të memories.
  • 67: Ka 67 nga 2^(1*PAGE_SIZE) pjesë të memories.
  • 58: Ekzistojnë 58 nga 2^(2*PAGESIZE) copa memorie të disponueshme.
  • Dhe kështu me radhë, deri në…
  • 17: Janë 17 nga 2^(512*PAGESIZE) pjesë.

Por në të vërtetë, e vetmja arsye që ne po e shikojmë këtë informacion është të shohim marrëdhënien midis nyjeve dhe zonave.

Faqet e skedarëve dhe faqet anonime

Hartimi i kujtesës përdor grupe hyrjesh në tabelën e faqeve për të regjistruar se cilat faqe memorie përdoren dhe për çfarë.

Hartëzimi i memories mund të jetë:

  • Skedari i mbështetur: Hartografitë e mbështetura nga skedarët përmbajnë të dhëna që janë lexuar nga një skedar. Mund të jetë çdo lloj skedari. Gjëja e rëndësishme që duhet të theksohet është se nëse sistemi e lironte këtë memorie dhe kishte nevojë t'i merrte ato të dhëna përsëri, ajo mund të lexohet nga skedari edhe një herë. Por, nëse të dhënat janë ndryshuar në memorie, ato ndryshime do të duhet të shkruhen në skedarin në hard disk përpara se kujtesa të lirohet. Nëse kjo nuk do të ndodhte, ndryshimet do të humbnin.
  • Anonim: Kujtesa anonime është një hartë e kujtesës pa asnjë skedar ose pajisje që e mbështet atë. Këto faqe mund të përmbajnë memorie të kërkuar në lëvizje nga programet për të mbajtur të dhëna, ose për gjëra të tilla si grumbulli dhe grumbulli. Për shkak se nuk ka asnjë skedar pas këtij lloji të të dhënave, duhet të caktohet një vend i veçantë për ruajtjen e të dhënave anonime. Ai vend është ndarja e shkëmbimit ose skedari i shkëmbimit. Të dhënat anonime shkruhen për t'u ndërruar përpara se të lirohen faqet anonime.
  • Pajisja e mbështetur: Pajisjet adresohen përmes skedarëve të bllokut të pajisjes që mund të trajtohen sikur të ishin skedarë. Të dhënat mund të lexohen prej tyre dhe t'u shkruhen atyre. Një hartë e kujtesës e mbështetur nga një pajisje ka të dhëna nga një pajisje e ruajtur në të.
  • Shpërnda: Hyrjet e shumëfishta të tabelës së faqeve mund të vendosen në të njëjtën faqe të RAM-it. Qasja në vendndodhjet e kujtesës përmes ndonjë prej hartave do të tregojë të njëjtat të dhëna. Procese të ndryshme mund të komunikojnë me njëri-tjetrin në një mënyrë shumë efikase duke ndryshuar të dhënat në këto lokacione memorie të vëzhguara bashkërisht. Hartografitë e përbashkëta të shkruara janë një mjet i zakonshëm për arritjen e komunikimeve ndër-procesore me performancë të lartë.
  • Kopjo në shkrim: Kopjimi në shkrim është një teknikë e alokimit dembel. Nëse kërkohet një kopje e një burimi tashmë në memorie, kërkesa plotësohet duke kthyer një hartë në burimin origjinal. Nëse një nga proceset që ndan burimin përpiqet t'i shkruajë atij, burimi duhet të përsëritet vërtet në memorie për të lejuar që ndryshimet të bëhen në kopjen e re. Pra, shpërndarja e memories bëhet vetëm në komandën e parë të shkrimit.

Për shkëmbim, ne duhet të shqetësohemi vetëm me dy të parat në listë: faqet e skedarëve dhe faqet anonime.

Ndërrimi

Këtu është përshkrimi i shkëmbimit nga dokumentacioni Linux në GitHub:

\Ky kontroll përdoret për të përcaktuar se sa agresive (sic) kerneli do të shkëmbejë faqet e memories. Vlerat më të larta do të rrisin agresivitetin, vlerat më të ulëta ulin sasinë e shkëmbimit. Një vlerë prej 0 udhëzon kernelin të mos fillojë shkëmbimin derisa Sasia e faqeve të lira dhe të mbështetura me skedarë është më e vogël se niveli i lartë i ujit në një zonë.

Vlera e paracaktuar është 60.\

Kjo tingëllon si këmbimi kthehet në shkëmbim lart ose poshtë në intensitet. Është interesante që ai thotë se vendosja e shkëmbimit në zero nuk e çaktivizon shkëmbimin. Ai udhëzon kernelin të mos ndërrojë derisa të plotësohen disa kushte. Por ende mund të ndodhë shkëmbimi.

Le të gërmojmë më thellë. Këtu është përkufizimi dhe vlera e paracaktuar e vm_swappiness në skedarin e kodit burimor të kernelit vmscan.c:

/*
* Nga 0 .. 100. Më e lartë do të thotë më e shkëmbyer.
*/
int vm_swappiness=60;

Vlera e shkëmbimit mund të variojë nga 0 në 100. Përsëri, komenti sigurisht tingëllon sikur vlera e shkëmbimit ka një ndikim në sasinë e shkëmbimit, me një shifër më të lartë që çon në më shumë shkëmbime.

Më tej në skedarin e kodit burimor, mund të shohim se një ndryshoreje të re të quajtur swappiness i është caktuar një vlerë që kthehet nga funksioni mem_cgroup_swappiness(). Disa gjurmime të tjera përmes kodit burimor do të tregojnë se vlera e kthyer nga ky funksion është vm_swappiness. Pra, tani, ndryshorja swappiness është caktuar të jetë e barabartë me çfarëdo vlere në të cilën është caktuar vm_swappiness.

int swappiness=mem_cgroup_swappiness(memcg);

Dhe pak më poshtë në të njëjtin skedar të kodit burimor, shohim këtë:

/*
* Me shkëmbimin në 100, anonim dhe skedar kanë të njëjtin prioritet.
* Ky prioritet skanimi është në thelb i anasjellta e kostos së IO.
*/
anon_prio=shkëmbim;
file_prio=200 - anon_prio;

Kjo eshte interesante. Dy vlera të dallueshme rrjedhin nga swappiness. Variablat anon_prio dhe file_prio  i mbajnë këto vlera. Ndërsa njëra rritet, tjetra zvogëlohet dhe anasjelltas.

Vlera e shkëmbimit të Linux në fakt vendos raportin ndërmjet dy vlerave.

Raporti i Artë

Faqet e skedarëve mbajnë të dhëna që mund të merren lehtësisht nëse ajo memorie lirohet. Linux thjesht mund ta lexojë skedarin përsëri. Siç e kemi parë, nëse të dhënat e skedarit janë ndryshuar në RAM, ato ndryshime duhet të shkruhen në skedar përpara se faqja e skedarit të mund të lirohet. Por, sido që të jetë, faqja e skedarit në RAM mund të ripopullohet duke lexuar të dhënat nga skedari. Pra, pse të shqetësoheni duke shtuar këto faqe në ndarjen e shkëmbimit ose skedarin e shkëmbimit? Nëse keni nevojë për ato të dhëna përsëri, mund t'i lexoni ato nga skedari origjinal në vend të një kopjeje të tepërt në hapësirën e shkëmbimit. Pra, faqet e skedarëve nuk ruhen në shkëmbim. Ata janë ruajtur përsëri në skedarin origjinal.

Me faqe anonime, nuk ka asnjë skedar themelor të lidhur me vlerat në memorie. Vlerat në ato faqe janë arritur në mënyrë dinamike. Ju nuk mund t'i lexoni ato thjesht nga një skedar. Mënyra e vetme se si mund të rikuperohen vlerat anonime të kujtesës së faqeve është ruajtja e të dhënave diku përpara se të lirohet memoria. Dhe kjo është ajo që ka shkëmbimi. Faqet anonime që do t'ju duhet t'i referoni përsëri.

Por vini re se si për faqet e skedarëve ashtu edhe për faqet anonime, lirimi i kujtesës mund të kërkojë një shkrim në hard disk. Nëse të dhënat e faqes së skedarit ose të dhënat e faqes anonime kanë ndryshuar që nga shkrimi i fundit në skedar ose për t'u ndërruar, kërkohet një shkrim i sistemit të skedarëve. Për të rikuperuar të dhënat do të kërkohet një lexim i sistemit të skedarëve. Të dy llojet e rikthimit të faqeve janë të kushtueshme. Përpjekja për të reduktuar hyrjen dhe daljen e diskut të ngurtë duke minimizuar shkëmbimin e faqeve anonime vetëm sa rrit sasinë e hyrjes dhe daljes së hard disku që kërkohet për t'u marrë me faqet e skedarëve që shkruhen dhe lexohen nga skedarët.

Siç mund ta shihni nga pjesa e fundit e kodit, ekzistojnë dy variabla. Njëri quhet file_prio për përparësi skedari dhe tjetri i quajtur anon_prio për përparësi anonim.

  • Ndryshorja anon_prio është caktuar në vlerën e shkëmbimit të Linux.
  • Vlera file_prio është vendosur në 200 minus vlerën anon_prio.

Këto variabla mbajnë vlera që funksionojnë së bashku. Nëse të dyja vendosen në 100, ato janë të barabarta. Për çdo vlerë tjetër, anon_prio do të ulet nga 100 në 0 dhe file_prio do të rritet nga 100 në 200. Dy vlerat futen në një algoritëm të komplikuar që përcakton nëse kerneli Linux funksionon me një preferencë për të rimarrë (liruar)  faqe skedarësh ose faqe anonime.

Ju mund të mendoni për file_prio si gatishmërinë e sistemit për të liruar faqet e skedarëve dhe anon_prio si gatishmërinë e sistemit për të liruar faqe anonime. Ajo që këto vlera nuk bëjnë është të caktojnë çdo lloj shkasjeje ose pragu për kur shkëmbimi do të përdoret. Kjo është vendosur diku tjetër.

Por, kur kujtesa duhet të lirohet, këto dy variabla - dhe raporti ndërmjet tyre - merren në konsideratë nga algoritmet e rikuperimit dhe shkëmbimit për të përcaktuar se cilat lloje faqesh konsiderohen preferenciale për lirim. Dhe kjo dikton nëse aktiviteti i lidhur me hard diskun do të jetë përpunimi i skedarëve për faqet e skedarëve ose shkëmbimi i hapësirës për faqet anonime.

Kur ndërpritet në të vërtetë shkëmbimi?

Kemi vërtetuar se vlera e shkëmbimit të Linux vendos një preferencë për llojin e faqeve të kujtesës që do të skanohen për rikuperim të mundshëm. Kjo është mirë, por diçka duhet të vendosë kur shkëmbimi do të shkurtohet.

Çdo zonë memorie ka një shenjë të lartë uji dhe një shenjë të ulët të ujit. Këto janë vlera që rrjedhin nga sistemi. Ato janë përqindje e RAM-it në secilën zonë. Janë këto vlera që përdoren si kufijtë e nxitjes së shkëmbimit.

Për të kontrolluar se cilat janë shenjat tuaja të larta dhe të ulëta të ujit, shikoni brenda skedarit /proc/zoneinfo me këtë komandë:

less /proc/zoneinfo

Secila prej zonave do të ketë një grup vlerash memorie të matura në faqe. Këtu janë vlerat për zonën DMA32 në makinën e testimit. Shenja e ulët e ujit është 13966 faqe, dhe shenja e lartë e ujit është 16759 faqe:

  • Në kushte normale funksionimi, kur memoria e lirë në një zonë bie nën pikën e ulët të ujit të zonës, algoritmi i shkëmbimit fillon të skanojë faqet e kujtesës duke kërkuar memorie që mund të rimarrë, duke marrë parasysh vlerat relative të anon_prio dhe file_prio.
  • Nëse vlera e shkëmbimit të Linux është vendosur në zero, shkëmbimi ndodh kur vlera e kombinuar e faqeve të skedarëve dhe faqeve të lira është më e vogël se vlera e lartë e ujit.

Kështu që mund të shihni se nuk mund të përdorni vlerën e shkëmbimit të Linux për të ndikuar në sjelljen e shkëmbimit në lidhje me përdorimin e RAM-it. Thjesht nuk funksionon kështu.

Çfarë duhet të vendoset shkëmbimi?

Kjo varet nga hardueri, ngarkesa e punës, lloji i diskut dhe nëse kompjuteri juaj është desktop apo server. Natyrisht, kjo nuk do të jetë një madhësi e përshtatshme për të gjitha llojet e cilësimeve.

Dhe duhet të keni parasysh se shkëmbimi nuk përdoret vetëm si një mekanizëm për të liruar RAM-in kur të mbaron hapësira e memories. Swap është një pjesë e rëndësishme e një sistemi që funksionon mirë dhe pa të, menaxhimi i arsyeshëm i kujtesës bëhet shumë i vështirë për Linux-in.

Ndryshimi i vlerës së shkëmbimit të Linux-it ka një efekt të menjëhershëm; nuk keni nevojë të rindizni. Kështu që ju mund të bëni rregullime të vogla dhe të monitoroni efektet. Në mënyrë ideale, ju do ta bëni këtë gjatë një periudhe ditësh, me lloje të ndryshme aktivitetesh në kompjuterin tuaj, për t'u përpjekur të gjeni sa më afër një cilësime ideale që mundeni.

Këto janë disa pika për t'u marrë parasysh:

  • Përpjekja për të çaktivizuar shkëmbimin duke vendosur vlerën e ndërrimit të Linux në zero, thjesht e zhvendos aktivitetin e diskut të ngurtë të lidhur me shkëmbimin në aktivitetin e diskut të lidhur me skedarët.
  • Nëse keni hard disqe mekanike të vjetruara, mund të provoni të reduktoni vlerën e ndërrimit të Linux për të larguar nga rikuperimi anonim i faqeve dhe për të reduktuar ndarjen e ndarjes së shkëmbimit. Natyrisht, ndërsa refuzoni njërin cilësim, cilësimi tjetër rritet. Zvogëlimi i ndryshimit të shkëmbimit ka të ngjarë të rrisë shpërndarjen e sistemit të skedarëve. Por kompjuteri juaj mund të jetë më i lumtur duke favorizuar një metodë mbi tjetrën. Në të vërtetë, e vetmja mënyrë për ta ditur me siguri është të provosh dhe të shohësh.
  • Për serverët me një qëllim të vetëm, siç janë serverët e bazës së të dhënave, mund të merrni udhëzime nga furnizuesit e softuerit të bazës së të dhënave. Shumë shpesh, këto aplikacione kanë cache-in e skedarëve dhe rutinat e tyre të menaxhimit të kujtesës të dizajnuara për qëllimin, në të cilat do të ishte më mirë të mbështeteshit. Ofruesit e softuerit mund të sugjerojnë një vlerë të ndërrimit të Linux-it sipas specifikimeve të makinës dhe ngarkesës së punës.
  • Për përdoruesin mesatar të desktopit me pajisje relativisht të fundit? Lëreni ashtu siç është.

Si të vendosni vlerën e shkëmbimit të Linux

Përpara se të ndryshoni vlerën tuaj të shkëmbimit, duhet të dini se cila është vlera e saj aktuale. Nëse doni ta zvogëloni pak, pyetja është pak më pak se çfarë? Mund ta zbuloni me këtë komandë:

cat /proc/sys/vm/swappiness

Për të konfiguruar vlerën e shkëmbimit, përdorni komandën  sysctl  :

sudo sysctl vm.swappiness=45

Vlera e re përdoret menjëherë, nuk kërkohet rindezje.

Në fakt, nëse rindizni, vlera e swappiness do të kthehet në vlerën e saj të paracaktuar prej 60. Kur të keni mbaruar eksperimentimin dhe të keni vendosur për vlerën e re që dëshironi të përdorni, mund ta bëni atë të qëndrueshme gjatë rindezjeve duke e shtuar në < skedar/etc/sysctl.conf. Ju mund të përdorni cilindo redaktues që preferoni. Përdorni komandën e mëposhtme për të redaktuar skedarin me redaktorin nano:

sudo nano /etc/sysctl.conf

Kur të hapet nano, lëvizni në fund të skedarit dhe shtoni këtë rresht. Ne po përdorim 35 si vlerë të përhershme të shkëmbimit. Ju duhet të zëvendësoni vlerën që dëshironi të përdorni.

vm.swappiness=35

Për të ruajtur ndryshimet tuaja dhe për të dalë nga nano, shtypni “Ctrl+O”, shtypni “Enter” dhe shtypni “Ctrl+Z”.

Menaxhimi i kujtesës është kompleks

Menaxhimi i kujtesës është i ndërlikuar. Dhe kjo është arsyeja pse, për përdoruesin mesatar, zakonisht është më mirë ta lini atë në dorën e kernelit.

Është e lehtë të mendosh se po përdor më shumë RAM sesa jeni. Shërbimet si top dhe falas mund të japin përshtypjen e gabuar. Linux do të përdorë RAM falas për një sërë qëllimesh të veta, si për shembull për të ruajtur memorien e diskut. Kjo rrit artificialisht figurën e kujtesës të përdorur dhe zvogëlon figurën e kujtesës të lirë. Në fakt, RAM-i i përdorur si cache i diskut shënohet si i përdorur dhe i disponueshëm, sepse mund të rikthehet në çdo kohë, shumë shpejt.

Për të pa iniciuarit që mund të duket sikur shkëmbimi nuk funksionon, ose se vlera e shkëmbimit duhet të ndryshojë.

Si gjithmonë, djalli është në detaje. Ose, në këtë rast, demon. Daemon i shkëmbimit të kernelit.

RELATED: Best Linux Laptops for Developers and Enthusiasts