Linux teljesítmény:
Tudjuk, hogy a Linux swap-tér használata a RAM (memória) helyett jelentősen lassíthatja a teljesítményt. Így felmerülhet a kérdés, hogy mivel több mint elég memória áll rendelkezésemre, nem lenne jobb, ha törölném a swap helyet? A rövid válasz: Nem. A swap-tér engedélyezése teljesítményelőnyökkel jár, még akkor is, ha több mint elegendő rammal rendelkezünk. Frissítés, lásd még a 2. részt: Linux teljesítmény: Almost Always Add Swap (ZRAM).
Még a megfelelőnél több szervermemória telepítése esetén is gyakran tapasztalható, hogy a swap-tér hosszú üzemidő után is használatban lesz. Lásd az alábbi példát egy körülbelül egy hónapos üzemidővel rendelkező live-chat szerverről:
total used free shared buff/cache availableMem: 3.7G 1.0G 445M 84M 2.2G 2.2GSwap: 1.8G 308M 1.5G
A free -h
kimenete itt 308M használt swap helyet mutat. Amikor lefuttattam a swapolás ellenőrzését, nem volt jele folyamatos vagy idő előtti swap I/O tevékenységnek. A kswap szolgáltatás sem fogyasztott sok CPU-időt. Valójában a kswap folyamatot sehol sem lehetett megtalálni a topban (CPU idő szerint rendezett top folyamatok). A megerősítéshez a következő parancsot használtam:
ps -A | grep kswap 40 ? 00:00:29 kswapd0
…tehát ebben az esetben, mint sok más esetben, a swap használat nem árt a Linux szerver teljesítményének. Most pedig nézzük meg, hogyan segítheti a swap tárhely ténylegesen a Linux szerver teljesítményét.
frissítés: Nemrég telepítettem a Manjoro i3-at a Pinebook Prómra. Most már alapértelmezés szerint engedélyezett a ZRAM.
A swap-tér előnyei megfelelő RAM-mal rendelkező rendszereken
Normális és jó dolog lehet, hogy a Linux rendszerek akkor is használnak némi swapot, ha van még szabad RAM. A Linux Kernel a ritkán használt memóriaoldalakat a swap-térbe helyezi át, hogy még több gyorsítótárazható hely álljon rendelkezésre a memóriában a gyakrabban használt memóriaoldalak számára (egy oldal egy darab memória). A swap-használat akkor válik teljesítményproblémává, amikor a Kernel kénytelen folyamatosan memóriaoldalakat mozgatni a memóriából és a swap-térből.
Egy másik előnye, hogy a swap időt ad a rendszergazdáknak, hogy reagáljanak a memóriahiányos problémákra. Gyakran észrevesszük, hogy a szerver lassan viselkedik, és bejelentkezéskor észrevesszük az erős swapolást. Swap nélkül (a következő részben leírtak szerint) a memória kifogyása sokkal hirtelenebb és súlyosabb láncreakciókat okozhat. Ezért általában azt tanácsolom, hogy a swapterületet körülbelül a legnagyobb folyamat méretére állítsuk be. Például a MySQL konfigurált memóriája a my.cnf-ben. Ez akár kisebb is lehet, különösen, ha van monitorozás és/vagy riasztás.
Néhányan azt javasolják, hogy ne legyen swap vagy a swap mérete valamivel nagyobb legyen, mint a teljes RAM. Ha erre érvényes indokokat tudsz felhozni, akkor talán ez a te választásod. A szervereken azonban aligha ez a helyzet, és ehelyett inkább a swapnak az adott alkalmazásokra gyakorolt hatásai alapján kell mérlegelnie a döntését. A swap nem változtatja meg az egészséges szerverhez, vagy akár az asztali számítógéphez szükséges RAM mennyiségét. Úgy tervezték, hogy kiegészítse az egészséges rendszerek teljesítményét.
Összefoglalva:
– Még ha van is szabad RAM, a Linux Kernel akkor is a swap-térbe fogja áthelyezni az alig használt memóriaoldalakat.
– Jobb, ha a már egy ideje inaktív memóriaoldalakat kicseréljük, a gyakran használt adatokat a gyorsítótárban tartjuk, és ennek akkor kell megtörténnie, amikor a szerver a leginkább üresjáratban van, ami a Kernel célja.
– Kerülje a swapterület túl nagy beállítását, ha ez a teljesítményproblémák, a kiesések vagy a válaszidő meghosszabbodását eredményezi (megfelelő monitorozás/jelzések nélkül).
Swapterület vs. nincs swap, ha kevés a rendelkezésre álló memória
A fenti esettől eltérően, ha nincs elég memóriája, a swapot elég gyakran és érezhetően többet fogja használni bármilyen memóriaigény-csúcs idején. Ha nincs elég memóriája és nincs swap-helye, akkor gyakran előfordul, hogy nem sikerül memóriát allokálni a több memóriaoldalt igénylő kérésekhez. Végső megoldásként a Kernel OOM-gyilkost vet be a nagy memóriaigényű folyamatok (általában MySQL, java stb.) kiiktatására.
A Linux swap-tér részletesebb áttekintéséhez olvassa el a Swap Management and Page Frame Reclamation fejezeteket a Kernel.org docs-ban. Továbbá, nézd meg a másik blogbejegyzésem utolsó, “Kernel cache pressure and swappiness” című fejezetét a Linux swap space használatának Kernel általi hangolására vonatkozó tippekért. Ha a “használt” swap-tér mindig “0”, akkor valóban rengeteg szabad RAM-od van, ebben az esetben nyugodtan eltávolíthatod a swap-térséget… vagy beállíthatod a Kernel gyorsítótár-nyomását, hogy még több RAM-ot használhass ki.
Összefoglalva:
– A swap I/O nagyon rosszul skálázódik. Ha a memóriaoldalakat nem lehet csak akkor swapolni, amikor a szerver üresjáratban van, akkor érdemes a swapot tuningolni vagy letiltani. Ez általában nem így van, ezért a blogbejegyzés címe “majdnem mindig”.
– A swap letiltásával a teljesítményproblémák nagyon gyorsan észrevehetővé válnak, és az OOM-gyilkos elkaphat! 🙂
Összehasonlításképpen itt van a free kimenete a free egy régebbi verziójával a procps-ng-3.3.1-ből ugyanazon a szerveren:
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
Kernel cache nyomás és swappiness
Most, hogy a swap engedélyezve van. Fontolja meg a szerver gyorsítótárnyomásának és a swapolásra való hajlamának (vm.swappiness) beállítását az alábbi útmutatót követve, amely az előző cikkből származik: Linux szerver RAM frissítésre szorul? Check with top, free, vmstat, and sar:
vfs_cache_pressure – Szabályozza a kernel hajlamát a memória visszakövetelésére, amelyet a könyvtár- és inode-objektumok gyorsítótárazására használ. (alapértelmezett = 100, ajánlott érték 50 és 200 között)
swappiness – Ezzel a vezérlővel határozható meg, hogy a kernel mennyire agresszívan cserélje a memóriaoldalakat. A magasabb értékek növelik az agresszivitást; az alacsonyabb értékek csökkentik a swapolás mennyiségét. (alapértelmezett = 60, ajánlott értékek 1 és 60 között) 0 érték esetén eltávolíthatja a swapot, de általában a legtöbb esetben nem ajánlott.
A szerkesztéshez ezeket a sorokat az /etc/sysctl.conf fájlban hozzáadhatja vagy kicserélheti. Ha például kevés memóriád van a frissítésig, kipróbálhatsz valami olyasmit, mint:
vm.swappiness=10vm.vfs_cache_pressure=200
Ez növeli a gyorsítótár nyomását, ami kissé kontraproduktívnak tűnhet, mivel a gyorsítótár jót tesz a teljesítménynek. A túl gyakori cserélgetés azonban lényegesen jobban csökkenti a szerver általános teljesítményét. Tehát ha nem tartasz annyi gyorsítótárat a memóriában, az segít csökkenteni a swap-tevékenységet. Emellett a vm.swappiness 10-re vagy akár 1-re állítva csökkenti a lemezek cseréjét.
Egy egészséges szerveren, ahol sok a rendelkezésre álló memória, használd a következőket:
vm.swappiness=10vm.vfs_cache_pressure=50
Ez csökkenti a gyorsítótár nyomását. Mivel a gyorsítótárazás jót tesz a teljesítménynek, a gyorsítótárazott adatokat hosszabb ideig szeretnénk a memóriában tartani. 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