En tidigare version av denna handledning skrevs av Justin Ellingwood
- Introduktion
- Vad är Swap?
- Steg 1 – Kontrollera systemet för swap-information
- Steg 2 – Kontrollera tillgängligt utrymme på hårddiskpartitionen
- Steg 3 – Skapa en swap-fil
- Steg 4 – Aktivera bytesfilen
- Steg 5 – Gör swapfilen permanent
- Steg 6 – Justera dina swap-inställningar
- Justering av Swappiness-egenskapen
- Justering av inställningen för cachetryck
- Slutsats
Introduktion
Ett av de enklaste sätten att skydda sig mot fel som uppstår när minnet inte räcker till i program är att lägga till swaputrymme på din server. I den här guiden kommer vi att ta upp hur man lägger till en swap-fil på en Ubuntu 18.04-server.
Varning: Även om swap i allmänhet rekommenderas för system som använder traditionella snurrande hårddiskar kan användning av swap med SSD-diskar orsaka problem med hårdvarudegradering med tiden. På grund av detta rekommenderar vi inte att aktivera swap på DigitalOcean eller någon annan leverantör som använder SSD-lagring. Om du gör det kan det påverka tillförlitligheten hos den underliggande maskinvaran för dig och dina grannar. Den här guiden tillhandahålls som referens för användare som kanske har system med snurrande diskar någon annanstans.
Om du behöver förbättra prestandan för din server på DigitalOcean rekommenderar vi att du uppgraderar din Droplet. Detta leder till bättre resultat i allmänhet och minskar sannolikheten för att bidra till hårdvaruproblem som kan påverka din tjänst.
Vad är Swap?
Swap är ett område på en hårddisk som har utsetts till en plats där operativsystemet tillfälligt kan lagra data som det inte längre kan hålla i RAM. I princip ger detta dig möjlighet att öka mängden information som din server kan hålla i sitt ”arbetsminne”, med vissa förbehåll. Utbytesutrymmet på hårddisken kommer främst att användas när det inte längre finns tillräckligt med utrymme i RAM för att hålla programdata som används.
Informationen som skrivs till disken kommer att vara betydligt långsammare än information som hålls i RAM, men operativsystemet kommer att föredra att hålla pågående programdata i minnet och använda utbytesutrymmet för de äldre uppgifterna. Sammantaget kan det vara ett bra säkerhetsnät mot undantag vid minnesbrist på system med tillgänglig lagring som inte är på SD-skiva att ha swaputrymme som en reserv för när systemets RAM är slut kan vara ett bra säkerhetsnät mot undantag vid minnesbrist på system med tillgänglig lagring som inte är på SD-skiva.
Steg 1 – Kontrollera systemet för swap-information
Innan vi börjar kan vi kontrollera om systemet redan har swap-utrymme tillgängligt. Det är möjligt att ha flera swap-filer eller swap-partitioner, men i allmänhet bör en räcka.
Vi kan se om systemet har någon konfigurerad swap genom att skriva:
- sudo swapon --show
Om du inte får tillbaka något utdata betyder det att ditt system inte har något swap-utrymme tillgängligt för närvarande.
Du kan verifiera att det inte finns någon aktiv swap med hjälp av verktyget free
:
- free -h
Output total used free shared buff/cache availableMem: 985M 84M 222M 680K 678M 721MSwap: 0B 0B 0B
Som du kan se i raden Swap i utmatningen är ingen swap aktiv på systemet.
Steg 2 – Kontrollera tillgängligt utrymme på hårddiskpartitionen
För att skapa vår swap-fil kontrollerar vi vår nuvarande diskanvändning för att se att vi har tillräckligt med utrymme. Gör detta genom att skriva in:
- df -h
OutputFilesystem Size Used Avail Use% Mounted onudev 481M 0 481M 0% /devtmpfs 99M 656K 98M 1% /run/dev/vda1 25G 1.4G 23G 6% /tmpfs 493M 0 493M 0% /dev/shmtmpfs 5.0M 0 5.0M 0% /run/locktmpfs 493M 0 493M 0% /sys/fs/cgroup/dev/vda15 105M 3.4M 102M 4% /boot/efitmpfs 99M 0 99M 0% /run/user/1000
Enheten med /
i kolumnen Mounted on
är vår disk i det här fallet. Vi har gott om tillgängligt utrymme i det här exemplet (endast 1,4 4G används). Din användning kommer förmodligen att vara annorlunda.
Och även om det finns många åsikter om lämplig storlek på ett växlingsutrymme, beror det verkligen på dina personliga preferenser och dina programkrav. Generellt sett är en mängd som motsvarar eller är dubbelt så stor som mängden RAM-minne i ditt system en bra utgångspunkt. En annan bra tumregel är att allt över 4 g swaputrymme förmodligen är onödigt om du bara använder det som en RAM-fallback.
Steg 3 – Skapa en swap-fil
När vi nu känner till vårt tillgängliga hårddiskutrymme kan vi skapa en swap-fil i vårt filsystem. Vi kommer att allokera en fil med den swapstorlek som vi vill ha kallad swapfile
i vår rot (/) katalog.
Det bästa sättet att skapa en swapfil är med programmet fallocate
. Detta kommando skapar omedelbart en fil av den angivna storleken.
Då servern i vårt exempel har 1 G RAM kommer vi att skapa en fil på 1 G i den här guiden. Justera detta för att möta behoven på din egen server:
- sudo fallocate -l 1G /swapfile
Vi kan kontrollera att rätt mängd utrymme reserverades genom att skriva:
- ls -lh /swapfile
- -rw-r--r-- 1 root root 1.0G Apr 25 11:14 /swapfile
Vår fil har skapats med rätt mängd utrymme avsatt.
Steg 4 – Aktivera bytesfilen
Nu när vi har en fil med rätt storlek tillgänglig måste vi faktiskt omvandla den till bytesutrymme.
Först måste vi låsa behörigheterna för filen så att endast användare med root-rättigheter kan läsa innehållet. Detta förhindrar att normala användare kan komma åt filen, vilket skulle få betydande konsekvenser för säkerheten.
Gör filen endast tillgänglig för root genom att skriva:
- sudo chmod 600 /swapfile
Verifiera ändringen av behörigheterna genom att skriva:
- ls -lh /swapfile
Output -rw------- 1 root root 1.0G Apr 25 11:14 /swapfile
Som du kan se är det endast root-användaren som har läs- och skrivflaggorna aktiverade.
Vi kan nu markera filen som växlingsutrymme genom att skriva:
- sudo mkswap /swapfile
OutputSetting up swapspace version 1, size = 1024 MiB (1073737728 bytes)no label, UUID=6e965805-2ab9-450f-aed6-577e74089dbf
Efter att ha markerat filen kan vi aktivera växlingsfilen, så att vårt system kan börja använda den:
- sudo swapon /swapfile
Verifiera att växlingsutrymmet är tillgängligt genom att skriva:
- sudo swapon --show
OutputNAME TYPE SIZE USED PRIO/swapfile file 1024M 0B -2
Vi kan kontrollera utdata från verktyget free
igen för att bekräfta våra resultat:
- free -h
Output total used free shared buff/cache availableMem: 985M 84M 220M 680K 680M 722MSwap: 1.0G 0B 1.0G
Vår swap-fil har konfigurerats framgångsrikt och vårt operativsystem kommer att börja använda den vid behov.
Steg 5 – Gör swapfilen permanent
Våra senaste ändringar har aktiverat swapfilen för den aktuella sessionen. Men om vi startar om kommer servern inte att behålla swap-inställningarna automatiskt. Vi kan ändra detta genom att lägga till swapfilen i vår /etc/fstab
-fil.
Backupera /etc/fstab
-filen ifall något går fel:
- sudo cp /etc/fstab /etc/fstab.bak
Lägg till informationen om swapfilen i slutet av din /etc/fstab
-fil genom att skriva:
- echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
Nästan ska vi gå igenom några inställningar som vi kan uppdatera för att trimma vårt swaputrymme.
Steg 6 – Justera dina swap-inställningar
Det finns några alternativ som du kan konfigurera och som kommer att påverka systemets prestanda när du hanterar swap.
Justering av Swappiness-egenskapen
Parametern swappiness
konfigurerar hur ofta ditt system byter ut data från RAM till swaputrymmet. Detta är ett värde mellan 0 och 100 som representerar en procentandel.
Med värden nära noll byter kärnan inte data till disken om det inte är absolut nödvändigt. Kom ihåg att interaktioner med swapfilen är ”dyra” i det avseendet att de tar mycket längre tid än interaktioner med RAM och att de kan orsaka en betydande minskning av prestandan. Att tala om för systemet att inte förlita sig på swap-filen mycket gör i allmänhet systemet snabbare.
Värden som ligger närmare 100 kommer att försöka lägga mer data i swap-filen i ett försök att hålla mer RAM-utrymme fritt. Beroende på dina applikationers minnesprofil eller vad du använder din server till kan detta vara bättre i vissa fall.
Vi kan se det aktuella swappiness-värdet genom att skriva:
- cat /proc/sys/vm/swappiness
Output60
För en Desktop är en swappiness-inställning på 60 inget dåligt värde. För en server kanske du vill flytta det närmare 0.
Vi kan ställa in swappiness till ett annat värde genom att använda kommandot sysctl
.
För att ställa in swappiness till 10 kan vi till exempel skriva:
- sudo sysctl vm.swappiness=10
Outputvm.swappiness = 10
Den här inställningen kommer att bestå tills nästa omstart. Vi kan ställa in det här värdet automatiskt vid omstart genom att lägga till raden i vår /etc/sysctl.conf
fil:
- sudo nano /etc/sysctl.conf
I botten kan du lägga till:
vm.swappiness=10
Spara och stäng filen när du är klar.
Justering av inställningen för cachetryck
Ett annat relaterat värde som du kanske vill ändra är vfs_cache_pressure
. Den här inställningen konfigurerar hur mycket systemet väljer att cachelagra inode- och dentry-information framför andra data.
I grund och botten är detta åtkomstdata om filsystemet. Detta är i allmänhet mycket kostsamt att söka upp och mycket ofta efterfrågat, så det är en utmärkt sak för ditt system att cachelagrafera. Du kan se det aktuella värdet genom att fråga proc
filsystemet igen:
- cat /proc/sys/vm/vfs_cache_pressure
Output100
Som det är konfigurerat för närvarande tar vårt system bort inodeinformation från cachen för snabbt. Vi kan ställa in detta till en mer konservativ inställning som 50 genom att skriva:
Outputvm.vfs_cache_pressure = 50
Också detta är bara giltigt för vår aktuella session. Vi kan ändra detta genom att lägga till det i vår konfigurationsfil som vi gjorde med vår swappiness-inställning:
- sudo nano /etc/sysctl.conf
I botten lägger du till raden som anger ditt nya värde:
vm.vfs_cache_pressure=50
Spara och stäng filen när du är klar.
Slutsats
Om du följer stegen i den här guiden får du lite andrum i fall som annars skulle leda till undantag vid minnesbrist. Swaputrymme kan vara otroligt användbart för att undvika några av dessa vanliga problem.
Om du råkar ut för OOM-fel (out of memory), eller om du upptäcker att ditt system inte kan använda de program du behöver, är den bästa lösningen att optimera dina programkonfigurationer eller att uppgradera din server.