Linux: Finden Sie heraus, welcher Prozess den gesamten Arbeitsspeicher belegt.

127

Bevor ich wirklich frage, nur um klar zu sein: Ja, ich kenne mich mit Festplatten-Cache aus und nein, das ist nicht mein Fall :) Entschuldigung, für diese Präambel :)

Ich verwende CentOS 5. Jede Anwendung im System ist stark ausgelagert und das System ist sehr langsam. Wenn ich das tue free -m, habe ich Folgendes:

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

Also, ich habe eigentlich nur 42 MB zur Verfügung! Soweit ich das verstehe, -/+ buffers/cachezählt der Festplattencache eigentlich nicht, also habe ich ja nur 42 MB, oder? Ich dachte, ich könnte mich irren, also habe ich versucht, das Disk-Caching auszuschalten und es hatte keine Auswirkung - das Bild blieb gleich.

Also habe ich mich entschlossen herauszufinden, wer meinen gesamten Arbeitsspeicher nutzt, und das habe ich verwendet top. Aber anscheinend meldet es, dass kein Prozess meinen RAM verwendet. Der einzige Prozess in meiner Top ist MySQL, aber es werden 0,1% RAM und 400 MB Swap verwendet. Das gleiche Bild, wenn ich versuche, andere Dienste oder Anwendungen auszuführen - alle werden ausgetauscht, und es wird angezeigt, topdass MEM nicht verwendet wird (maximal 0,1% für einen Prozess).

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

Neustart hilft nicht und ist übrigens sehr langsam, was ich auf diesem Rechner normalerweise nicht erwarten würde (4 Kerne, 4 GB RAM, RAID1).

Also, damit - ich bin mir ziemlich sicher, dass dies kein Festplatten-Cache ist, der den RAM verwendet, weil er normalerweise reduziert werden sollte und andere Prozesse den RAM nutzen lassen sollten, anstatt zu tauschen.

Schließlich stellt sich die Frage, ob jemand eine Idee hat, wie er herausfinden kann, welcher Prozess den Speicher tatsächlich so stark nutzt.

Timur
quelle
1
Haben Sie jemals die Antwort darauf gefunden?
Hackeron
@ Hackeron: OP hat diese Antwort akzeptiert . Ich weiß, dass diese Antwort Ihre Frage nicht beantwortet . Ich konnte Ihr Problem auf einem meiner Server reproduzieren und suche derzeit nach einer Möglichkeit, das Problem zu beheben.
Deltik
@ Deltik Ah, ok. Vielen Dank :) - Ich habe hier 2 Server, die den gesamten verfügbaren Speicher innerhalb von 12 Stunden verlieren. Lassen Sie mich wissen, ob ich etwas tun kann, um dies zu diagnostizieren. Ich bin erreichbar unter dem Spitznamen "hackeron" im IRC (irc.freenode.org).
Hackeron
@Hackeron: Ich konnte dich nicht als "Hackeron" finden irc.freenode.org. Ich habe hier einen Chatroom für ausführliche Diskussionen eingerichtet .
Deltik
Erwähnenswert ist, dass der speicherinterne ZFS-ARC- (und / oder L2ARC-) Cache nicht angezeigt free -mwird, die Größe jedoch unter Linux abgefragt werden kann cat /proc/spl/kstat/zfs/arcstats | grep data_size.
kqr

Antworten:

112

Unter Linux topkönnen Sie dabei die <Taste drücken , um die Sortierung der Ausgabeanzeige nach links zu verschieben. Standardmäßig ist es nach dem sortiert. %CPUWenn Sie die Taste viermal drücken, wird nach VIRTder Größe des virtuellen Speichers sortiert, nach der Sie Ihre Antwort erhalten.

Ein anderer Weg, dies zu tun, ist:

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

sollte Ihnen und Ausgabe sortiert nach Prozessen virtuelle Größe geben.

Hier ist die lange Version:

ps --everyone --format=pid,vsz,comm= | sort --numeric-sort --key=2
Karlson
quelle
Das gibt mir Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.htmlauf Ubuntu Server 11.10.
Der Hochstapler
1
@OliverSalzburg Das Problem sind -oOptionen. RHEL4 das funktioniert. RHEL5: ps -e -o pid,vsz,comm= | sort -n -k 2funktioniert. Ich werde es später am Abend um 11.10 Uhr versuchen, aber wenn Sie vorher die richtigen Sortieroptionen gefunden haben, lassen Sie es mich bitte wissen. ps -e -o pid,vsz,comm | sort -n -k 2könnte funktionieren, aber ich habe im Moment keinen Ort zum Überprüfen.
Karlson
2
Ich bin mit der -efOption nicht wirklich vertraut . Aber dies scheint eine vernünftige Ausgabe zu produzieren:sudo ps axo pid,vsz,comm=|sort -n -k 2
Der Hochstapler
1
Ty, ich mag den Top-Vorschlag, <ich wusste nicht, dass das möglich ist, Fedora
SSH This
2
Die Version wurde leicht modifiziert, um die Prozesse ps -e --format=pid,rss,args | sort --numeric-sort --key=2
abzurufen
71

Zeigen Sie den Prozessspeicher in Megabyte und den Prozesspfad an.

ps aux  | awk '{print $6/1024 " MB\t\t" $11}'  | sort -n
nicht null
quelle
8
Willkommen bei Super User. Können Sie Ihre Antwort erweitern, um zu erklären, was dieser Code bewirkt und wie das Problem behoben wird? Von unerklärlichem Code wird abgeraten , da er die Lösung nicht lehrt. Vielen Dank.
Fixer1234
9
Ich bin überrascht, dass diese Antwort abgelehnt wurde, und habe einen Kommentar, in dem ich darum gebeten werde. Es ist kurz genug, dass klar sein sollte, was sie tut (leitet ps aux in awk und sortiert dann), und im Kontext der Frage zeigt es Welche Prozesse verbrauchen am meisten RAM? Ich denke, es ist eine gute Antwort.
John
14

Nur eine Randnotiz auf einem Server, die die gleichen Symptome zeigt, aber immer noch Speichererschöpfung anzeigt. Was am Ende herausfand, war eine sysctl.conf aus einer Box mit 32 GB RAM und einem Setup für eine Datenbank mit riesigen Seiten, die auf 12000 konfiguriert wurde. Diese Box hat nur 2 GB RAM, so dass alle freien RAMs den riesigen Seiten zugewiesen wurden (nur 960 von ihnen). Durch das Festlegen von 10 für große Seiten, da ohnehin keine verwendet wurden, wurde der gesamte Speicher freigegeben.

Eine schnelle Überprüfung von / proc / meminfo, um nach den Einstellungen für HugePages_ zu suchen, kann ein guter Anfang sein, um mindestens ein unerwartetes Speicherproblem zu beheben.

Todesfahrer
quelle
2
Ich hatte vor kurzem einen anderen Server, auf dem dies das Problem war. Wenn in Ihrer Organisation ehemalige Oracle-Mitarbeiter beschäftigt sind, ist diese Einstellung möglicherweise Ihr Schuldiger.
Felder
5

In meinem Fall bestand das Problem darin, dass der Server ein virtueller VMware-Server mit vmw_balloonaktiviertem Modul war:

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

Laufen:

$ vmware-toolbox-cmd stat balloon
5189 MB

So wurden vom Host tatsächlich rund 5 GB Speicher zurückgefordert. Obwohl ich "offiziell" 8 GB auf meiner VM hatte, war es in der Praxis viel weniger:

$ free
              total        used        free      shared  buff/cache   available
Mem:        8174716     5609592       53200       27480     2511924     2458432
Swap:       8386556        6740     8379816
Mitar
quelle
2

Sie können auch den Befehl ps verwenden, um weitere Informationen zum Prozess abzurufen.

ps aux | less
Atul
quelle
Was ist aus Neugier der richtige Weg, um diesem Befehl zu entkommen? Es wird ENDE angezeigt, wenn ich die letzte Zeile erreiche. Wenn ich Strg + C drücke, wird der Vorgang nicht abgebrochen.
KingsInnerSoul
1
@ KingsInnerSoul drücken Sie "q"
Enobayram
2

Ich verweise auf diese und Gesamtspeicher von Python-Prozess verwendet? - Stack Overflow , das ist meine Antwort. Ich bekomme jetzt ein bestimmtes Prozesszählwerkzeug (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

Hänge meine Prozessliste an.

$ 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

Referenz

Chu-Saing Lai
quelle
1

Erstellen Sie ein Skript show-memory-usage.shmit folgenden Inhalten:

#!/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
quelle
6
Warum? Was macht das? Wie funktioniert es? Sagen Sie den Leuten nicht, dass sie zufälligen Code ausführen sollen. Erklären Sie den Zweck und die Funktionsweise.
ein
2
Ich werde den Code für diejenigen erklären, die es nicht verstehen, da es sicher zu laufen scheint, aber die Ablehnung kann diejenigen abwehren, für die es nützlich wäre. Es wird derselbe Befehl ausgeführt wie in den obigen Antworten , aber es wird eine Formatierung mit AWK hinzugefügt. Ich habe das Skript nicht persönlich ausgeführt, da ich keine Verwendung dafür habe, aber es zu erklären hilft denjenigen, die eine Formatierung benötigen.
Dooley_labs
1
Ich habe den Code gelesen und ausgeführt. Sie richtet Felder wie eine Tabelle aus und formatiert den belegten residenten Speicher mit Präfixen (z. B. 1,12 GB, 582,79 MB).
Stéphane Gourichon
0

Dies nimmt auch die Prozess-ID, sortiert nach verwendetem MB und umreißt den Befehl (der den Prozess erstellt hat):

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

prosti
quelle
0

Auf meinem Ubuntu-Server DISTRIB RELEASE = 18.04 unter Hyper-V wurde der größte Teil des Arbeitsspeichers verwendet, aber alle Prozesse waren in Ordnung. (Zugegeben, ich habe snapd- und unattended-upgr-Pakete entfernt, aber 95% des Speichers wurden noch verwendet.)

Die Antwort ist, dass Hyper-V über dynamischen Speicher verfügt. Daher wurde Speicher für die Hauptsystemnutzung benötigt und von Ubuntu als verwendet gekennzeichnet.

Hoffe es hilft jemandem.

Vodyanikov Andrew Anatolevich
quelle