Twoja zaakceptowana odpowiedź jest nieprawidłowa. Zastanów się nad zmianą na odpowiedź Lolotux, która jest poprawna.
jterrace
@ jterrace jest poprawne, nie mam tyle miejsca wymiany, ile suma wartości w kolumnie SWAP u góry.
akostadinov
1
iotop jest bardzo przydatnym poleceniem, które pokazuje statystyki na żywo użycia i zamiany na proces / wątek
sunil
@ jterrace, rozważ podanie, czyja odpowiedź dnia jest błędna. Sześć lat później reszta z nas nie ma pojęcia, czy odnosiłeś się do odpowiedzi Davida Holma (obecnie akceptowanej na dzień dzisiejszy), czy innej. (Cóż, widzę, że również powiedział odpowiedź Davida Holma jest źle, jako komentarz na jego odpowiedź ... więc myślę, że jesteś prawdopodobnie na myśli jego.)
Don Hatch
Odpowiedzi:
106
Uruchom na górze, a następnie naciśnij OpEnter. Teraz procesy powinny być posortowane według użycia wymiany.
Oto aktualizacja, ponieważ moja pierwotna odpowiedź nie zawiera dokładnej odpowiedzi na problem, jak wskazano w komentarzach. Z htop FAQ :
Nie jest możliwe uzyskanie dokładnego rozmiaru używanej przestrzeni wymiany procesu. Top fałszuje te informacje, tworząc SWAP = VIRT - RES, ale nie jest to dobra miara, ponieważ inne rzeczy, takie jak pamięć wideo, również liczą się z VIRT (na przykład: top mówi, że mój proces X używa 81 mln swapów, ale także zgłasza, że mój system używa tylko 2 mln swapów. Dlatego nie dodam podobnej kolumny swap do htop, ponieważ nie znam niezawodnego sposobu na uzyskanie tych informacji (w rzeczywistości nie sądzę, że można uzyskać dokładna liczba z powodu udostępnionych stron).
Z dokumentów wynika, że kolumna SWAP u góry pokazuje po prostu, ile wymiany byłoby konieczne, gdyby cały proces został zamieniony, a nie jaka część procesu jest aktualnie zamieniona. Z tego, co mogę powiedzieć po krótkim wyszukiwaniu, nie ma sposobu, aby określić, ile z każdego procesu jest obecnie zamienionych. Z tego powodu autor htop odmawia umieszczenia takiej kolumny (widzę kolumny CNSWAP i NSWAP, ale wydaje się, że nic nie robią na moim komputerze): htop.sourceforge.net/index.php?page=faq
yukondude
6
@yukondude ma rację, kolumna SWAP na górze to po prostu VIRT - RES, a ta informacja jest w tym kontekście bezużyteczna. Brak rekompensaty za np. Pamięć współdzieloną zmapowanej pamięci RAM wideo. Ponadto proces może nie odnosić się jeszcze do całej pamięci. W takim przypadku system operacyjny nie musi czytać całego pliku binarnego z dysku do pamięci, a zatem wartość RES nie obejmuje tej części pamięci.
Bart
Głosowałbym za tym bardziej, gdybym mógł. To ratuje mój bekon!
atrain
Na szczęście takie są komentarze na @jterrace :) (chociaż trzeba je przeczytać: S ... nie jestem pewien, do czego odnosi się atrain, mam nadzieję, że to yukondude)
AJP
11
Jeśli chodzi o komentarz, to już nie działa: Wydaje się, że nowsze wersje top nie mają już „O” jako klucza do wyboru pól sortowania. Podczas korzystania z? klucz możesz zobaczyć aktualną nazwę i wersję programu, procps-ng jest najnowszą wersją. To jest rozwidlenie Debiana, Fedory i openSUSE: gitorious.org/procps . Jeśli nadal chcesz wykonać sortowanie w kolumnie SWAP: Użyj klawisza „f”, aby wyświetlić pola, użyj klawiszy strzałek, aby przejść do SWAP i użyj „s”, aby ustawić sortowanie, a następnie „q”.
Oto jeden wariant skryptu i nie wymaga rootowania:
#!/bin/bash
# Get current swap usage for all running processes
# Erik Ljungstrom 27/05/2011
# Modified by Mikko Rantalainen 2012-08-09
# Pipe the output to "sort -nk3" to get sorted output
# Modified by Marc Methot 2014-09-18
# removed the need for sudo
SUM=0
OVERALL=0
for DIR in `find /proc/ -maxdepth 1 -type d -regex "^/proc/[0-9]+"`
do
PID=`echo $DIR | cut -d / -f 3`
PROGNAME=`ps -p $PID -o comm --no-headers`
for SWAP in `grep VmSwap $DIR/status 2>/dev/null | awk '{ print $2 }'`
do
let SUM=$SUM+$SWAP
done
if (( $SUM > 0 )); then
echo "PID=$PID swapped $SUM KB ($PROGNAME)"
fi
let OVERALL=$OVERALL+$SUM
SUM=0
done
echo "Overall swap used: $OVERALL KB"
zabawne, ale dostaję Overall swap used: 260672 KB, podczas gdy darmowe pokazy 738932używane ...
Doncho Gunchev
23
Te same dane wyjściowe dziesięć razy szybciej: for file in /proc/*/status ; do awk '/Tgid|VmSwap|Name/{printf $2 " " $3}END{ print ""}' $file; done | grep kB | sort -k 3 -ndla Debian / RH 6x +, Arch, Ubuntu (RH 5x has VmSize) ( źródło ). Podobnie jak @gunchev daje znacznie mniej całkowitą zamianę niż free. @Tensibai nie działa w Arch; twój awk może czegoś nie mieć.
Bardzo fajny scenariusz. Daje te same informacje, co Lolotux, ale w bardziej czytelny sposób.
Philipp Wendler
Doskonała wydajność. Dzięki.
Brian Cline,
2
Jedyną rzeczą, którą zmieniłem, było użycie argszamiast commw pspoleceniu, ponieważ mam wiele procesów o tej samej nazwie, ale z różnymi argumentami (kilka procesów gunicorn w Pythonie). To ps -p $PID -o args --no-headers
Ten jest dobry. Oto dostosowana wersja z tego artykułu, aby pokazać procs posortowane według użycia wymiany z dodanym PID: $ for file in / proc / * / status; do awk '/ ^ Pid | VmSwap | Nazwa / {printf $ 2 "" $ 3} END {print ""}' $ plik; zrobione | sortuj -k 3 -n -r | mniej
Stan Brajewski
Powinieneś glob / proc / [1-9] * / status, aby wykluczyć kilka specjalnych wpisów / proc, i możesz łączyć argumenty sortowania jako -rnk3
dland
10
Nie jest do końca jasne, czy chcesz znaleźć proces, który spowodował zamianę większości stron, lub proces, który spowodował zamianę większości stron.
W przypadku pierwszego możesz uruchomić topi zamówić przez zamianę (naciśnij „Op”), w drugim przypadku możesz uruchomić vmstati poszukać niezerowych wpisów dla „tak”.
Górne polecenie zawiera także pole do wyświetlenia liczby błędów strony dla procesu. Proces z maksymalną liczbą błędów stron byłby procesem, który najbardziej zamienia. W przypadku długo działających demonów może to oznaczać, że na początku powodują one dużą liczbę błędów stron, a liczba ta nie wzrasta później. Musimy więc obserwować, czy liczba błędów stron rośnie.
Kolejny wariant skryptu omijający pętlę w powłoce:
#!/bin/bash
grep VmSwap /proc/[0-9]*/status | awk -F':' -v sort="$1" '
{
split($1,pid,"/") # Split first field on /
split($3,swp," ") # Split third field on space
cmdlinefile = "/proc/"pid[3]"/cmdline" # Build the cmdline filepath
getline pname[pid[3]] < cmdlinefile # Get the command line from pid
swap[pid[3]] = sprintf("%6i %s",swp[1],swp[2]) # Store the swap used (with unit to avoid rebuilding at print)
sum+=swp[1] # Sum the swap
}
END {
OFS="\t" # Change the output separator to tabulation
print "Pid","Swap used","Command line" # Print header
if(sort) {
getline max_pid < "/proc/sys/kernel/pid_max"
for(p=1;p<=max_pid;p++) {
if(p in pname) print p,swap[p],pname[p] # print the values
}
} else {
for(p in pname) { # Loop over all pids found
print p,swap[p],pname[p] # print the values
}
}
print "Total swap used:",sum # print the sum
}'
Standardowe użycie polega script.shna uzyskiwaniu użycia według programu z losową kolejnością (aż do sposobu awkprzechowywania jego skrótów) lub script.sh 1sortowaniu wyników według pid.
Mam nadzieję, że skomentowałem kod na tyle, aby powiedzieć, co on robi.
Zauważ, że bashrozwija katalogi w sposób posortowany (leksykalny, nie numeryczny). Losowa kolejność zależy od tego, jak awkprzechowuje swoje tablice (tablica skrótów) i jak for p in pnameje pobiera.
Stephane Chazelas,
@StephaneChazelas Cóż, to nawet nie jest leksykalne, to jest rodzaj kodu ascii (jak /proc/1/statusnastępuje /proc/1992/statusi że /ma kod ascii powyżej kodu ascii 9. To daje wygląd „losowy porządek” też. Zgadzam się z tabelą skrótów awk , Skorzystałem tutaj ze skrótu. Edytuj odpowiedź, aby zachować atrybucję w historii edycji
Tensibai
1
/proc/1/statusnie pojawiłby się /proc/1992/statusw lokalizacji C, gdzie kolejność oparta jest na wartości bajtów. Dzieje się to w twoich ustawieniach narodowych (lub w moim en_GB.UTF-8w systemie GNU), ponieważ /są one ignorowane w algorytmie sortowania (i ssortuje po 9). Porównaj printf '/proc/%s/status\n' 1 1992 | LC_ALL=en_GB.UTF-8 sortz printf '/proc/%s/status\n' 1 1992 | LC_ALL=C sort. W lokalizacjach innych niż Cporządek sortowania zasadniczo nie jest oparty na wartości bajtów.
Stephane Chazelas
@StephaneChazelas Fajny punkt, nie myślałem o lokalizacji. Ponownie możesz edytować, aby dodać precyzję, aby kredyty były twoje (przynajmniej w edycji historycznej).
To jest dokładnie to samo niż lolotux scenariusza , ale bez rozwidleniu grep, awklub ps. To jest o wiele szybsze!
I jako grzmotnąć jest jednym z najbiedniejszych muszla jeśli chodzi o wydajność, wykonano trochę pracy, aby skrypt działał dobrze dziarskość, busyboxi niektóre inne. Potem ( dzięki Stéphane Chazelas ) znów stać się znacznie szybszym!
#!/bin/sh
# Get current swap usage for all running processes
# Felix Hauri 2016-08-05
# Rewritted without fork. Inspired by first stuff from
# Erik Ljungstrom 27/05/2011
# Modified by Mikko Rantalainen 2012-08-09
# Pipe the output to "sort -nk3" to get sorted output
# Modified by Marc Methot 2014-09-18
# removed the need for sudo
OVERALL=0
rifs=`printf ': \t'`
for FILE in /proc/[0-9]*/status ;do
SUM=0
while IFS="$rifs" read FIELD VALUE ;do
case $FIELD in
Pid ) PID=$VALUE ;;
Name ) PROGNAME="$VALUE" ;;
VmSwap ) SUM=$((SUM=${VALUE% *})) ;;
esac
done <$FILE
[ $SUM -gt 0 ] &&
printf "PID: %9d swapped: %11d KB (%s)\n" $PID $SUM "$PROGNAME"
OVERALL=$((OVERALL+SUM))
done
printf "Total swapped memory: %14u KB\n" $OVERALL
Zakłada, że nazwy procesów nie zawierają spacji, tabulacji :, odwrotnego ukośnika, symboli wieloznacznych ani znaków kontrolnych.
Stephane Chazelas,
@StephaneChazelas Thanks! Dodałem [1-9]wcześniej *do zliczania tylko ponumerowanych ścieżek (nie self, ani thread-self)
F. Hauri
1
Składnia jest znana, ale nazwy procesów nie są. Przynajmniej podaj swoje zmienne . (w każdym razie twój skrypt jest o wiele mniej zły niż loloxux ').
Stephane Chazelas,
1
Nazwy procesów w systemie Linux mogą zawierać dowolną wartość bajtu, ale 0, ale są ograniczone do 15 bajtów. NameWpis /proc/*/statuskoduje niektóre z tych wartości bajtów. Spróbuj na przykład perl -ne 'BEGIN{$0="\n\t\\"} print if /^Name/' /proc/self/status. Ponieważ jest tak krótki, szkody, które można wyrządzić za pomocą takich rzeczy, perl -ne 'BEGIN{$0="/*/*/../../*/*"} print if /^Name/' /proc/self/statussą ograniczone, gdy zapomnisz podać swoje zmienne.
Stephane Chazelas
1
Ta (przynajmniej wersja Perla, którą właśnie wypróbowałem) jest znacznie szybsza niż inne odpowiedzi.
David Gardner
5
Dostosowałem inny skrypt w sieci do tego długiego linku:
{ date;for f in /proc/[0-9]*/status; do
awk '{k[$1]=$2} END { if (k["VmSwap:"]) print k["Pid:"],k["Name:"],k["VmSwap:"];}' $f 2>/dev/null;
done | sort -n ; }
Które następnie wrzucam do cronjob i przekierowuję dane wyjściowe do pliku dziennika. Informacje tutaj są takie same, jak gromadzenie Swap:wpisów w pliku smaps, ale jeśli chcesz być pewien, możesz użyć:
{ date;for m in /proc/*/smaps;do
awk '/^Swap/ {s+=$2} END { if (s) print FILENAME,s }' $m 2>/dev/null;
done | tr -dc ' [0-9]\n' |sort -k 1n; }
Dane wyjściowe tej wersji są w dwóch kolumnach: pid, kwota zamiany. W powyższej wersji trusuwa elementy nienumeryczne. W obu przypadkach dane wyjściowe są sortowane numerycznie według pid.
To dobrze, ale pierwszy sortuje według pid rosnąco (sort -n). Lepsze użycie polega na posortowaniu według użycia wymiany w kolejności malejącej (najczęściej używane na początku listy). Aby to zmienić, zmień „sort -n” na „sort -n -k 3 -r”
Stan Brajewski
3
W MacOSX również uruchamiasz polecenie top, ale musisz wpisać „o”, a następnie „vsize”, a następnie ENTER.
Przypuszczam, że można się domyślić, biegając top i szukając aktywnych procesów przy użyciu dużej ilości pamięci. Wykonanie tego programowo jest trudniejsze - wystarczy spojrzeć na niekończące się debaty na temat heurystyki zabójcy Linux OOM.
Zamiana jest funkcją posiadania większej ilości pamięci w aktywnym użyciu niż jest zainstalowana, więc zwykle ciężko jest winić ją za pojedynczy proces. Jeśli jest to ciągły problem, najlepszym rozwiązaniem jest zainstalowanie większej ilości pamięci lub wprowadzenie innych zmian systemowych.
Nie znam żadnej bezpośredniej odpowiedzi, jak znaleźć dokładnie proces wykorzystujący przestrzeń wymiany, jednak ten link może być pomocny . Kolejny dobry jest tutaj
Ponadto użyj dobrego narzędzia, takiego jak htop, aby zobaczyć, które procesy zużywają dużo pamięci i ile ogólnie używana jest zamiana.
iotopjest bardzo przydatnym narzędziem. Daje bieżące statystyki wykorzystania I / O i zamiany na proces / wątek. Domyślnie pokazuje się na wątek, ale możesz zrobić, iotop -Paby uzyskać informacje na temat procesu. To nie jest domyślnie dostępne. Może być konieczne zainstalowanie przez rpm / apt.
Oto wersja, która wypisuje to samo co skrypt @loolotux, ale jest znacznie szybsza (choć mniej czytelna). Ta pętla zajmuje około 10 sekund na mojej maszynie, moja wersja zajmuje 0,019 s, co miało dla mnie znaczenie, ponieważ chciałem zrobić z niej stronę cgi.
Od roku 2015 łatka na jądro, która dodaje SwapPss( https://lore.kernel.org/patchwork/patch/570506/ ), można w końcu uzyskać proporcjonalną liczbę zamian, co oznacza, że jeśli proces dużo zamienił, a potem się rozwidla, oba rozwidlone zostanie zgłoszona zamiana po 50%. A jeśli oba rozwidlają się, każdy proces jest liczony w 33% zamienionych stron, więc jeśli policzysz wszystkie te zamiany razem, otrzymasz rzeczywiste użycie zamiany zamiast wartości pomnożonej przez liczbę procesów.
W skrócie:
(cd /proc; for pid in [0-9]*; do printf "%5s %6s %s\n" "$pid" "$(awk 'BEGIN{sum=0} /SwapPss:/{sum+=$2} END{print sum}' $pid/smaps)" "$(cat $pid/comm)"; done | sort -k2n,2 -k1n,1)
Pierwsza kolumna to pid, druga kolumna to użycie zamiany w KiB, a reszta linii jest wykonywana. Identyczne liczby zamian są sortowane według pid.
Powyżej mogą emitować linie takie jak
awk: cmd. line:1: fatal: cannot open file `15407/smaps' for reading (No such file or directory)
co oznacza po prostu, że proces z pid 15407 zakończył się między wyświetleniem go na liście dla /proc/ a odczytaniem smapspliku procesu . Jeśli to dla Ciebie ważne, po prostu dodaj2>/dev/null do końca. Pamiętaj, że potencjalnie utracisz także wszelkie inne możliwe elementy diagnostyczne.
W prawdziwym przypadku przykładowym zmienia to inne narzędzia zgłaszające użycie ~ 40 MB zamiany dla każdego elementu potomnego apache działającego na jednym serwerze na faktyczne użycie w zakresie 7-3630 KB faktycznie używanych na dziecko.
Odpowiedzi:
Uruchom na górze, a następnie naciśnij OpEnter. Teraz procesy powinny być posortowane według użycia wymiany.
Oto aktualizacja, ponieważ moja pierwotna odpowiedź nie zawiera dokładnej odpowiedzi na problem, jak wskazano w komentarzach. Z htop FAQ :
źródło
Najlepszy skrypt, jaki znalazłem, znajduje się na tej stronie: http://northernmost.org/blog/find-out-what-is-using-your-swap/
Oto jeden wariant skryptu i nie wymaga rootowania:
źródło
Overall swap used: 260672 KB
, podczas gdy darmowe pokazy738932
używane ...for file in /proc/*/status ; do awk '/Tgid|VmSwap|Name/{printf $2 " " $3}END{ print ""}' $file; done | grep kB | sort -k 3 -n
dla Debian / RH 6x +, Arch, Ubuntu (RH 5x hasVmSize
) ( źródło ). Podobnie jak @gunchev daje znacznie mniej całkowitą zamianę niżfree
. @Tensibai nie działa w Arch; twój awk może czegoś nie mieć.top
: northernmost.org/blog/swap-usage-5-years-laterOto inny wariant skryptu, ale przeznaczony do zapewnienia bardziej czytelnego wyniku (musisz uruchomić go jako root, aby uzyskać dokładne wyniki):
źródło
args
zamiastcomm
wps
poleceniu, ponieważ mam wiele procesów o tej samej nazwie, ale z różnymi argumentami (kilka procesów gunicorn w Pythonie). Tops -p $PID -o args --no-headers
grep VmSwap $DIR/status 2>/dev/null | awk '{ print $2 }'
można to uprościć jakoawk ' /VmSwap/ { print $2 }'
Zauważyłem, że ten wątek jest dość stary, ale jeśli trafisz na niego, tak jak właśnie to zrobiłem, inna odpowiedź brzmi: użyj smem.
Oto link, który mówi zarówno, jak zainstalować i jak go używać:
http://www.cyberciti.biz/faq/linux-which-process-is-using-swap/
źródło
Nie jest do końca jasne, czy chcesz znaleźć proces, który spowodował zamianę większości stron, lub proces, który spowodował zamianę większości stron.
W przypadku pierwszego możesz uruchomić
top
i zamówić przez zamianę (naciśnij „Op”), w drugim przypadku możesz uruchomićvmstat
i poszukać niezerowych wpisów dla „tak”.źródło
Górne polecenie zawiera także pole do wyświetlenia liczby błędów strony dla procesu. Proces z maksymalną liczbą błędów stron byłby procesem, który najbardziej zamienia. W przypadku długo działających demonów może to oznaczać, że na początku powodują one dużą liczbę błędów stron, a liczba ta nie wzrasta później. Musimy więc obserwować, czy liczba błędów stron rośnie.
źródło
Kolejny wariant skryptu omijający pętlę w powłoce:
Standardowe użycie polega
script.sh
na uzyskiwaniu użycia według programu z losową kolejnością (aż do sposobuawk
przechowywania jego skrótów) lubscript.sh 1
sortowaniu wyników według pid.Mam nadzieję, że skomentowałem kod na tyle, aby powiedzieć, co on robi.
źródło
bash
rozwija katalogi w sposób posortowany (leksykalny, nie numeryczny). Losowa kolejność zależy od tego, jakawk
przechowuje swoje tablice (tablica skrótów) i jakfor p in pname
je pobiera./proc/1/status
następuje/proc/1992/status
i że/
ma kod ascii powyżej kodu ascii 9. To daje wygląd „losowy porządek” też. Zgadzam się z tabelą skrótów awk , Skorzystałem tutaj ze skrótu. Edytuj odpowiedź, aby zachować atrybucję w historii edycji/proc/1/status
nie pojawiłby się/proc/1992/status
w lokalizacji C, gdzie kolejność oparta jest na wartości bajtów. Dzieje się to w twoich ustawieniach narodowych (lub w moimen_GB.UTF-8
w systemie GNU), ponieważ/
są one ignorowane w algorytmie sortowania (is
sortuje po9
). Porównajprintf '/proc/%s/status\n' 1 1992 | LC_ALL=en_GB.UTF-8 sort
zprintf '/proc/%s/status\n' 1 1992 | LC_ALL=C sort
. W lokalizacjach innych niżC
porządek sortowania zasadniczo nie jest oparty na wartości bajtów.Jeszcze dwa warianty:
Ponieważ
top
lubhtop
nie można go zainstalować w małych systemach, przeglądanie/proc
zawsze jest możliwe.Nawet w małych systemach znajdziesz
shell
...ZA muszlawariant! (Nie tylko bash)
To jest dokładnie to samo niż lolotux scenariusza , ale bez rozwidleniu
grep
,awk
lubps
. To jest o wiele szybsze!I jako grzmotnąć jest jednym z najbiedniejszych muszla jeśli chodzi o wydajność, wykonano trochę pracy, aby skrypt działał dobrze dziarskość, busyboxi niektóre inne. Potem ( dzięki Stéphane Chazelas ) znów stać się znacznie szybszym!
Nie zapomnij o podwójnej wycenie
"$PROGNAME"
! Zobacz komentarz Stéphane Chazelas :Nie próbuj
echo $PROGNAME
bez podwójnego cytowania na rozsądnym systemie i bądź gotowy zabić wcześniejszą powłokę!I perl wersja
Ponieważ staje się to nie tak prostym skryptem, nadchodzi czas na napisanie dedykowanego narzędzia przy użyciu bardziej wydajnego języka.
mógł biec z jednym z
źródło
:
, odwrotnego ukośnika, symboli wieloznacznych ani znaków kontrolnych.[1-9]
wcześniej*
do zliczania tylko ponumerowanych ścieżek (nieself
, anithread-self
)Name
Wpis/proc/*/status
koduje niektóre z tych wartości bajtów. Spróbuj na przykładperl -ne 'BEGIN{$0="\n\t\\"} print if /^Name/' /proc/self/status
. Ponieważ jest tak krótki, szkody, które można wyrządzić za pomocą takich rzeczy,perl -ne 'BEGIN{$0="/*/*/../../*/*"} print if /^Name/' /proc/self/status
są ograniczone, gdy zapomnisz podać swoje zmienne.Dostosowałem inny skrypt w sieci do tego długiego linku:
Które następnie wrzucam do cronjob i przekierowuję dane wyjściowe do pliku dziennika. Informacje tutaj są takie same, jak gromadzenie
Swap:
wpisów w pliku smaps, ale jeśli chcesz być pewien, możesz użyć:Dane wyjściowe tej wersji są w dwóch kolumnach: pid, kwota zamiany. W powyższej wersji
tr
usuwa elementy nienumeryczne. W obu przypadkach dane wyjściowe są sortowane numerycznie według pid.źródło
W MacOSX również uruchamiasz polecenie top, ale musisz wpisać „o”, a następnie „vsize”, a następnie ENTER.
źródło
Przypuszczam, że można się domyślić, biegając
top
i szukając aktywnych procesów przy użyciu dużej ilości pamięci. Wykonanie tego programowo jest trudniejsze - wystarczy spojrzeć na niekończące się debaty na temat heurystyki zabójcy Linux OOM.Zamiana jest funkcją posiadania większej ilości pamięci w aktywnym użyciu niż jest zainstalowana, więc zwykle ciężko jest winić ją za pojedynczy proces. Jeśli jest to ciągły problem, najlepszym rozwiązaniem jest zainstalowanie większej ilości pamięci lub wprowadzenie innych zmian systemowych.
źródło
Podaje sumy i procenty dla procesu z wykorzystaniem swap
Źródło: https://www.cyberciti.biz/faq/linux-which-process-is-using-swap/
źródło
Nie znam żadnej bezpośredniej odpowiedzi, jak znaleźć dokładnie proces wykorzystujący przestrzeń wymiany, jednak ten link może być pomocny . Kolejny dobry jest tutaj
Ponadto użyj dobrego narzędzia, takiego jak htop, aby zobaczyć, które procesy zużywają dużo pamięci i ile ogólnie używana jest zamiana.
źródło
iotop
jest bardzo przydatnym narzędziem. Daje bieżące statystyki wykorzystania I / O i zamiany na proces / wątek. Domyślnie pokazuje się na wątek, ale możesz zrobić,iotop -P
aby uzyskać informacje na temat procesu. To nie jest domyślnie dostępne. Może być konieczne zainstalowanie przez rpm / apt.źródło
Oto wersja, która wypisuje to samo co skrypt @loolotux, ale jest znacznie szybsza (choć mniej czytelna). Ta pętla zajmuje około 10 sekund na mojej maszynie, moja wersja zajmuje 0,019 s, co miało dla mnie znaczenie, ponieważ chciałem zrobić z niej stronę cgi.
źródło
Od roku 2015 łatka na jądro, która dodaje
SwapPss
( https://lore.kernel.org/patchwork/patch/570506/ ), można w końcu uzyskać proporcjonalną liczbę zamian, co oznacza, że jeśli proces dużo zamienił, a potem się rozwidla, oba rozwidlone zostanie zgłoszona zamiana po 50%. A jeśli oba rozwidlają się, każdy proces jest liczony w 33% zamienionych stron, więc jeśli policzysz wszystkie te zamiany razem, otrzymasz rzeczywiste użycie zamiany zamiast wartości pomnożonej przez liczbę procesów.W skrócie:
Pierwsza kolumna to pid, druga kolumna to użycie zamiany w KiB, a reszta linii jest wykonywana. Identyczne liczby zamian są sortowane według pid.
Powyżej mogą emitować linie takie jak
co oznacza po prostu, że proces z pid 15407 zakończył się między wyświetleniem go na liście dla
/proc/
a odczytaniemsmaps
pliku procesu . Jeśli to dla Ciebie ważne, po prostu dodaj2>/dev/null
do końca. Pamiętaj, że potencjalnie utracisz także wszelkie inne możliwe elementy diagnostyczne.W prawdziwym przypadku przykładowym zmienia to inne narzędzia zgłaszające użycie ~ 40 MB zamiany dla każdego elementu potomnego apache działającego na jednym serwerze na faktyczne użycie w zakresie 7-3630 KB faktycznie używanych na dziecko.
źródło