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 ...
Odpowiedzi:
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.
źródło
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.
źródło
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 ?
źródło
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:
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).
źródło