Wydajność Linuksa: Why You Should Almost Always Add Swap Space

Wiemy że używanie przestrzeni wymiany zamiast RAM (pamięci) w Linuksie może poważnie spowolnić wydajność. Można by więc zapytać, skoro mam więcej niż wystarczająco dużo pamięci, czy nie lepiej usunąć przestrzeń wymiany? Krótka odpowiedź brzmi: Nie. Istnieją korzyści wydajnościowe kiedy przestrzeń wymiany jest włączona, nawet jeśli masz więcej niż wystarczająco dużo RAMu. Aktualizacja, zobacz też Część 2: Wydajność Linuksa: Prawie Zawsze Dodawaj Swap (ZRAM).

Nawet przy zainstalowanej wystarczającej ilości pamięci serwera, często można zauważyć, że przestrzeń wymiany będzie używana po długich okresach bezczynności. Zobacz poniższy przykład z serwera live-chat z około miesięcznym czasem pracy:

 total used free shared buff/cache availableMem: 3.7G 1.0G 445M 84M 2.2G 2.2GSwap: 1.8G 308M 1.5G

Wyniki free -h pokazują 308M wykorzystanej przestrzeni swap. Kiedy przeprowadziłem kontrolę swapowania, nie było żadnych oznak trwającej lub nieterminowej aktywności I/O swap. Również usługa kswap nie pochłaniała dużo czasu procesora. W rzeczywistości, procesu kswap nie można było nigdzie znaleźć w top (najlepsze procesy posortowane według czasu CPU). Aby to potwierdzić, użyłem następującego polecenia:

ps -A | grep kswap 40 ? 00:00:29 kswapd0

…tak więc w tym przypadku, jak i w wielu innych, wykorzystanie swapu nie jest szkodliwe dla wydajności serwera Linux. Teraz przyjrzyjmy się jak przestrzeń wymiany może pomóc w wydajności serwera Linux.

Uaktualnienie: Ostatnio zainstalowałem Manjoro i3 na moim Pinebooku Pro. Teraz ma on domyślnie włączoną pamięć ZRAM.

Zalety przestrzeni wymiany w systemach z odpowiednią ilością pamięci RAM

atop 512GB serwer - 2GB swap wykorzystane

atop 512GB serwer - 2GB swap wykorzystane

To jest normalne i może być dobrą rzeczą dla systemów Linux, aby użyć trochę swapu, nawet jeśli jest jeszcze dostępna pamięć RAM. Jądro Linuksa przenosi strony pamięci, które prawie nigdy nie są używane do przestrzeni wymiany, aby zapewnić, że jeszcze więcej miejsca w pamięci podręcznej jest dostępne dla częściej używanych stron pamięci (strona to kawałek pamięci). Użycie swap staje się problemem wydajnościowym, gdy jądro jest zmuszone do ciągłego przenoszenia stron pamięci do i z pamięci oraz przestrzeni swap.

Inną zaletą jest to, że swap daje administratorom czas na reakcję na problemy z niską ilością pamięci. Często zauważymy, że serwer działa wolno i po zalogowaniu zauważymy duże swapowanie. Bez swapu (jak opisano w następnej sekcji), brak pamięci może spowodować znacznie bardziej nagłe i poważne reakcje łańcuchowe. Dlatego zazwyczaj radziłbym ustawić przestrzeń wymiany na wielkość największego procesu. Na przykład, skonfigurowana pamięć MySQL w pliku my.cnf. Może być nawet mniejsza, szczególnie jeśli masz monitoring i/lub alarmowanie w miejscu.

Niektórzy zalecają brak swapu lub rozmiar swapu nieco większy niż całkowita pamięć RAM. Jeśli możesz wymyślić ważne powody dla tego, to może to być twój wybór. Jednak w przypadku serwerów jest to rzadko spotykane i zamiast tego powinieneś zrównoważyć swoją decyzję z efektami, jakie swap będzie miał na Twoje konkretne aplikacje. Swap nie zmienia ilości pamięci RAM wymaganej dla zdrowego serwera lub komputera stacjonarnego. Został zaprojektowany jako uzupełnienie wydajności zdrowych systemów.

Podsumowując:
– Nawet jeśli jest jeszcze dostępna pamięć RAM, jądro Linuksa przeniesie strony pamięci, które prawie nigdy nie są używane do przestrzeni wymiany.
– Lepiej jest wymienić strony pamięci, które były nieaktywne przez jakiś czas, utrzymując często używane dane w pamięci podręcznej, a to powinno się zdarzyć, gdy serwer jest najbardziej bezczynny, co jest celem jądra.
– Unikaj ustawiania zbyt dużej przestrzeni wymiany, jeśli spowoduje to przedłużenie problemów z wydajnością, przestojów lub czasu odpowiedzi (bez odpowiedniego monitorowania/alertów).

Przestrzeń wymiany vs. Brak wymiany, gdy dostępna pamięć jest niska

W przeciwieństwie do powyższego przypadku, jeśli nie masz wystarczająco dużo pamięci, wymiana będzie używana dość często i zauważalnie bardziej podczas wszelkich skoków zapotrzebowania na pamięć. Jeśli nie masz wystarczająco dużo pamięci i nie masz miejsca na swap, często będzie to powodować niepowodzenie w alokacji pamięci dla żądań wymagających więcej stron pamięci. W ostateczności, jądro wdroży OOM killer, aby zniszczyć procesy wymagające dużej ilości pamięci (zazwyczaj MySQL, java, itp.).

Aby uzyskać bardziej szczegółowe spojrzenie na przestrzeń wymiany w Linuksie, przeczytaj rozdziały Swap Management i Page Frame Reclamation z Kernel.org docs. Zajrzyj również do ostatniej sekcji, „Kernel cache pressure and swappiness”, w moim innym wpisie na blogu, aby uzyskać wskazówki na temat dostrajania wykorzystania przestrzeni wymiany w Linuksie przez jądro. Jeśli Twoja przestrzeń wymiany „używana” jest zawsze '0′ to rzeczywiście masz tonę swobodnie dostępnej pamięci RAM, w którym to przypadku może być bezpiecznie usunąć przestrzeń wymiany… lub można dostosować ciśnienie pamięci podręcznej jądra, aby wykorzystać jeszcze więcej pamięci RAM.

Podsumowując:
– Swap I/O skaluje się bardzo słabo. Jeśli strony pamięci nie mogą być wymieniane tylko wtedy, gdy serwer jest bezczynny, powinieneś dostroić lub wyłączyć swap. Zazwyczaj nie jest to przypadek, stąd „prawie zawsze” tytuł tego wpisu.
– Z swap wyłączone, problemy z wydajnością stają się zauważalne bardzo szybko, a zabójca OOM może cię dostać! 🙂

Dla porównania, oto wynik free przy użyciu starszej wersji free z procps-ng-3.3.1 na tym samym serwerze:

 total used free shared buffers cachedMem: 3.7G 3.3G 445M 0B 4.2M 1.7G-/+ buffers/cache: 1.6G 2.1GSwap: 1.8G 308M 1.5G

Ciśnienie pamięci podręcznej jądra i swappiness

Teraz, gdy masz włączoną swap. Rozważ dostosowanie ciśnienia pamięci podręcznej serwera i tendencji do swapowania (vm.swappiness), postępując zgodnie z poniższym przewodnikiem, który pochodzi z poprzedniego artykułu: Serwer Linux potrzebuje upgrade’u pamięci RAM? Sprawdź za pomocą top, free, vmstat i sar:

vfs_cache_pressure – Kontroluje tendencję jądra do odzyskiwania pamięci, która jest używana do cache’owania obiektów katalogów i inode’ów. (domyślnie = 100, zalecana wartość 50 do 200)

swappiness – Ta kontrola jest używana do określenia jak agresywnie jądro będzie wymieniać strony pamięci. Wyższe wartości zwiększą agresywność, niższe zmniejszą ilość swapu. (domyślnie = 60, zalecane wartości pomiędzy 1 a 60) Usuń swap dla wartości 0, ale zwykle nie jest to zalecane w większości przypadków.

Aby edytować, możesz dodać lub zastąpić te linie w pliku /etc/sysctl.conf. Na przykład, jeśli masz mało pamięci do czasu uaktualnienia, możesz spróbować czegoś takiego jak:

vm.swappiness=10vm.vfs_cache_pressure=200

To zwiększy nacisk na pamięć podręczną, co może wydawać się nieco kontrproduktywne, ponieważ buforowanie jest dobre dla wydajności. Jednak zbyt częste swapowanie zmniejsza ogólną wydajność twojego serwera znacznie bardziej. Więc nie trzymanie tak dużo cache w pamięci pomoże zredukować aktywność swap. Również, z vm.swappiness ustawionym na 10 lub tak niskim jak 1, zredukuje swapowanie dysków.

Na zdrowym serwerze z dużą ilością dostępnej pamięci, użyj następującego:

vm.swappiness=10vm.vfs_cache_pressure=50

Zmniejszy to nacisk na cache. Ponieważ buforowanie jest dobre dla wydajności, chcemy utrzymać zbuforowane dane w pamięci dłużej. Since the cache will grow larger, we still want to reduce swapping to not cause increased swap I/O.

To check current values using these commands use:

sudo cat /proc/sys/vm/swappinesssudo cat /proc/sys/vm/vfs_cache_pressure

To enable these settings temporarily without rebooting, use the following commands:

sudo sysctl -w vm.swappiness=10sudo sysctl -w vm.vfs_cache_pressure=50