Performanța Linux: De ce ar trebui să adăugați aproape întotdeauna spațiu de swap

Știm că utilizarea spațiului de swap Linux în loc de RAM (memorie) poate încetini serios performanța. Deci, cineva s-ar putea întreba, din moment ce am mai mult decât suficientă memorie disponibilă, nu ar fi mai bine să șterg spațiul swap? Răspunsul scurt este: Nu. Există beneficii de performanță atunci când spațiul swap este activat, chiar și atunci când aveți mai mult decât suficientă memorie RAM. Actualizare, consultați și partea 2: Performanța Linux: Aproape întotdeauna adăugați swap (ZRAM).

Chiar dacă aveți instalată o memorie server mai mult decât suficientă, veți constata adesea că spațiul swap va fi utilizat după perioade lungi de funcționare. Vedeți exemplul de mai jos de pe un server live-chat cu aproximativ o lună de funcționare:

 total used free shared buff/cache availableMem: 3.7G 1.0G 445M 84M 2.2G 2.2GSwap: 1.8G 308M 1.5G

Eșantionul de ieșire al free -h de aici arată 308M de spațiu swap folosit. Când am rulat verificări pentru swapping, nu au existat semne de activitate I/O swap în curs de desfășurare sau intempestivă. De asemenea, serviciul kswap nu a consumat mult timp de CPU. De fapt, procesul kswap nu era de găsit nicăieri în top (top procese ordonate după timpul CPU). Pentru a confirma, am folosit următoarea comandă:

ps -A | grep kswap 40 ? 00:00:29 kswapd0

…deci, în acest caz, ca și în multe altele, utilizarea swap nu afectează performanța serverului Linux. Acum, să ne uităm la modul în care spațiul swap poate ajuta de fapt performanța serverului Linux.

Update: Recent, am instalat Manjoro i3 pe Pinebook Pro. Acesta vine acum cu ZRAM activat în mod implicit.

Vantajele spațiului de swap pe sistemele cu memorie RAM adecvată

atop 512GB server - 2GB swap folosit

atop 512GB server - 2GB swap folosit

Este normal și poate fi un lucru bun ca sistemele Linux să folosească ceva swap, chiar dacă există încă memorie RAM disponibilă. Kernelul Linux va muta paginile de memorie care nu sunt utilizate aproape niciodată în spațiul de swap pentru a se asigura că este disponibil și mai mult spațiu de stocare în memorie pentru paginile de memorie utilizate mai frecvent (o pagină este o bucată de memorie). Utilizarea swap-ului devine o problemă de performanță atunci când Kernel-ul este presat să mute continuu pagini de memorie în și din memorie și din spațiul swap.

Un alt avantaj este că swap-ul oferă administratorilor timp pentru a reacționa la problemele de memorie redusă. De multe ori vom observa că serverul se comportă lent și, la conectare, vom observa un swapping intens. Fără swap (așa cum este descris în secțiunea următoare), rămânerea fără memorie poate crea reacții în lanț mult mai bruște și mai grave. Așadar, de obicei, vă sfătuiesc să setați spațiul de swap la aproximativ dimensiunea celui mai mare proces. De exemplu, memoria configurată de MySQL în my.cnf. Poate fi chiar mai mică, mai ales dacă aveți monitorizare și/sau alertă.

Cei care recomandă nici un spațiu de swap sau o dimensiune a spațiului de swap puțin mai mare decât memoria RAM totală. Dacă puteți veni cu motive valide pentru acest lucru, atunci poate că aceasta este alegerea dvs. Cu toate acestea, nu prea este cazul pe servere și ar trebui, în schimb, să vă echilibrați decizia în funcție de efectele pe care swap-ul le va avea asupra aplicațiilor dvs. specifice. Swap-ul nu schimbă cantitatea de memorie RAM necesară pentru un server sănătos, sau pentru un desktop, de altfel. Este conceput pentru a fi complementar performanțelor sistemelor sănătoase.

Pentru a rezuma:
– Chiar dacă există încă memorie RAM disponibilă, Kernel-ul Linux va muta în spațiul swap paginile de memorie care nu sunt folosite aproape niciodată.
– Este mai bine să schimbați paginile de memorie care au fost inactive pentru o perioadă de timp, păstrând în memoria cache datele folosite des, iar acest lucru ar trebui să se întâmple atunci când serverul este cel mai inactiv, acesta fiind scopul Kernel-ului.
– Evitați să setați spațiul de swap prea mare dacă acest lucru va avea ca rezultat prelungirea problemelor de performanță, a întreruperilor sau a timpului de răspuns (fără o monitorizare/alertă adecvată).

Swap Space vs. No Swap atunci când memoria disponibilă este scăzută

În mod diferit de cazul de mai sus, dacă nu aveți suficientă memorie, swap va fi folosit destul de des și vizibil mai mult în timpul oricăror vârfuri de cerere de memorie. Dacă nu aveți suficientă memorie și nu aveți spațiu de swap, acest lucru va cauza adesea eșecul alocării de memorie pentru cererile care au nevoie de mai multe pagini de memorie. În ultimă instanță, Kernel-ul va implementa OOM killer pentru a distruge procesele cu memorie mare (de obicei MySQL, java etc.).

Pentru o privire mai detaliată asupra spațiului de swap Linux, citiți capitolele Swap Management și Page Frame Reclamation din documentația Kernel.org. De asemenea, consultați ultima secțiune, „Kernel cache pressure and swappiness”, din cealaltă postare a mea de pe blog pentru sfaturi privind reglarea utilizării spațiului de swap Linux de către Kernel. Dacă spațiul de swap „utilizat” este întotdeauna „0”, atunci aveți într-adevăr o tonă de memorie RAM disponibilă în mod liber, caz în care ar putea fi sigur să eliminați spațiul de swap… sau puteți ajusta presiunea de cache a Kernel-ului pentru a utiliza și mai multă memorie RAM.

Pentru a rezuma:
– Swap I/O scalează foarte prost. Dacă paginile de memorie nu pot fi schimbate doar atunci când serverul este inactiv, ar trebui să reglați sau să dezactivați swap-ul. Acesta nu este de obicei cazul, de unde și titlul „aproape întotdeauna” al acestui articol de blog.
– Cu swap dezactivat, problemele de performanță devin vizibile foarte repede, iar ucigașul OOM vă poate prinde! 🙂

Pentru comparație, iată ieșirea lui free folosind o versiune mai veche de free din procps-ng-3.3.1 pe același server:

 total used free shared buffers cachedMem: 3.7G 3.3G 445M 0B 4.2M 1.7G-/+ buffers/cache: 1.6G 2.1GSwap: 1.8G 308M 1.5G

Presiunea cache-ului kernelului și swappiness

Acum că aveți swap activat. Luați în considerare ajustarea presiunii cache-ului serverului dvs. și a tendinței de a face swap (vm.swappiness) urmând ghidul de mai jos, care este din articolul anterior: Serverul Linux are nevoie de o actualizare a memoriei RAM? Verificați cu top, free, vmstat și sar:

vfs_cache_pressure – Controlează tendința kernelului de a recupera memoria, care este utilizată pentru memoria cache a obiectelor de directoare și inode. (valoare implicită = 100, valoare recomandată între 50 și 200)

swappiness – Acest control este utilizat pentru a defini cât de agresiv va schimba paginile de memorie în kernel. Valorile mai mari vor crește agresivitatea; valorile mai mici scad cantitatea de swap. (implicit = 60, valori recomandate între 1 și 60) Eliminați swap-ul pentru valoarea 0, dar de obicei nu este recomandat în majoritatea cazurilor.

Pentru a edita, puteți adăuga sau înlocui aceste linii în fișierul /etc/sysctl.conf. De exemplu, dacă aveți puțină memorie până la upgrade, puteți încerca ceva de genul:

vm.swappiness=10vm.vfs_cache_pressure=200

Acest lucru va crește presiunea cache-ului, ceea ce poate părea oarecum contraproductiv, deoarece cache-ul este bun pentru performanță. Cu toate acestea, schimburile prea frecvente reduc semnificativ mai mult performanța generală a serverului dumneavoastră. Așadar, faptul de a nu păstra atât de mult cache în memorie va ajuta la reducerea activității de swap. De asemenea, cu vm.swappiness setat la 10 sau chiar la 1, va reduce swapping-ul pe disc.

Pe un server sănătos, cu multă memorie disponibilă, utilizați următoarele:

vm.swappiness=10vm.vfs_cache_pressure=50

Aceasta va reduce presiunea cache-ului. Deoarece memoria cache este bună pentru performanță, dorim să păstrăm datele din memoria cache în memorie mai mult timp. Since the cache will grow larger, we still want to reduce swapping to not cause increased swap I/O.

To check current values using these commands use:

sudo cat /proc/sys/vm/swappinesssudo cat /proc/sys/vm/vfs_cache_pressure

To enable these settings temporarily without rebooting, use the following commands:

sudo sysctl -w vm.swappiness=10sudo sysctl -w vm.vfs_cache_pressure=50