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?
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?
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.
swappiness kan een waarde tussen 0 en 100 hebben
swappiness = 0 vertelt de kernel om te voorkomen dat processen zo lang mogelijk uit het fysieke geheugen worden geruild
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
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.
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.
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).
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.
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