Poprzednia wersja tego poradnika została napisana przez Justina Ellingwooda
- Wprowadzenie
- Co to jest Swap?
- Krok 1 – Sprawdzenie systemu pod kątem informacji swap
- Krok 2 – Sprawdzanie dostępnego miejsca na partycji dysku twardego
- Krok 3 – Tworzenie pliku swap
- Krok 4 – Włączenie pliku wymiany
- Krok 5 – Uczynienie pliku wymiany trwałym
- Krok 6 – Dostrajanie ustawień swap
- Dostosowywanie właściwości Swappiness
- Dostosowywanie ustawienia ciśnienia pamięci podręcznej
- Wnioski
Wprowadzenie
Jednym z najprostszych sposobów zabezpieczenia się przed błędami braku pamięci w aplikacjach jest dodanie trochę miejsca na swap do swojego serwera. W tym przewodniku, zajmiemy się tym, jak dodać plik swap do serwera Ubuntu 18.04.
Ostrzeżenie: Chociaż swap jest ogólnie zalecany dla systemów wykorzystujących tradycyjne kręcące się dyski twarde, używanie swap z dyskami SSD może powodować problemy z degradacją sprzętu w czasie. Z tego powodu nie zalecamy włączania funkcji swap na DigitalOcean lub u innych dostawców, którzy korzystają z pamięci SSD. Może to mieć wpływ na niezawodność sprzętu bazowego dla Ciebie i Twoich sąsiadów. Ten przewodnik jest dostarczany jako odniesienie dla użytkowników, którzy mogą mieć systemy dysków wirujących gdzie indziej.
Jeśli trzeba poprawić wydajność serwera na DigitalOcean, zalecamy uaktualnienie Droplet. Doprowadzi to do lepszych wyników w ogóle i zmniejszy prawdopodobieństwo przyczynienia się do problemów sprzętowych, które mogą mieć wpływ na usługę.
Co to jest Swap?
Swap to obszar na dysku twardym, który został wyznaczony jako miejsce, gdzie system operacyjny może tymczasowo przechowywać dane, których nie może już trzymać w pamięci RAM. Zasadniczo, daje to możliwość zwiększenia ilości informacji, które serwer może przechowywać w swojej „pamięci” roboczej, z pewnymi zastrzeżeniami. Przestrzeń wymiany na dysku twardym będzie używana głównie wtedy, gdy nie ma już wystarczająco dużo miejsca w pamięci RAM, aby pomieścić używane dane aplikacji.
Informacje zapisywane na dysku będą znacznie wolniejsze niż informacje przechowywane w pamięci RAM, ale system operacyjny będzie wolał zachować działające dane aplikacji w pamięci i użyć wymiany dla starszych danych. Ogólnie rzecz biorąc, posiadanie przestrzeni wymiany jako awaryjnego rozwiązania, gdy pamięć RAM systemu jest wyczerpana, może być dobrym zabezpieczeniem przed wyjątkami braku pamięci w systemach z dostępną pamięcią inną niż SD.
Krok 1 – Sprawdzenie systemu pod kątem informacji swap
Zanim zaczniemy, możemy sprawdzić, czy system ma już dostępną przestrzeń wymiany. Możliwe jest posiadanie wielu plików swap lub partycji swap, ale generalnie jeden powinien wystarczyć.
Możemy sprawdzić czy system ma skonfigurowany swap wpisując:
- sudo swapon --show
Jeśli nie otrzymasz żadnej odpowiedzi, oznacza to, że twój system nie ma obecnie dostępnego miejsca swap.
Możesz sprawdzić, czy nie ma aktywnej wymiany, używając narzędzia free
:
- free -h
Output total used free shared buff/cache availableMem: 985M 84M 222M 680K 678M 721MSwap: 0B 0B 0B
Jak widać w wierszu Swap na wyjściu, żadna wymiana nie jest aktywna w systemie.
Krok 2 – Sprawdzanie dostępnego miejsca na partycji dysku twardego
Przed utworzeniem naszego pliku wymiany, sprawdzimy bieżące użycie dysku, aby upewnić się, że mamy wystarczająco dużo miejsca. Zrób to wpisując:
- 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
Urządzenie z /
w kolumnie Mounted on
jest w tym przypadku naszym dyskiem. W tym przykładzie mamy dużo wolnego miejsca (wykorzystane tylko 1,4G). Twoje użycie będzie prawdopodobnie inne.
Choć istnieje wiele opinii na temat odpowiedniego rozmiaru przestrzeni wymiany, to tak naprawdę zależy to od Twoich osobistych preferencji i wymagań aplikacji. Ogólnie rzecz biorąc, ilość równa lub podwojona ilość pamięci RAM w systemie jest dobrym punktem wyjścia. Inną dobrą zasadą jest to, że cokolwiek ponad 4G swap jest prawdopodobnie niepotrzebne, jeśli używasz go tylko jako awaryjnego RAM.
Krok 3 – Tworzenie pliku swap
Teraz, gdy znamy nasze dostępne miejsce na dysku twardym, możemy utworzyć plik swap w naszym systemie plików. Przydzielimy plik o rozmiarze swap, który chcemy o nazwie swapfile
w naszym katalogu głównym (/).
Najlepszym sposobem na utworzenie pliku swap jest program fallocate
. To polecenie natychmiast tworzy plik o określonym rozmiarze.
Ponieważ serwer w naszym przykładzie ma 1G pamięci RAM, w tym przewodniku utworzymy plik o rozmiarze 1G. Dostosuj to do potrzeb swojego serwera:
- sudo fallocate -l 1G /swapfile
Możemy sprawdzić, czy zarezerwowano odpowiednią ilość miejsca, wpisując:
- ls -lh /swapfile
- -rw-r--r-- 1 root root 1.0G Apr 25 11:14 /swapfile
Nasz plik został utworzony z odpowiednią ilością wolnego miejsca.
Krok 4 – Włączenie pliku wymiany
Teraz, gdy mamy plik o prawidłowym rozmiarze, musimy go przekształcić w przestrzeń wymiany.
Po pierwsze, musimy zablokować uprawnienia do pliku tak, aby tylko użytkownicy z uprawnieniami roota mogli odczytać jego zawartość. Zapobiega to dostępowi zwykłych użytkowników do pliku, co miałoby znaczące implikacje dla bezpieczeństwa.
Uczyń plik dostępnym tylko dla roota, wpisując:
- sudo chmod 600 /swapfile
Weryfikuj zmianę uprawnień, wpisując:
- ls -lh /swapfile
Output -rw------- 1 root root 1.0G Apr 25 11:14 /swapfile
Jak widać, tylko użytkownik root ma włączone flagi odczytu i zapisu.
Możemy teraz oznaczyć plik jako przestrzeń wymiany wpisując:
- sudo mkswap /swapfile
OutputSetting up swapspace version 1, size = 1024 MiB (1073737728 bytes)no label, UUID=6e965805-2ab9-450f-aed6-577e74089dbf
Po oznaczeniu pliku, możemy włączyć plik wymiany, pozwalając naszemu systemowi zacząć go wykorzystywać:
- sudo swapon /swapfile
Sprawdź, czy wymiana jest dostępna wpisując:
- sudo swapon --show
OutputNAME TYPE SIZE USED PRIO/swapfile file 1024M 0B -2
Możemy ponownie sprawdzić wynik działania narzędzia free
, aby potwierdzić nasze ustalenia:
- free -h
Output total used free shared buff/cache availableMem: 985M 84M 220M 680K 680M 722MSwap: 1.0G 0B 1.0G
Nasza wymiana została pomyślnie skonfigurowana i nasz system operacyjny zacznie z niej korzystać w razie potrzeby.
Krok 5 – Uczynienie pliku wymiany trwałym
Nasze ostatnie zmiany włączyły plik wymiany dla bieżącej sesji. Jednakże, jeśli ponownie uruchomimy serwer, nie zachowa on automatycznie ustawień swap. Możemy to zmienić dodając plik wymiany do naszego pliku /etc/fstab
.
Zrób kopię zapasową pliku /etc/fstab
na wypadek, gdyby coś poszło nie tak:
- sudo cp /etc/fstab /etc/fstab.bak
Dodaj informacje o pliku wymiany na końcu swojego pliku /etc/fstab
wpisując:
- echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
Następnie przejrzymy niektóre ustawienia, które możemy zaktualizować, aby dostroić naszą przestrzeń wymiany.
Krok 6 – Dostrajanie ustawień swap
Jest kilka opcji, które możesz skonfigurować, a które będą miały wpływ na wydajność twojego systemu podczas pracy z przestrzenią wymiany.
Dostosowywanie właściwości Swappiness
Parametr swappiness
konfiguruje jak często twój system wymienia dane z RAM do przestrzeni wymiany. Jest to wartość z zakresu od 0 do 100, która reprezentuje procent.
W przypadku wartości bliskich zeru, jądro nie będzie wymieniać danych na dysk, chyba że będzie to absolutnie konieczne. Pamiętaj, że interakcje z plikiem swap są „drogie” w tym sensie, że trwają o wiele dłużej niż interakcje z pamięcią RAM i mogą powodować znaczny spadek wydajności. Powiedzenie systemowi, aby nie polegał na swapie sprawi, że system będzie szybszy.
Wartości, które są bliższe 100 będą próbowały umieścić więcej danych w swapie, starając się utrzymać więcej wolnego miejsca w pamięci RAM. W zależności od profilu pamięci aplikacji lub tego, do czego używasz swojego serwera, może to być lepsze w niektórych przypadkach.
Możemy zobaczyć aktualną wartość swappiness wpisując:
- cat /proc/sys/vm/swappiness
Output60
Dla komputerów stacjonarnych, ustawienie swappiness na poziomie 60 nie jest złą wartością. Dla serwera, możesz chcieć zbliżyć ją do 0.
Możemy ustawić swappiness na inną wartość używając komendy sysctl
.
Na przykład, aby ustawić swappiness na 10, możemy wpisać:
- sudo sysctl vm.swappiness=10
Outputvm.swappiness = 10
To ustawienie będzie utrzymane do następnego restartu. Możemy ustawić tę wartość automatycznie przy ponownym uruchomieniu, dodając linię do naszego pliku /etc/sysctl.conf
:
- sudo nano /etc/sysctl.conf
Na dole, możesz dodać:
vm.swappiness=10
Zapisz i zamknij plik, gdy skończysz.
Dostosowywanie ustawienia ciśnienia pamięci podręcznej
Inną powiązaną wartością, którą możesz chcieć zmodyfikować jest vfs_cache_pressure
. To ustawienie konfiguruje jak bardzo system będzie wybierał buforowanie informacji o inode i dentry w stosunku do innych danych.
Podstawowo, są to dane dostępu do systemu plików. Jest to generalnie bardzo kosztowne do sprawdzenia i bardzo często wymagane, więc jest to doskonała rzecz dla twojego systemu do buforowania. Możesz zobaczyć aktualną wartość poprzez ponowne zapytanie systemu plików proc
:
- cat /proc/sys/vm/vfs_cache_pressure
Output100
W obecnej konfiguracji, nasz system usuwa informacje o inode z pamięci podręcznej zbyt szybko. Możemy ustawić to na bardziej konserwatywne ustawienie jak 50 wpisując:
- sudo sysctl vm.vfs_cache_pressure=50
Outputvm.vfs_cache_pressure = 50
Ponownie, jest to ważne tylko dla naszej bieżącej sesji. Możemy to zmienić poprzez dodanie tego do naszego pliku konfiguracyjnego, tak jak zrobiliśmy to z naszym ustawieniem swappiness:
- sudo nano /etc/sysctl.conf
Na dole dodaj linię, która określa twoją nową wartość:
vm.vfs_cache_pressure=50
Zapisz i zamknij plik, gdy skończysz.
Wnioski
Postępowanie zgodnie z krokami w tym przewodniku da ci trochę wytchnienia w przypadkach, które w przeciwnym razie doprowadziłyby do wyjątków braku pamięci. Przestrzeń wymiany może być niezwykle przydatna w unikaniu niektórych z tych powszechnych problemów.
Jeśli napotykasz na błędy OOM (out of memory), lub jeśli stwierdzisz, że twój system nie jest w stanie używać aplikacji, których potrzebujesz, najlepszym rozwiązaniem jest optymalizacja konfiguracji aplikacji lub modernizacja serwera.