Ubuntu Linux: Swap-Speicher und Speichernutzung verarbeiten

14

Mein Ubuntu verbraucht mehr Speicher, als der Task-Manager anzeigt:

sudo ps -e --format rss  | awk 'BEGIN{c=0} {c+=$1} END{print c/1024}'
2750.29

free -m

             total       used       free     shared    buffers     cached
Mem:          3860       2765       1094          0          3        300
-/+ buffers/cache:       2461       1398
Swap:         2729       2374        354

Das ist seltsam. Kann jemand diesen Unterschied erklären?

Was aber noch wichtiger ist: Ich möchte wissen, wie viel Speicher ein Prozess wirklich verbraucht. Ich möchte nicht die Größe des virtuellen Speichers kennen, sondern den residenten Speicher plus den Swap eines Prozesses.

Ich habe auch versucht, das Format param "sz" von 'ps' auszugeben, aber die Summe davon ist zu hoch (16000 MB) (param 'size' ergibt 36700 MB). Gibt es noch andere Möglichkeiten?

Ich möchte das wirklich nutzen, um zu bestimmen, welche Programme / Prozesse zu viel Speicher verbrauchen (und tauschen), um sie zu töten, weil Speicher wertvoll ist :-) Das ergibt einfach keinen Sinn, also frage ich hier.

Ausgabe von / proc / meminfo:

MemTotal:        3952812 kB                
MemFree:         1119192 kB
Buffers:            2676 kB
Cached:           290068 kB
SwapCached:       160980 kB
Active:          1805396 kB
Inactive:         731680 kB
Active(anon):    1745820 kB
Inactive(anon):   689184 kB
Active(file):      59576 kB
Inactive(file):    42496 kB
Unevictable:         148 kB
Mlocked:             148 kB
SwapTotal:       2795272 kB
SwapFree:         390900 kB
Dirty:              1984 kB
Writeback:             0 kB
AnonPages:       2085472 kB
Mapped:            67432 kB
Shmem:            190676 kB
Slab:              88012 kB
SReclaimable:      42704 kB
SUnreclaim:        45308 kB
KernelStack:        5496 kB
PageTables:        87860 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     4771676 kB
Committed_AS:    9522364 kB
VmallocTotal:   34359738367 kB
VmallocUsed:      374404 kB
VmallocChunk:   34359330144 kB
HardwareCorrupted:     0 kB
AnonHugePages:         0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       61440 kB
DirectMap2M:     4030464 kB
David Halter
quelle
Ich sollte darauf hinweisen, dass "1043,84" nicht sehr weit von "1178" entfernt ist. Dies ist die Zahl, die Sie mit dieser Berechnung erreichen werden.
cjc
Ich hatte buchstäblich die identische Frage auf unix.stackexchange (+1). Auch Patrick hat mich umgehauen: P-- unix.stackexchange.com/questions/34795/…
GoldenNewby

Antworten:

10

Das Linux Virtual Memory System ist nicht ganz so einfach. Sie können nicht einfach alle RSS-Felder addieren und den Wert usedvon erhalten free. Es gibt viele Gründe dafür, aber ich werde ein paar der größten treffen.

  • Wenn sich ein Prozess teilt, werden sowohl das übergeordnete als auch das untergeordnete Element mit demselben RSS angezeigt. Allerdings setzt Linux copy-on-writeso ein, dass beide Prozesse tatsächlich den gleichen Speicher belegen. Nur wenn einer der Prozesse den Speicher ändert, wird er tatsächlich dupliziert. Dies führt also dazu, dass die freeZahl kleiner als die topRSS-Summe ist.

  • Der RSS-Wert enthält keinen gemeinsamen Speicher. Da Shared Memory keinem Prozess gehört, wird topes nicht in RSS aufgenommen. Dies führt also dazu, dass die freeAnzahl größer als die topRSS-Summe ist.

Patrick
quelle
Oh danke! Ich habe immer gedacht, dass free -m die tatsächliche Shared Memory-Summe des gesamten Systems anzeigt. Aber wie "man ps" betont: "Die Shared Memory-Spalte sollte ignoriert werden; sie ist veraltet."
David Halter
Entschuldigung, ich kann diese Antwort nicht akzeptieren, da sie das Swap-Problem nicht beantwortet, aber trotzdem danke!
David Halter
@DavidHalter was für ein Tauschproblem? Die von mir angegebenen Informationen gelten für den gesamten Speicher, einschließlich Swap.
Patrick
Shared Memory ist nicht wirklich groß, normalerweise? Zumindest habe ich das im Task-Manager gesehen. Aber mein Swap ist ziemlich stark ausgelastet: 1035 MB; Die Summe von PS ist 1 GB und die Summe von Swap + RSS ist> 2 GB. Ich möchte sehen, wie viel Speicher ein Prozess wirklich verwendet, nicht nur RSS. Noch interessanter wäre, wie viel ausgelagerten Speicher ein Prozess verwendet.
David Halter
1
@DavidHalter Wenn Sie sehen möchten, wie viel Speicher ein Prozess verwendet (einschließlich freigegebener Speicher), lesen Sie die Spalte "VSZ".
Patrick
1

Ich denke, Sie sind besser dran, der Ausgabe von "free" zu vertrauen, was Ihre gesamte Speichernutzung angeht, und "ps" zu vertrauen, um eine allgemeine Vorstellung davon zu erhalten, wie viel Speicher ein einzelner Prozess verwendet.

Nur weil die Summe der RSS-Werte "ps" nicht gleich "free" ist, können Sie Ihre Prozesse nicht nach RSS sortieren und die größten für das Beenden auswerten.

Wenn Sie sich jedoch nur darum bemühen, sicherzustellen, dass der Computer in den Ruhezustand versetzt werden kann, ist es wahrscheinlich einfacher, mehr Auslagerungsdateien (ggf. in Form einer Datei auf der Festplatte) zu erstellen.

datn
quelle
1

Ich habe endlich die Antwort auf meine Frage bekommen. Es gibt ein Programm namens smem (unter Ubuntu / Debian apt install smem), mit dem Sie Swap und belegten Speicher getrennt auflisten können.

Einige verschiedene Möglichkeiten, Swap aufzulisten, finden Sie hier: https://www.cyberciti.biz/faq/linux-which-process-is-using-swap/ .

David Halter
quelle