Dlaczego Swap jest używany, gdy pozostało dużo wolnej pamięci?

35

Mam całkiem niezły serwer (dedykowany) z dobrymi zasobami pamięci:

System information
Server load     2.19 (8 CPUs)   
Memory Used     29.53% (4,804,144 of 16,267,652)    
Swap Used   10.52% (220,612 of 2,097,136)   

Jak widać, mój serwer używa swap, gdy jest dużo wolnej pamięci.

Czy to normalne, czy coś jest nie tak z konfiguracją lub kodowaniem?

NB
Mój proces MySQL z jakiegoś powodu zużywa ponad 160% mocy procesora; Nie wiem dlaczego, ale nie mam więcej niż 70 użytkowników jednocześnie ...

użytkownik1179459
źródło
Aplikacje mogą używać ponad 100% procesora w systemie Linux? Erm ...
BlueRaja
5
@BlueRaja: Tak, ponieważ w systemie Linux wykorzystanie procesora jest mierzone względem pojedynczego procesora, a nie wszystkich procesorów w systemie. Tak więc w maszynie z 8 procesorami masz maksymalnie 800% dostępnego procesora.
Daniel Pryden
Jakiej wersji MySQL używasz?
RolandoMySQLDBA
@RolandoMySQLDBA wersja 5.5
1179459

Odpowiedzi:

61

To jest całkowicie normalne.

Podczas uruchamiania systemu uruchamia się szereg usług. Usługi te inicjują się same, wczytują pliki konfiguracyjne, tworzą struktury danych i tak dalej. Używają trochę pamięci. Wiele z tych usług nigdy nie będzie działać ponownie przez cały czas działania systemu, ponieważ ich nie używasz. Niektóre z nich mogą trwać za kilka godzin, dni lub tygodni. Jednak wszystkie te dane są w pamięci fizycznej.

Oczywiście system nie może wyrzucić tych danych. Nie może udowodnić, że dosłownie nigdy nie będzie dostępny. Jedną z tych usług może być na przykład ta, która zapewnia zdalny dostęp do skrzynki. Być może nie używałeś go od tygodnia, ale jeśli go użyjesz, będzie lepiej.

Ale system wie, że może chcieć wykorzystać tę pamięć fizyczną do takich celów, jak pamięć podręczna dysku lub w inny sposób, który poprawi wydajność. Czyni to oportunistyczne zamiany. Gdy nie ma nic lepszego do roboty, zapisuje na dysku dane, które nie były używane przez bardzo długi czas, wykorzystując przestrzeń wymiany. Jednak nadal utrzymuje strony w pamięci fizycznej. Dzięki temu można uzyskać do nich dostęp bez konieczności ich wymiany.

Teraz, jeśli system potrzebuje później tej fizycznej pamięci na coś innego, może po prostu wyrzucić te strony, ponieważ już je napisał do zamiany. To daje systemowi to, co najlepsze z obu światów. Dane są nadal przechowywane w pamięci, więc można uzyskać do nich dostęp bez konieczności odczytywania ich z dysku. Ale jeśli system potrzebuje tej pamięci do innego celu, nie będzie musiał jej najpierw zapisać. Wielka wygrana dookoła.

David Schwartz
źródło
W takim przypadku możesz wyjaśnić, dlaczego czasami zamiana przestrzeni w ogóle nie jest używana. Mem: 49554484k łącznie, 4087592k używane, 45466892k wolne, 349244k bufory Zamiana: 94204k całkowite, 0k używane, 94204k wolne, 1113644k buforowane
ananthan
4
@ananthan: Może być wiele przyczyn. Najbardziej prawdopodobne jest to, że system nigdy nie był pod presją pamięci, nawet z powodu buforowanych zapisów, więc oportunistyczny kod wymiany mógł nigdy nie zostać uruchomiony. Może się również zdarzyć, że ktoś pomyślał, że jakiekolwiek użycie zamiany jest złe i dlatego źle dostosował system, aby nie zamieniał się oportunistycznie (poprzez zmniejszenie zamiany ).
David Schwartz
6

Może się to zdarzyć, jeśli w przeszłości potrzebowałeś więcej pamięci niż fizyczna pamięć RAM w maszynie. W tym czasie niektóre dane zostaną zapisane w przestrzeni wymiany.

Kiedy później pamięć zostanie zwolniona, dane z wymiany nie są automatycznie odczytywane z powrotem do pamięci RAM: dzieje się tak tylko wtedy, gdy dane w zamianie są rzeczywiście potrzebne przez jakiś proces. To jest całkowicie normalne.

Jeśli chodzi o proces mysql: wszystko zależy od typu uruchamianych zapytań. Teoretycznie 2 bardzo złożone zapytania mogą prawdopodobnie wystarczyć do uzyskania takiego obciążenia, niezależnie od liczby użytkowników. Można włączyć dziennik wolnych zapytań, aby uzyskać lepszy wgląd w to, które zapytania powodują duże obciążenie.

brain99
źródło
Nie - użycie swap nie jest znakiem wysokiej wody. Gdy zamienione strony są odwzorowane z powrotem, strony dysku są oznaczone jako nieużywane (ale mogą nadal zawierać dane).
symcbean
Wspomniałem tylko o jednym scenariuszu, w którym można korzystać z zamiany, ale w rzeczywistości nie zawsze jest to symptomatyczne, że nie ma wystarczającej ilości pamięci fizycznej - jak również wyjaśnił David Schwartz powyżej
brain99
3

Możesz także zmienić to zachowanie sysctl -w vm.swappiness=10, co znacznie ograniczy użycie wymiany, dopóki nie będzie ona faktycznie potrzebna.

Jeśli chodzi o MySQL, czy wykonałeś przynajmniej test konfiguracji podstawowej przy użyciu skryptu tuning-primer.sh ?

Daemon of Chaos
źródło
1
Zwiększy to tendencję do odzyskiwania pamięci podręcznej / buforów. Niestety z pierwotnego pytania nie wynika jasno, czy liczba 29,53% obejmuje bufory / pamięć podręczną - jeśli nie, to dokonanie zmiany, którą zechcesz, będzie miało negatywny wpływ na wydajność. Jeśli ten dbms intensywnie korzysta z innodb, to prawdopodobnie jest źle skonfigurowany (chociaż jedno 8-rdzeniowe pudełko 16GB do użytku jako serwer WWW jest na początku BAD deisgn)
symcbean 24-12
dlaczego mówisz, że to zły wybór dla serwera WWW? nie używam zbyt dużo innodb i nadal wolę myisam, ponieważ moje odczyty wynoszą 70%, a pisze tylko 30% ....
użytkownik1179459
1

Jest to prawdopodobnie, jak wyjaśnił David, normalne zachowanie jądra Linuksa, ale może również występować problem „szaleństwa wymiany” w MySQL . W twoim przypadku (8 procesorów, łącznie 16 GB pamięci RAM, używane 5 GB), aby tak się stało, komputer powinien być systemem NUMA z 4 węzłami (gniazdami) i 4 GB pamięci RAM na węzeł oraz pulą buforów InnoDB MySQL wynoszącą 4 GB.

Krótko mówiąc (powinieneś przeczytać powyższy link, aby uzyskać szczegółowe informacje), oto co się stało:

  1. Po uruchomieniu systemu procesy są rozkładane na wszystkie węzły NUMA, wykorzystując część ich pamięci.
  2. Po uruchomieniu MySQL przydziela 4 GB dla puli buforów InnoDB, wypełniając pamięć RAM węzła NUMA i wykorzystując trochę pamięci RAM w innych węzłach.
  3. Następnie jądro Linuksa, które nie może przenosić przydzielonej pamięci RAM z jednego węzła NUMA na inny, uważa, że ​​dobrym pomysłem jest zamiana stron z głodującego węzła (lub zamiana stron, ponieważ strony musiały zostać zamienione).

Aby tego uniknąć, zmień przydział pamięci dla MySQL, aby przydzielić pamięć RAM na wszystkie rdzenie (więcej szczegółów znajdziesz w powyższym linku).

jfg956
źródło