Fizyczna pamięć operacyjna to skończony tymczasowy magazyn używany do wczytywania jądra systemu, struktur danych, a także uruchomionych przez użytkownika programów i aplikacji. Przestrzeń wymiany (swap space) to obszar na dysku używany do przechowywania nieużywanych danych aż do momentu gdy są potrzebne. System dzieli pamięć fizyczną na mniejsze kawałki zwane stronami (pages) i mapuje ich fizyczne położenie w pamięci operacyjnej do wirtualnego położenia w przestrzeni wymiany aby ułatwić procesorowi dostęp. Mapowanie pamięci fizycznej do wirtualnej jest przechowywane w tabeli stron (page table), która jest utrzymywana przez jądro systemu. Jeżeli systemowi brakuje pamięci fizycznej to zaczyna on bezczynne strony z danymi (pages of data) przenosić z pamięci fizycznej do przestrzeni wymiany aby zrobić miejsce dla innych programów. Taki proces nazywany jest wynoszeniem stron (page out). Gdy system potrzebuje wyniesionych stron, CPU szuka ich w pamięci fizycznej i następuje page fault, który skutkuje powrotem danych do pamięci fizycznej (page in). Cały proces stronicowania danych do przestrzeni wymiany i z powrotem do pamięci fizycznej znany jest pod nazwą stronicowanie na życzenie (demand paging).
System z dużym zapotrzebowaniem na pamięć i z małym rozmiarem pamięci operacyjnej może wejść w stan, w którym będzie bardzo zajęty przenoszeniem danych z pamięci operacyjnej do przestrzeni wymiany co spowoduje znaczny spadek wydajności systemu. Takie nadmierne stronicowanie, które ma wpływ na spadek wydajności systemu nazywane jest śmieceniem (trashing). W takiej sytuacji system dezaktywuje bezczynne procesy i nie pozwala na uruchamianie nowych. Jak tylko w systemie będzie dostępnej więcej pamięci operacyjnej bezczynne procesy są ponownie aktywowane i mogą być uruchamiane nowe.
Określanie rozmiaru przestrzeni wymiany.
Stara zasada mówi, że rozmiar swapu nie powinien być mniejszy niż całkowity rozmiar pamięci RAM. Kiedyś zalecane było aby swap był dwa razy większy niż ilość pamięci operacyjnej, ale było to w czasach gdy szczytem marzeń był komputer z kilkudziesięcioma megabajtami pamięci RAM. Aktualnie standardem jest rozmiar pamięci operacyjnej większy niż 2 GB. W takim wypadku rozmiar partycji wymiany może być symboliczny 128-512 MB.
Do określania ile pamięci operacyjnej jest w systemie zainstalowanej, używanej i wolnej służy komenda :
# free -h
total used free shared buffers cached
Mem: 5,8G 5,7G 86M 185M 228M 4,8G
-/+ buffers/cache: 673M 5,2G
Swap: 972M 400K 972M
Opcja -h aby wyświetlić w łatwiej czytelnym formacie. Inna komenda:
# cat /proc/meminfo
MemTotal: 6095264 kB
MemFree: 88156 kB
MemAvailable: 5441984 kB
Buffers: 234224 kB
Cached: 5083888 kB
SwapCached: 0 kB
Active: 2792236 kB
Inactive: 2889024 kB
Active(anon): 427784 kB
Inactive(anon): 125676 kB
Active(file): 2364452 kB
Inactive(file): 2763348 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 995952 kB
SwapFree: 995552 kB
Dirty: 40 kB
Writeback: 0 kB
AnonPages: 363236 kB
Mapped: 219000 kB
Shmem: 190296 kB
Slab: 288756 kB
SReclaimable: 263024 kB
SUnreclaim: 25732 kB
KernelStack: 3488 kB
PageTables: 13988 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 4043584 kB
Committed_AS: 769936 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 268184 kB
VmallocChunk: 34359337136 kB
DirectMap4k: 7680 kB
DirectMap2M: 2080768 kB
DirectMap1G: 6291456 kB
Ćwiczenie 1. Tworzenie i aktywowanie partycji wymiany.
Do określenia ile jest wolnego miejsca na dysku można użyć
lsblk
. Tworzymy struktury dla przestrzeni wymiany na partycji vdb2:
# mkswap /dev/vdb2
mkswap: /dev/vdb2: warning: wiping old LVM2_member signature.
Setting up swapspace version 1, size = 488444 KiB
no label, UUID=40809164-d5a3-40f7-9862-cce2a6e532ce
Tworzymy wolumin logiczny o nazwie swapvol i rozmiarze 300MB w grupie woluminów vg10:
# lvcreate –L 300m –n swapvol vg10
Logical volume "swapvol" created
Tworzymy struktury dla przestrzeni wymiany na woluminie swapvol:
# mkswap /dev/vg10/swapvol
Setting up swapspace version 1, size = 307196 KiB
no label, UUID=5ccdcb52-fd4b-4409-a5e9-38fa390c20f6
Włączamy partycje swap na partycji i na logicznym woluminie:
# swapon /dev/vdb2
# swapon –v /dev/vg10/swapvol
swapon /dev/vg10/swapvol
swapon: /dev/mapper/vg10-swapvol: found swap signature: version 1, page-size 4, same byte order
swapon: /dev/mapper/vg10-swapvol: pagesize=4096, swapsize=314572800, devsize=314572800
Potwierdzamy aktywacje partycji swap:
# swapon -s
# cat /proc/swaps
Wyświetlamy statystyki pamięci wirtualnej:
# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 400 85880 234588 5084000 0 0 8 21 0 0 0 0 100 0 0
Statystyki w innym formacie:
# vmstat -s
6095264 K total memory
6010036 K used memory
2793180 K active memory
2889804 K inactive memory
85228 K free memory
234620 K buffer memory
5084736 K swap cache
995952 K total swap
400 K used swap
995552 K free swap
3609908 non-nice user cpu ticks
526 nice user cpu ticks
254512 system cpu ticks
2552651458 idle cpu ticks
889184 IO-wait cpu ticks
0 IRQ cpu ticks
182783 softirq cpu ticks
0 stolen cpu ticks
211495324 pages paged in
546710848 pages paged out
0 pages swapped in
100 pages swapped out
2192012598 interrupts
344056037 CPU context switches
1489606093 boot time
644874 forks
Dodajemy partycję wymiany do pliku /etc/fstab:
# vi /etc/fstab
/dev/vdb2 swap swap defaults 0 0
/dev/vg10/swapvol swap swap defaults 0 0
Restartujemy system i weryfikujemy czy partycje swap są aktywne.
Ćwiczenie 2. Dezaktywujemy i usuwamy przestrzenie wymiany.
Dezaktywacja swapa na partycji vdb2 i swapvol:
# swapoff –v /dev/vdb2
swapoff /dev/vdb2
# swapoff /dev/vg10/swapvol
swapoff /dev/vg10/swapvol
Usunięcie partycji i logicznego woluminu:
# parted /dev/vdb rm 2
# lvremove –f /dev/vg10/swapvol
Logical volume "swapvol" successfully removed
Usuwamy partycje swap z pliku /etc/fstab i restartujemy system.