2012-03-09 14:13:35 +0000 2012-03-09 14:13:35 +0000
131
131

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

Zanim zapytam, żeby było jasne: tak, wiem o pamięci podręcznej dysku, i nie, to nie jest mój przypadek :) Przepraszam, za tę preambułę :)

Używam CentOS 5. Każda aplikacja w systemie mocno się zamienia, a system jest bardzo wolny. Kiedy robię free -m, oto co mam:

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

Więc, tak naprawdę mam tylko 42 Mb do wykorzystania! O ile dobrze 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ć cache'owanie dysku i nie przyniosło to żadnego efektu - obrazek pozostał ten sam.

Więc postanowiłem dowiedzieć się, kto używa całej mojej pamięci RAM i użyłem do tego top. Ale najwyraźniej informuje, że żaden proces nie wykorzystuje mojej pamięci RAM. Jedynym procesem w mojej górnej części jest MySQL, ale używa 0,1% pamięci RAM i 400Mb swap. Ten sam obrazek, gdy staram się uruchomić inne usługi lub aplikacje - wszystkie iść w swap, top pokazuje, że MEM nie jest używany (0,1% maksymalnie 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 przy okazji jest bardzo powolny, którego normalnie nie spodziewałabym się na tej maszynie (4 rdzenie, 4Gb RAM, RAID1).

Więc z tym - jestem całkiem pewien, że to nie jest pamięć podręczna dysku, kto korzysta z pamięci RAM, bo normalnie powinna być zredukowana i pozwolić innym procesom korzystać z pamięci RAM, a nie iść do wymiany.

Więc w końcu pytanie jest - jeśli ktoś ma jakieś pomysły, jak dowiedzieć się, jaki proces jest rzeczywiście wykorzystanie pamięci tak mocno?

Odpowiedzi (9)

115
115
115
2012-03-09 14:25:01 +0000

W Linuksie w procesie top możesz nacisnąć klawisz <, aby przesunąć sortowanie wyjścia w lewo. Domyślnie jest on posortowany według %CPU, więc jeśli naciśniesz klawisz 4 razy, posortujesz go według VIRT, który jest rozmiarem pamięci wirtualnej, dając Ci odpowiedź.

Inny sposób to:

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

powinien dać Ci i wyjście posortowane według rozmiaru procesów wirtualnych.

Oto długa wersja:

ps --everyone --format=pid,vsz,comm= | sort --numeric-sort --key=2
78
78
78
2016-02-09 21:12:26 +0000

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

ps aux | awk '{print $6/1024 " MB\t\t" $11}' | sort -n
14
14
14
2012-10-15 15:05:01 +0000

Tylko notatka z boku na serwerze pokazująca te same objawy, ale nadal wykazująca wyczerpanie pamięci. To, co znalazłem to sysctl.conf z pudełka z 32 GB pamięci RAM i konfiguracja dla DB z dużymi stronami skonfigurowanymi do 12000. Ten box ma tylko 2 GB pamięci RAM, więc przypisał całą wolną pamięć RAM do ogromnych stron (tylko 960 z nich). Ustawienie ogromnych stron na 10, jako że żadna z nich i tak nie była używana, zwolniło całą pamięć.

Szybkie sprawdzenie /proc/meminfo w poszukiwaniu ustawień HugePages_ może być dobrym początkiem rozwiązywania problemów z co najmniej jednym niespodziewanym świniakiem pamięci.

5
5
5
2018-03-31 03:38:27 +0000

W moim przypadku problemem było to, że serwer był serwerem wirtualnym VMware z włączonym modułem vmw_balloon:

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

Uruchomienie:

$ vmware-toolbox-cmd stat balloon
5189 MB

Tak więc około 5 GB pamięci zostało w rzeczywistości odzyskane przez hosta. Tak więc pomimo tego, że 8 GB do mojej maszyny wirtualnej było “oficjalnie”, w praktyce było ich znacznie mniej:

$ free
              total used free shared buff/cache available
Mem: 8174716 5609592 53200 27480 2511924 2458432
Swap: 8386556 6740 8379816
2
2
2
2013-07-08 06:05:54 +0000

Możesz również użyć polecenia ps, aby uzyskać więcej informacji o procesie.

ps aux | less
2
2
2
2016-10-21 10:51:37 +0000

Odnoszę się do to i Całkowita pamięć używana przez proces Pythona? - Stack Overflow , to jest moja odpowiedź. Dostaję konkretne narzędzie do liczenia procesów (python), teraz.

# 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

Referencje

1
1
1
2016-03-14 20:50:46 +0000

Zrób skrypt o nazwie 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") }
 '
0
0
0
2019-07-12 19:46:37 +0000

Mój serwer ubuntu DISTRIB RELEASE=18.04 na Hyper-V miał większość wykorzystanej pamięci, ale wszystkie procesy były w porządku. (Przyznaję, że usunąłem snapd i nienadzorowane pakiety, ale 95% pamięci nadal było używane)

Odpowiedź brzmi: Hyper-V ma pamięć dynamiczną, więc wziął pamięć do głównego systemu i ubuntu oznaczył ją jako używaną.

Mam nadzieję, że komuś pomoże.

0
0
0
2019-03-31 17:51:48 +0000

To również wymaga id procesu, sortowania według MB i nakreślenia polecenia (które stworzyło proces):

ps aux | awk '{print $6/1024 " MB\t\t" $2 "\t" $11}' | sort -n