Do czego służy moja zamiana (Ubuntu)?

30

Mam serwer Ubuntu 8.04, na którym działa baza danych i kilka serwerów aplikacji Java. Konfiguracja i użycie pamięci to:

             total       used       free     shared    buffers     cached
Mem:      16456176   15930028     526148          0      81372    9674196
-/+ buffers/cache:    6174460   10281716
Swap:      1951888     366100    1585788

Zauważyłem, że swap rośnie każdego popołudnia i jest wypuszczany w nocy. Zapotrzebowanie nie jest takie samo we wszystkie dni i zaczyna się o różnych porach. Jest to więc dość losowe, z wyjątkiem rozmytej granicy „popołudniowej nocy”.

Obciążenie tej maszyny zmienia się w ciągu dnia. Jest bardzo niska między północą a 6-7 rano, znacznie wyżej (ale stabilnie) do 18-18, a następnie stopniowo spada.

Teraz mam następujące pytania:

  1. Jak mogę sprawdzić, które procesy używają wymiany?
  2. Dlaczego woli wymieniać się niż pobierać pamięć z pamięci podręcznej?
Konrad Garus
źródło

Odpowiedzi:

25

Opisane przez ciebie wzorce użycia swapów nie wydają się zaskakujące. Są spójne z niektórymi stale działającymi procesami o rzadko używanych stronach. W ciągu dnia, ze względu na wysoką aktywność, rzadko używane strony są prawie zawsze w wymianie. W nocy jest więcej miejsca w pamięci RAM.

Możesz zobaczyć, ile pamięci różnego rodzaju używa każdy proces w toplub htop. Żadne z nich nie pokazuje domyślnie użycia zamiany, ale oba można skonfigurować do (góra: naciśnij fi włącz SWAPkolumnę; htop: naciśnij F2, dodaj NSWAPkolumnę). Możesz uzyskać więcej informacji na temat określonego procesu, podając cat /proc/12345/vmstatgdzie 12345jest identyfikator procesu. Zauważ, że „ile wymiany używa program” nie jest całkowicie dobrze zdefiniowane, ponieważ niektóre strony są współużytkowane przez kilka procesów.

Istnieją dwa główne rodzaje konkurentów dla pamięci RAM: pamięć procesowa (którą można wymienić) i pamięci podręczne dysków (które można ponownie odczytać z pliku). Nie ma powodu, aby zawsze traktować priorytetowo pamięć procesową nad pamięcią podręczną dysku: lepiej jest zamienić rzadko używaną część pamięci procesowej niż ciągle odczytywać plik do pamięci. Podane liczby, z około połową (powiedzmy 30% –70%) pamięci przeznaczonej na pamięć podręczną dysków, są typowe dla systemów, które mają rozsądną ilość pamięci RAM do zadań, które powinny wykonać.

Gilles „SO- przestań być zły”
źródło
6
Nie mogę znaleźć NSWAPkolumny (Ubuntu 16.04: /).
jjmontes
1
@jjmontes Zostało usunięte . Nie wiem dlaczego.
Gilles „SO- przestań być zły”
W htop FAQ stwierdza, że autor nie wierzy, że to możliwe, aby dokładnie zgłosić wykorzystanie wymiany, a górna na metryczny jest niedokładna.
Oliver Evans,
0

Na StackOverflow już masz doskonałą odpowiedź na pierwsze pytanie („Który proces faktycznie używa wymiany?”).

https://stackoverflow.com/a/7180078/1442301

Krótko mówiąc, narzędzia takie jak toplub htopwcale nie dostarczają dokładnych informacji na temat korzystania z wymiany. Powinieneś zanurzyć się w /procfolderze (w pseudopliku /proc/$PID/smaps), aby uzyskać dokładniejsze informacje.

Po wspomniano powyżej zawiera krótki skrypt, aby uzyskać tę informację echem w sposób miły.

Xavier
źródło
0

Dzięki htop v1.01, Nacisnąłem „S”, aby dodać NSWAPkolumnę zamiast „F2” (jak sugeruje Gilles), a następnie Columns> Available Columns> i F5aby go dodać.

wprowadź opis zdjęcia tutaj

Genjo
źródło
Mam htop 2.0.1 i nie widzę opcji NSWAP :(
Adam
1
@Adam Konserwator nie chce już wyświetlać tej kolumny, ponieważ nie ma niezawodnego sposobu na uzyskanie tych informacji; zobacz Dlaczego htop nie zawiera kolumny SWAP, np. top?
Genjo
0

Bez odpytywania i analizowania danych wyjściowych narzędzi, takich jak vmstat, freei topnajlepszym miejscem do patrzenia mogą być crontabs użytkownika root lub innych użytkowników w systemie. Jeśli ogólne obciążenie systemu gwałtownie wzrośnie w pewnym momencie, istnieje szansa, że ​​w systemie cron powstanie potrzeba zasobów. W przeciwnym razie zawsze możesz utworzyć narzędzie do rejestrowania w getcie za pomocą scriptnarzędzia, które po prostu rejestruje wszystko, co trafia do STDOUT.

Więc gdybym musiał zrobić jednorazowy skrypt, aby złapać dane wyjściowe do późniejszej kontroli, w jednym terminalu napisałbym:

script /tmp/free.txt

i wtedy

while (true); do date; free; sleep 30; done

i w innym terminalu

script /tmp/top.txt

i wtedy

while (true); do date; top -n 1; sleep 30; done

a następnie następnego ranka zabij obie scriptinwokacje i dopasuj dane wyjściowe do topifree

po raz kolejny jest to podejście do getta, ale wygląda na to, że potrzebujesz tylko jednorazowego

możesz także przeczytać przewodnik wymiany Ubuntu

Brad Clawsie
źródło