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ęć?


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

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

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.


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

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


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

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") }
 '

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.