Vraag Waarom wordt swap gebruikt, hoewel ik voldoende gratis RAM heb?


Ik dacht dat de hele essentie van swap was om op te treden als een tijdelijk opslag-vangnet toen RAM vol was, maar mijn swap-partitie wordt constant gebruikt, hoewel ik soms wel 3 GB gratis RAM heb. Is dit normaal?


183
2018-06-29 22:16


oorsprong


Deel de inhoud of de uitvoer van de volgende opdrachten / bestanden om ons beter te helpen bij het oplossen van uw probleem (instructies in dit antwoord): free -m, top -b 1 - ish
Zal de vraag met pastebins van die bevelen morgen bijwerken. Het is nu 12 uur :( - Mysterio
Ik zou de titel moeten aanpassen om toe te voegen "... maar ik ben te slaperig om nu te zorgen, dus jullie doen ook een dutje": P - ish


antwoorden:


Je zou kunnen proberen om je "swappiness" -waarde te veranderen:

Van de Ubuntu's veelgestelde vragen over swappen:

Wat is ruzie en hoe kan ik dit veranderen?

De swappiness-parameter bepaalt de neiging van de kernel om processen uit het fysieke geheugen en naar de verwisselbare schijf te verplaatsen. Omdat schijven veel langzamer zijn dan RAM, kan dit leiden tot tragere reactietijden voor systeem en toepassingen als processen te agressief uit het geheugen worden verplaatst.

  1. swappiness kan een waarde tussen 0 en 100 hebben

  2. swappiness = 0 vertelt de kernel om te voorkomen dat processen zo lang mogelijk uit het fysieke geheugen worden geruild

  3. swappiness = 100 vertelt de kernel om processen agressief uit het fysieke geheugen te wisselen en ze te verplaatsen naar cache verwisselen

De standaardinstelling in Ubuntu is swappiness = 60. Het verlagen van de standaardwaarde van swappiness zal waarschijnlijk de algehele prestaties voor een typische Ubuntu-desktopinstallatie verbeteren. Een waarde van swappiness = 10 wordt aanbevolen, maar u kunt gerust experimenteren. Opmerking: Ubuntu-serverinstallaties hebben andere prestatievereisten voor desktopsystemen en de standaardwaarde van 60 is waarschijnlijk meer geschikt.

Om de swappiness-waarde te controleren

cat /proc/sys/vm/swappiness

De swappiness-waarde wijzigen Een tijdelijke wijziging (verloren bij opnieuw opstarten) met een swappiness-waarde van 10 kan worden gemaakt met

sudo sysctl vm.swappiness=10

Om een ​​verandering permanent te maken, bewerk het configuratiebestand met je favoriete editor:

gksudo gedit /etc/sysctl.conf

Zoek naar vm.swappiness en verander de waarde ervan naar wens. Als vm.swappiness niet bestaat, voegt u het als volgt aan het einde van het bestand toe:

vm.swappiness=10

Sla het bestand op en start het opnieuw op.

Je kunt ook kijken naar: https://askubuntu.com/a/103916/54187


160
2018-06-29 23:10



Inactieve speculatie: dit zou zelfs een voordeel kunnen zijn voor de prestaties - pagina's die een tijdje niet zijn geopend, kunnen worden gekopieerd om ruimte te wisselen, waardoor het OS ze snel kan verwijderen als het ooit geheugen nodig heeft, maar de pagina-inhoud blijft in het geheugen . - Simon Richter
@SimonRichter Ja, dat is het idee. Swappiness of 60 is waarschijnlijk te agressief op moderne systemen, want dat betekent dat je begint uit te schakelen als je nog steeds meerdere optredens hebt met gratis geheugen. - Brendan Long
Rennen sudo sysctl --load=/etc/sysctl.conf na het bewerken van het bestand om de wijzigingen toe te passen - deFreitas


Er zijn een paar verschillende aspecten aan uw vraag.

Ten eerste, wat uw definitie van "gratis" is. Het is eigenlijk niet zo eenvoudig als het klinkt in Linux (of een modern besturingssysteem).

Hoe Linux RAM gebruikt (zeer vereenvoudigd)

Elke applicatie kan een deel van je geheugen gebruiken. Linux gebruikt alle anders onbezette herinneringen (behalve de laatste paar Mb) als "cache". Dit omvat de pagina-cache, inode-caches, enz. Dit is een goede zaak - het helpt dingen sneller te maken. Zowel schrijven naar schijf als lezen van schijf kan enorm worden versneld door cache.

In het ideale geval heb je genoeg geheugen voor al je applicaties en heb je nog steeds honderden Mb over voor cache. In deze situatie, zolang uw toepassingen hun geheugengebruik niet vergroten en het systeem niet worstelt om voldoende ruimte voor cache te krijgen, is er geen behoefte aan een swap.

Zodra applicaties meer RAM-geheugen claimen, gaat het eenvoudigweg naar een deel van de ruimte die werd gebruikt door cache, waardoor de cache kleiner werd. De toewijzing van cache is goedkoop en eenvoudig genoeg om het eenvoudig in realtime te doen - alles wat in de cache zit is ofwel een tweede kopie van iets dat al op de harde schijf staat, dus kan het onmiddellijk worden verwijderd, of het is iets dat we zouden willen hebben binnen enkele seconden naar de schijf moeten spoelen hoe dan ook.

Dit is geen specifieke situatie voor Linux - alle moderne besturingssystemen werken op deze manier. De verschillende besturingssystemen rapporteren mogelijk anders vrij RAM-geheugen: sommige bevatten de cache als onderdeel van wat ze als "gratis" beschouwen en sommige niet.

Als je praat over gratis RAM, is dat veel zinvoller omvatten cache, omdat het praktisch gratis is - het is beschikbaar voor elke toepassing die daarom vraagt. Op Linux, de free commando rapporteert het in beide richtingen - de eerste regel bevat cache in de gebruikte RAM-kolom, en de tweede regel bevat cache (en buffers) in de vrije kolom.

Hoe Linux swap gebruikt (nog eenvoudiger)

Zodra je genoeg geheugen hebt opgebruikt dat er niet genoeg is over voor een soepel lopende cache, kan Linux besluiten om een ​​ongebruikt toepassingsgeheugen opnieuw van het RAM-geheugen te verwisselen om te wisselen.

Het doet dit niet volgens een bepaalde grens. Het is niet zo dat je een bepaald percentage van de toewijzing bereikt, dan begint Linux te swappen. Het heeft een nogal "fuzzy" algoritme. Er is veel rekening mee gehouden, wat het best kan worden beschreven met "hoeveel druk er is voor de toewijzing van geheugen". Als er veel 'druk' is om nieuw geheugen toe te wijzen, vergroot dit de kans dat sommige worden uitgewisseld om meer ruimte te maken. Als er minder "druk" is, zal het deze kansen verminderen.

Uw systeem heeft een "swappiness" -instelling die u helpt bij het berekenen van hoe deze "druk" wordt berekend. Het is normaal gesproken niet aangeraden om dit helemaal te veranderen, en ik zou het niet aanraden om het aan te passen. Overstappen is over het algemeen een heel goede zaak - hoewel er een paar voorbeelden zijn waarbij het de prestaties schaadt, als je kijkt naar de algehele systeemprestaties, is het een nettovoordeel voor een breed scala aan taken. Als je de swappiness reduceert, laat je de hoeveelheid cachegeheugen iets meer krimpen dan anders, zelfs als het echt nuttig zou kunnen zijn. Of dit een goede genoeg ruil is voor welk probleem je ook hebt met ruilen, is aan jou. Je zou gewoon moeten weten wat je doet, dat is alles.

Er is een bekende situatie waarin swap de waargenomen prestaties op een desktopsysteem echt schaadt, en dat is in hoe snel applicaties opnieuw kunnen reageren op gebruikersinvoer nadat ze lange tijd niet-actief zijn geweest en achtergrondprocessen zwaar zijn in IO (zoals een 's nachts back-up) uitvoeren. Dit is een erg zichtbare traagheid, maar niet genoeg om het uitwisselen van alles en heel moeilijk te voorkomen in elk besturingssysteem. Schakel swap uit en deze aanvankelijke traagheid na de back-up / virusscan kan niet gebeuren, maar het systeem kan de hele dag een beetje langzamer draaien. Dit is ook geen situatie die beperkt is tot Linux.

Bij het kiezen van wat naar schijf moet worden geruild, probeert het systeem geheugen te kiezen dat niet daadwerkelijk wordt gebruikt - gelezen of geschreven van. Het heeft een vrij eenvoudig algoritme om dit te berekenen, dat meestal goed kiest.

Als je een systeem hebt met een grote hoeveelheid RAM (op het moment van schrijven is 8GB een enorme hoeveelheid voor een typische Linux distro), dan zul je zelden een situatie tegenkomen waarbij swap helemaal nodig is. U kunt zelfs proberen om te swappen. Ik adviseer nooit om dat te doen, maar alleen omdat je nooit weet wanneer meer RAM je kan redden van een crash van een programma. Maar als je weet dat je het niet nodig zult hebben, jij kan doe het.

Maar hoe kan swap versnellen mijn systeem? Worden trage dingen niet gewisseld?

Het overdragen van gegevens van RAM naar swap is een langzame bewerking, maar wordt alleen uitgevoerd wanneer de kernel er vrij zeker van is dat het algemene voordeel dit zal overtreffen. Als uw toepassingsgeheugen bijvoorbeeld is gestegen tot het punt dat u bijna geen cache meer hebt en uw I / O hierdoor erg inefficiënt is, kunt u daadwerkelijk veel meer snelheid uit uw systeem halen door geheugen vrij te maken, zelfs na de initiële kosten van het omwisselen van gegevens om het te bevrijden.

Het is ook een laatste redmiddel als uw applicaties dit daadwerkelijk vragen meer geheugen dan je eigenlijk hebt. In dit geval is swappen noodzakelijk om te voorkomen dat een situatie waarin het geheugen onvoldoende geheugenruimte heeft vaak tot gevolg heeft dat een toepassing vastloopt of geforceerd moet worden gedood.

Swappen is alleen geassocieerd met tijden waarin uw systeem slecht presteert omdat dit gebeurt op momenten dat u bijna geen bruikbare RAM meer heeft, wat uw systeem zou vertragen (of het onstabiel zou maken), zelfs als u geen swap had. Dus om dingen te vereenvoudigen, gebeurt wisselen omdat uw systeem verzandt in plaats van andersom.

Zodra gegevens in ruil zijn, wanneer komt het weer uit?

Het overbrengen van gegevens uit swap is (voor traditionele harde schijven, althans) net zo tijdrovend als het erin plaatsen. Het is begrijpelijk dat uw kernel net zo terughoudend zal zijn om gegevens van swap te verwijderen, vooral als deze niet daadwerkelijk wordt gebruikt (dwz gelezen of geschreven). Als je gegevens in ruil hebt en het niet wordt gebruikt, dan is het eigenlijk een goede zaak dat het in ruil blijft, omdat het meer geheugen vrijlaat voor andere dingen die zijn wordt gebruikt, waardoor uw systeem mogelijk sneller wordt.


83
2017-07-04 03:50



+1 voor gedetailleerde uitleg. Ik hou ook graag van 2GiB swap op mijn computers. Als er iets mis gaat - geheugen lekt, enz., Dan kun je swap zien omhoog gaan en op zoek gaan naar het probleem voordat het geheugen uit het geheugen komt. Het is een vangnet en een hulpmiddel voor prestaties. - Joe
Op mijn netbook, die slechts 2 GB RAM heeft, bewaar ik 4 GB aan swap. Dit komt omdat ik de netbook voor veel meer gebruik waarvoor het bedoeld was en mijn programma's vaak meer dan 2 GB geheugen nodig hebben. Aangezien Linux zich erg slecht gedraagt ​​in situaties met weinig geheugen, heb ik liever een groot vangnet. En ik heb voldoende schijfruimte. - Scott Severance
Als je programma's vaak meer dan 2 GB geheugen nodig hebben, zou ik overwegen meer RAM erin te gooien (het is ultra-goedkoop!) Omdat uitputtende RAM de prestaties zal schaden. Ten behoeve van andere lezers: zorg dat je niet alleen kijkt naar het cachegeheugen vermeend beschikbare RAM beschikbaar - zie andere verwijzingen naar free -m. - thomasrutter
@neon_overload: ik moet alleen opmerken dat volgens HP de maximale RAM van mijn netbook 1 GB is. Ik heb er nu 2GB in en internetbronnen suggereren dat 2GB het werkelijke maximum is. Dus de behoefte aan dit soort oplossingen. - Scott Severance
@thomasrutter: Hoe verandert uw antwoord voor grote servers, een van mij heeft 1TB (ja één volledige terabyte) aan ram en gebruikt nog steeds swap; welke swappiness-instelling en welke grootte swappartitie zou je aanbevelen? - chrisinmtown


Het instellen van de swappiness-waarde werkt niet in elke situatie. Als het voor u werkt, geweldig. Als dat niet het geval is, heb ik een script geschreven om de swap periodiek te wissen door hem uit en weer in te schakelen.

Wissel wisselen is een beetje riskant als je niet voorzichtig bent. Als je niet genoeg vrije RAM hebt om alles in het RAM-geheugen te bewaren plus alles in swap, in een poging swap uit te schakelen, zorgt ervoor dat je systeem niet meer reageert. Mijn script controleert eerst of er voldoende vrije RAM is (wat een beetje werk kost, omdat de werkelijke hoeveelheid vrije RAM anders is dan wat free rapporteert als gratis), schakelt dan alleen swap als dat zo is. Maar als u een beetje tekort komt in de RAM, start dan geen ander belangrijk proces terwijl het script wordt uitgevoerd. Hier is het:

#!/bin/bash

# Make sure that all text is parsed in the same language
export LC_MESSAGES=en_US.UTF-8
export LC_COLLATE=en_US.UTF-8
export LANG=en_US.utf8
export LANGUAGE=en_US:en
export LC_CTYPE=en_US.UTF-8

# Calculate how much memory and swap is free
free_data="$(free)"
mem_data="$(echo "$free_data" | grep 'Mem:')"
free_mem="$(echo "$mem_data" | awk '{print $4}')"
buffers="$(echo "$mem_data" | awk '{print $6}')"
cache="$(echo "$mem_data" | awk '{print $7}')"
total_free=$((free_mem + buffers + cache))
used_swap="$(echo "$free_data" | grep 'Swap:' | awk '{print $3}')"

echo -e "Free memory:\t$total_free kB ($((total_free / 1024)) MB)\nUsed swap:\t$used_swap kB ($((used_swap / 1024)) MB)"

# Do the work
if [[ $used_swap -eq 0 ]]; then
    echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $total_free ]]; then
    echo "Freeing swap..."
    swapoff -a
    swapon -a
else
    echo "Not enough free memory. Exiting."
    exit 1
fi

U moet dit script als root uitvoeren (bijvoorbeeld met sudo). Dit script laat uw systeem niet meer reageren; als je onvoldoende RAM hebt, zal het weigeren om swap in te stellen. Ik heb dit script nu bijna vijf jaar probleemloos gebruikt.


21
2017-07-04 02:38



+1 voor script. Misschien wil je het een beetje moderniseren door MB naar MiB in de uitgangen te veranderen. Ik heb een soortgelijk script geschreven zonder alle (goede) veiligheidstests die u bijvoegt. Op mijn oude notitieboek, waar ruilen zwaar werd gebruikt, zou het een tijdje duren om te lopen - een minuut of twee, maar deed niets. Af en toe zou het mislukken omdat er niet genoeg vrije geheugenruimte was om het uit te voeren, maar dat veroorzaakte geen extra problemen. Ik moest opnieuw opstarten om dingen op te lossen toen dat gebeurde. Het had te maken met wat leek op een geheugenlek in Transmission (sinds ik vast geloof) en met slechts 2GiB-ram. - Joe
Als iets is verplaatst om te ruilen en het in ruil blijft, is dat normaal een goede zaak - het betekent dat de gegevens niet daadwerkelijk worden gebruikt, en het heeft een deel van je RAM vrijgemaakt voor andere dingen, wat resulteert in een potentiële verhoging van de snelheid. Wat heeft ertoe geleid dat u denkt dat deze gegevens niet in ruil mogen en dat u in plaats daarvan meer waardevol RAM-geheugen moet opnemen? Gewoonlijk is de kernel redelijk goed in weten wat ongebruikt is en die veilig in wissel kan blijven om RAM vrij te maken. - thomasrutter
@neon: Houd in gedachten dat mijn machines respectievelijk 2GB en 3GB RAM hebben, wat tegenwoordig vrij weinig is. Het bewijs zit in de uitvoering. Bijvoorbeeld, het oproepen van menu's of schakelprogramma's kan traag zijn vanwege swapping, net als Compos visoal effecten. Deze traagheid wordt genezen door de swap om te schakelen, waarmee wordt aangetoond dat de optimalisatie-algoritmen van de kernel in sommige situaties niet optimaal zijn. Ik kan niet discussiëren met herhaalde ervaringen. - Scott Severance
Phew !! Dit is slechts tot 0% van de swap gestegen ... Ik had niet veel tijd om naar deze volledige vraag en het antwoord te kijken, maar ik vond het leuk om het te lezen als ik wat vrije tijd kreeg. - AzkerM
Waarom zou je niet zomaar swappiness op een lage waarde instellen? Dat lijkt hetzelfde te doen als je script, maar op een veel meer gecontroleerde manier. - jhfrontz


Over het algemeen wordt swap ongebruikt op systemen die nu worden gebruikt. In mijn ervaring, worden de processen die voor lange tijd draaien zonder intensieve operaties verschoven naar verwisseling door de linux.
Het zorgt ervoor dat enkele getroffen programma's traag werken.
Als je veel ram vrij hebt, kun je de swap uitschakelen door de opdracht uit te voeren:
swapoff -av (je hebt nodig sudo rechten ervoor.)
Als u de swap-off niet leuk vindt, kunt u deze inschakelen met behulp van symmetrische opdracht:
swapon -av (nog een keer sudo verplicht).


4
2018-06-29 22:24



Volledig swappen is overdreven, want swapiness = 0 doet hetzelfde, maar veiliger (als je do eindigen met te veel dingen in het geheugen, het zal iets gooien in ruil). - Brendan Long
@BrendanLong Fair point .. Bedankt dat je me hebt geleerd. :) - drake01


Als swap eenmaal voor een programma is gebruikt, blijft het meestal in kaart voor de duur van het programma. Veel programma's hebben code (en gegevens) die maar zelden worden gebruikt. Als het geheugen eenmaal is uitgewisseld, is het onwaarschijnlijk dat het wordt omgewisseld.

Een manier om deze pagina's in het geheugen te dwingen, is het swap-apparaat uit te schakelen. Als u er twee hebt, kunt u er een uitschakelen, de functie weer inschakelen en vervolgens de tweede uitschakelen. Als swap echt nodig is, wordt het tussen apparaten verplaatst. Je zou gewoon het swap-apparaat (of bestand) kunnen uitschakelen, maar als je echt swapruimte nodig hebt, kunnen er drastische dingen gebeuren.

Naast de normale dingen in het geheugen maakt tempfs gebruik van swapspace en ruilt het uit zoals de rest van het geheugen. Als u iets uitvoert dat veel tijdelijke schijven vereist, kan het dwingen dat pagina's worden uitgewisseld. Eens aangemaakte tijdelijke bestanden kunnen na enkele minuten niet meer worden gebruikt en zijn goede kandidaten om naar het wisselapparaat te worden verplaatst.

In een snuifje kunt u een bestand gebruiken als wisselend apparaat. Dit is handig als u tijdelijk extra swapruimte nodig heeft.


3
2018-06-30 04:02





Ik heb bewerkt het script van Scott Severance om overeen te komen met de nieuwere versies van gratis die al een totaal beschikbaar geheugenveld bevatten.

#!/bin/bash

free_mem="$(free | grep 'Mem:' | awk '{print $7}')"
used_swap="$(free | grep 'Swap:' | awk '{print $3}')"

echo -e "Free memory:\t$free_mem kB ($((free_mem / 1024)) MiB)\nUsed swap:\t$used_swap kB ($((used_swap / 1024)) MiB)"
if [[ $used_swap -eq 0 ]]; then
    echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $free_mem ]]; then
    echo "Freeing swap..."
    sudo swapoff -a
    sudo swapon -a
else
    echo "Not enough free memory. Exiting."
    exit 1
fi

2
2017-10-03 13:37