Jak mogę dowiedzieć się, że procesy wykorzystują przestrzeń wymiany?

10

Mam najlepsze raporty serwera linux o użytej 9 GB zamiany: Top

Ale nie mogę przewidzieć, gdzie to jest zamiana, niektóre wyniki Google mówiły, że top - Ocommad follow by ppokaże użycie swap według procesu. Ale jak pokazano na powyższym obrazku, krótka suma kolumny SWAP pokazuje, że użyto> 10 GB swapu, więc skąd bierze się liczba 9 GB do wykorzystania swapów?

Najlepsze raporty mówią, że około 96492kb pamięci RAM jest wykorzystywane przez bufory. Czy jest coś, co mogę zrobić, aby to wykorzystać, zamiast zamiany?

secmask
źródło
1
góra (na stronę podręcznika) oblicza SWAP jako użycie RAM-WIRTUALNIE-FIZYCZNIE. Nie do końca dokładne z moich eksperymentów.
lornix,

Odpowiedzi:

6

Możliwe jest, że wiele programów będzie używać tego samego obszaru wymiany, więc zostanie zgłoszone dwukrotnie.

Nie trzeba próbować mówić Linuksowi, aby używał buforowanego obszaru zamiast zamiany - jest już bardzo inteligentny w tym, co robi. Jeśli używasz 9 GB wymiany i 9 GB bufora, to dobra rzecz ... to oznacza, że ​​Linux zdaje sobie sprawę, że 9 GB rzeczy załadowanych do pamięci nie jest aktywnie wykorzystywane, więc bardziej wydajne jest zamiana go na dysk, aby twój bufor może się powiększać i poprawiać wydajność.


EDYCJA: Jeśli dodasz całą pamięć używaną przez każdy proces, otrzymasz znacznie więcej niż fizyczną pamięć RAM. Wynika to z faktu, że biblioteki współdzielone są używane przez wiele programów, a także ze sposobu, w jaki Linux obsługuje widelce - nie duplikuje całego programu w pamięci, a jedynie kopiuje części, które różnią się między dwoma instancjami. W niektórych przypadkach pamięć wideo może być pokazana jako część procesu X - myślę, że zrobiły to stare karty Voodoo3. Mogą istnieć inne przypadki, w których pamięć „fantomowa” może również pojawiać się na górze.

Flimzy
źródło
Nie sądzę, aby biblioteki współdzielone mogły być liczone jako zamiana, ponieważ podczas uruchamiania systemu nie używa się zamiany, ale wiele bibliotek współdzielonych jest już załadowanych. W każdym razie, widzę, że mój system używa około 9 GB partycji wymiany, chcę tylko dowiedzieć się, który proces użył najwięcej wymiany (wyklucz biblioteki udostępniania, plik mapy pamięci ...)
secmask
3

Parsowanie podkatalogu / proc działa:

Jako skrypt bash:

for PROCESS in /proc/*/; do
  swapused=$(awk 'BEGIN { total = 0 } /^Swap:[[:blank:]]*[1-9]/ { total = total + $2 } END { print total }' ${PROCESS}/smaps 2>/dev/null || echo 0)
  if [ $swapused -gt 0 ]; then
    /bin/echo -e "${swapused}k\t$(cat ${PROCESS}/cmdline)"
  fi
done

Dane wyjściowe mogą być sortowane Hi-Lo przez potok do sortowania:

{blah}| sort -rn

Oczywiście, przepisz to w swoim ulubionym języku tygodnia według własnego uznania. Mój Awk-fu nie jest silny.

(cut-n-pastable)

#!/bin/bash
#
# show swap used by processes
#
(for PROCESS in /proc/*/; do
  swapused=$(awk 'BEGIN { total = 0 } /^Swap:[[:blank:]]*[1-9]/ { total = total + $2 } END { print total }' ${PROCESS}/smaps 2>/dev/null || echo 0)
  if [ $swapused -gt 0 ]; then
    /bin/echo -e "${swapused}k\t$(cat ${PROCESS}/cmdline)"
  fi
done ) | sort -nr
lornix
źródło
1

Alternatywny sposób:

smem -s swap -r
Kirill Feoktistov
źródło