Linux: dowiedz się, jaki proces wykorzystuje całą pamięć RAM?

106

Przed pytaniem, żeby było jasne: tak, wiem o pamięci podręcznej dysku, i nie, to nie moja sprawa :) Przepraszam za tę preambułę :)

Używam CentOS 5. Każda aplikacja w systemie ciężko się wymienia, a system jest bardzo wolny. Kiedy robię free -moto co mam:

             total       used       free     shared    buffers     cached
Mem:          3952       3929         22          0          1         18
-/+ buffers/cache:       3909         42
Swap:        16383         46      16337

Tak więc mam tylko 42 Mb do wykorzystania! Z tego co rozumiem -/+ buffers/cache właściwie nie liczy pamięci podręcznej dysku, więc rzeczywiście mam tylko 42 Mb, prawda? Pomyślałem, że mogę się mylić, więc próbowałem wyłączyć buforowanie dysku i nie miało to żadnego skutku - obraz pozostał taki sam.

Postanowiłem więc dowiedzieć się, kto używa całej mojej pamięci RAM i użyłem top za to. Ale najwyraźniej informuje, że żaden proces nie używa mojej pamięci RAM. Jedynym procesem na moim szczycie jest MySQL, ale używa on 0,1% pamięci RAM i 400 MB wymiany. To samo zdjęcie, gdy próbuję uruchomić inne usługi lub aplikacje - wszystko w zamian, top pokazuje, że MEM nie jest używany (maksymalnie 0,1% dla każdego procesu).

top - 15:09:00 up  2:09,  2 users,  load average: 0.02, 0.16, 0.11
Tasks: 112 total,   1 running, 111 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   4046868k total,  4001368k used,    45500k free,      748k buffers
Swap: 16777208k total,    68840k used, 16708368k free,    16632k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  SWAP COMMAND
 3214 ntp       15   0 23412 5044 3916 S  0.0  0.1   0:00.00  17m ntpd
 2319 root       5 -10 12648 4460 3184 S  0.0  0.1   0:00.00 8188 iscsid
 2168 root      RT   0 22120 3692 2848 S  0.0  0.1   0:00.00  17m multipathd
 5113 mysql     18   0  474m 2356  856 S  0.0  0.1   0:00.11 472m mysqld
 4106 root      34  19  251m 1944 1360 S  0.0  0.0   0:00.11 249m yum-updatesd
 4109 root      15   0 90152 1904 1772 S  0.0  0.0   0:00.18  86m sshd
 5175 root      15   0 90156 1896 1772 S  0.0  0.0   0:00.02  86m sshd

Restart nie pomaga, a tak jest bardzo wolno, czego normalnie nie oczekiwałbym na tej maszynie (4 rdzenie, 4 GB pamięci RAM, RAID1).

Tak więc - jestem pewien, że nie jest to pamięć podręczna dysku, która korzysta z pamięci RAM, ponieważ normalnie powinna ona zostać zmniejszona i pozwolić innym procesom korzystać z pamięci RAM, a następnie przejść do wymiany.

Wreszcie pytanie brzmi: jeśli ktoś ma jakieś pomysły, jak dowiedzieć się, który proces tak naprawdę wykorzystuje pamięć?

Timur
źródło
1
Czy kiedykolwiek znalazłeś odpowiedź na to pytanie?
Hackeron
@Hackeron: zaakceptowano OP ta odpowiedź . Wiem, że odpowiedź nie dotyczy Twoje pytanie , chociaż. Udało mi się odtworzyć Twój problem na jednym z moich serwerów i obecnie badam, czy istnieje sposób na rozwiązanie tego problemu.
Deltik
@Deltik Ah, ok. Dziękuję :) - Mam 2 serwery, które przeciekają całą dostępną pamięć w ciągu około 12 godzin, dajcie mi znać, czy jest coś, co mogę zrobić, aby to zdiagnozować. Jestem dostępny jako pseudonim „hackeron” na IRC (irc.freenode.org).
Hackeron
@Hackeron: Nie byłem w stanie znaleźć cię jako „hackera” irc.freenode.org. Stworzyłem czat dla szerszej dyskusji tutaj .
Deltik

Odpowiedzi:

95

W Linuksie w top proces, który możesz nacisnąć < klawisz, aby przesunąć sortowanie wyświetlacza wyjściowego w lewo. Domyślnie jest sortowany według %CPU więc jeśli naciśniesz klawisz 4 razy, sortujesz go według VIRT który jest wielkością pamięci wirtualnej, dając odpowiedź.

Innym sposobem na to jest:

ps -e -o pid,vsz,comm= | sort -n -k 2

powinien dać ci wyjście posortowane według wirtualnych rozmiarów procesów.

Oto długa wersja:

ps --everyone --format=pid,vsz,comm= | sort --numeric-sort --key=2
Karlson
źródło
To mi daje Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html na serwerze Ubuntu 11.10.
Der Hochstapler
1
@ OliverSalzburg Problemem jest -o opcje. RHEL4 to działa. RHEL5: ps -e -o pid,vsz,comm= | sort -n -k 2 Prace. Spróbuję 11.10 później dzisiaj, ale jeśli znajdziesz odpowiednie opcje sortowania, daj mi znać. ps -e -o pid,vsz,comm | sort -n -k 2 może działać, ale nie mam w tej chwili miejsca na weryfikację.
Karlson
2
Naprawdę nie znam się na -ef opcja. Ale wydaje się, że daje to rozsądne wyjście: sudo ps axo pid,vsz,comm=|sort -n -k 2
Der Hochstapler
@ OliverSalzburg Przepraszamy. Zmieniony (myślałem, że już go zmieniłem). Powinno być ps -e lub ps -a
Karlson
1
Ty, lubię najlepszą propozycję < Nie wiedziałem, że to możliwe, fedora
SSH This
56

Pokaż pamięć procesów w megabajtach i ścieżkę procesu.

ps aux  | awk '{print $6/1024 " MB\t\t" $11}'  | sort -n
notnull
źródło
7
Witamy w Super Użytkowniku. Czy możesz rozszerzyć swoją odpowiedź, aby wyjaśnić, co robi ten kod i jak rozwiązuje problem? Niewyjaśniony kod to zniechęcony , ponieważ nie uczy rozwiązania. Dzięki.
fixer1234
7
Jestem zaskoczony, że ta odpowiedź została odrzucona i ma komentarz z prośbą o jej wyjaśnienie. Jest na tyle krótki, że powinno być jasne, co ona robi (wtrąca ps aux do awk, a następnie sortuje), aw kontekście pytania pokazuje które procesy wykorzystują najwięcej pamięci RAM. Myślę, że to świetna odpowiedź.
John
13

Tylko uwaga na serwerze pokazująca te same symptomy, ale wciąż wykazująca wyczerpanie pamięci. To, co skończyło się znalezieniem, to sysctl.conf z pudełka z 32 GB pamięci RAM i konfiguracją dla DB z ogromnymi stronami skonfigurowanymi do 12000. Ta skrzynka ma tylko 2 GB pamięci RAM, więc przypisuje całą wolną pamięć RAM do dużych stron (tylko 960 z nich). Ustawienie ogromnych stron na 10, ponieważ i tak nie były używane, uwolniło całą pamięć.

Szybkie sprawdzenie / proc / meminfo w celu wyszukania ustawień HugePages_ może być dobrym początkiem rozwiązywania problemów z co najmniej jednym nieoczekiwanym hogiem pamięci.

Death Rider
źródło
2
Niedawno miałem inny serwer, na którym był problem. Jeśli w Twojej organizacji są pracownicy ex-Oracle, to ustawienie może być twoim winowajcą.
fields
2

Możesz także użyć polecenia ps, aby uzyskać więcej informacji o procesie.

ps aux | less
Atul
źródło
Z ciekawości, jaki jest właściwy sposób na uniknięcie tego polecenia? Pokazuje, że END ocne docieram do ostatniej linii, nie zabija procesu, gdy Ctrl + C to.
KingsInnerSoul
1
@KingsInnerSoul naciśnij 'q'
enobayram
1

Odwołuję się to i Całkowita pamięć używana przez proces Pythona? - Przepełnienie stosu to jest moja odpowiedź. Mam teraz konkretne narzędzie do liczenia procesów (python).

# Megabyte.
$ ps aux | grep python | awk '{sum=sum+$6}; END {print sum/1024 " MB"}'
87.9492 MB

# Byte.
$ ps aux | grep python | awk '{sum=sum+$6}; END {print sum " KB"}'
90064 KB

Dołącz moją listę procesów.

$ ps aux  | grep python
root       943  0.0  0.1  53252  9524 ?        Ss   Aug19  52:01 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
root       950  0.6  0.4 299680 34220 ?        Sl   Aug19 568:52 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
root      3803  0.2  0.4 315692 36576 ?        S    12:43   0:54 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
jonny    23325  0.0  0.1  47460  9076 pts/0    S+   17:40   0:00 python
jonny    24651  0.0  0.0  13076   924 pts/4    S+   18:06   0:00 grep python

Odniesienie

Chu-Saing Lai
źródło
1

W moim przypadku problem polegał na tym, że serwer był wirtualnym serwerem VMware vmw_balloon moduł włączony:

$ lsmod | grep vmw_balloon
vmw_balloon            20480  0
vmw_vmci               65536  2 vmw_vsock_vmci_transport,vmw_balloon

Bieganie:

$ vmware-toolbox-cmd stat balloon
5189 MB

Tak więc gospodarz odzyskał około 5 GB pamięci. Tak więc pomimo oficjalnej „8 GB do mojej maszyny wirtualnej” w praktyce było to znacznie mniej:

$ free
              total        used        free      shared  buff/cache   available
Mem:        8174716     5609592       53200       27480     2511924     2458432
Swap:       8386556        6740     8379816
Mitar
źródło
0

Stwórz skrypt show-memory-usage.sh z treścią:

#!/bin/sh
ps -eo rss,pid,user,command | sort -rn | head -10 | awk '{ hr[1024**2]="GB"; hr[1024]="MB";
 for (x=1024**3; x>=1024; x/=1024) {
 if ($1>=x) { printf ("%-6.2f %s ", $1/x, hr[x]); break }
 } } { printf ("%-6s %-10s ", $2, $3) }
 { for ( x=4 ; x<=NF ; x++ ) { printf ("%s ",$x) } print ("\n") }
 '
Felipe
źródło
5
Czemu? Co to robi? Jak to działa? Nie mów ludziom, żeby uruchamiali losowy kod; wyjaśnić jego cel i sposób jego działania.
a CVn
2
Rysunek Wyjaśnię kod dla tych, którzy nie rozumieją, ponieważ wydaje się być bezpieczny do uruchomienia, ale downvote może odeprzeć te, do których byłby użyteczny. Uruchamia to samo polecenie, co w powyższe odpowiedzi , ale dodaje formatowanie w AWK. Nie uruchomiłem osobiście skryptu, ponieważ nie mam z niego żadnego pożytku, ale wyjaśnienie tego pomaga osobom potrzebującym formatowania.
Dooley_labs