Warum verwenden Programme auf einem Linux-Kernel so viel mehr VMEM als residenten Speicher?

4

Im Gegensatz zu anderen Betriebssystemen mit UNIX-Flavours auf Linux-Prozessen ist vmem im Vergleich zum residenten Speicher normalerweise unsinnig.

Zum Beispiel auf meinem Laptop

plugin-container verwendet 20 mal mehr vsz als rss, lxterminal verwendet 40 mal mehr vss als rss

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
petanb    2036  1.7 39.8 2027260 743108 ?      Sl   Jul01 260:16 /usr/lib/firefox/firefox
petanb    2170  3.4  1.8 668460 33716 ?        Sl   Jul01 520:11 /usr/lib/firefox/plugin-container /usr/lib/flashplugin-installer/libflashplayer.so -gr
petanb    2391  0.0  0.7 698888 14080 ?        Dl   Jul01   7:02 /usr/bin/lxterminal
petanb    4633  0.0  0.4 430568  8816 ?        Sl   Jul01   0:08 /usr/lib/notify-osd/notify-osd

Schauen Sie sich den Unterschied zwischen VSZ und RSS an. Warum ist das so? Ich weiß, dass der virtuelle Speicher größer ist als der der Bewohner, aber warum so viel?

Petr
quelle

Antworten:

5

Erstens "essen" Programme / Prozesse keinen Speicher. Sie verwenden oder werden Speicher zugewiesen.

VSZ (Größe des virtuellen Speichers in Kilobyte) ist die Summe des gesamten für den Prozess erforderlichen virtuellen Speichers. Diese Größe ist in erster Linie ein Attribut des Prozesses / Programms und nicht unter der Kontrolle des Betriebssystems.

RSS ist die Größe der residenten Gruppe, dh der dem Prozess zugewiesene physische Speicher. Dies ist der physische Speicher, der verwendet wird, um Seiten des virtuellen Speichers zu speichern, die sich während der Ausführung des Prozesses befinden (und nicht im Sicherungsspeicher liegen, dh ausgelagert werden). RSS ist kleiner oder gleich der Größe des virtuellen Speichers des Prozesses.
Beachten Sie, dass RSS manchmal als Anzahl der Seiten (die normalerweise eine Größe von 4096 Bytes haben) und nicht in Kilobytes angegeben wird. In solchen Situationen ist der Vergleich von VSZ mit RSS nicht angebracht.

Beachten Sie, dass diese beiden Größen für den Prozess gemeinsam genutzte Bibliotheken sowie Speicher für Code / Text, Daten, Heap und Stack umfassen können. Es ist Aufgabe des Betriebssystems, Prozesse zu planen und zu bestimmen, welche Seiten des Prozesses im (physischen) Speicher verbleiben und welche ausgelagert werden. Es ist wahrscheinlicher, dass die gemeinsam genutzten Bibliotheken resident bleiben als Seiten, die ausschließlich vom Prozess verwendet werden. Bei einem Prozess im Ruhezustand (z. B. STAT == D1 oder STAT == S1) können die meisten Seiten ausgetauscht und ein kleines RSS angezeigt werden. Alles unter der Kontrolle des Betriebssystems und der Dynamik der Prozessausführung.

Beachten Sie auch , dass Linux ist im Gegensatz zu den meisten anderen * nixes in diesem Linux (sofern nicht anders konfiguriert) wird overcommit Anfragen für (virtuellen) Speicher. Obwohl für den Prozess keine Seitenrahmen oder Auslagerungsspeicher zugewiesen sind (bis der Prozess versucht, auf diesen "zugewiesenen" Speicher zuzugreifen), kann sich seine VSS erhöhen.

Nachtrag : Antwort auf Kommentar

Warum ist ein Unterschied so groß? Manchmal ist VSZ 20-mal größer als RSS, auch auf Systemen ohne Swap.

Sie führen ein bestimmtes Beispiel an, ohne Angaben zu machen.
Die Overcommit-Funktion von Linux könnte ein Faktor für eine große Diskrepanz zwischen VSZ und RSS sein, wenn es keinen Swap gibt. Verfügt dieses Programm malloc()über große, aber nicht verwendete Puffer?
Möglicherweise müssen Sie die Speichernutzung dieses Vorgangs mithilfe von Speichertools wie pmapund selbst auswerten top, um weitere Details zu erhalten.

Weitere Informationen finden Sie unter "Runtime_Memory_Measurement" . topDokumentation erklärt, dass

SWAP -- Swapped size (kb)
            The swapped out portion of a task's total virtual memory image. 

RES -- Resident size (kb)
            The non-swapped physical memory a task has used.
            RES = CODE + DATA. 

VIRT -- Virtual Image (kb)
            The total amount of virtual memory used by the task. It includes all code, data and shared libraries plus pages that have been swapped out.
            VIRT = SWAP + RES 

Ich weiß nicht, ob diese topDefinitionen den virtuellen Speicher berücksichtigen sollen, der festgeschrieben, aber noch keine physischen Ressourcen zugewiesen wurden. Ich denke, das ist der Fall, aber die VIRT-Gleichung wurde vereinfacht, indem die (ungewöhnliche) Situation weggelassen wurde, virtuellen Speicher festgeschrieben, aber noch nicht zugewiesen zu haben.

Anhang 2 : Antwort auf Kommentar

Versuchen Sie vielleicht, top oder htop auf Ihrem eigenen Computer auszuführen. Sie werden feststellen, dass es eine Reihe von Prozessen gibt, die eine erhebliche Menge an VSZ und fast kein RSS verwenden

Ich habe auf meinem Ubuntu-System nichts Interessantes gesehen:

  PID  PR  NI  VIRT  RES  SHR S %CPU %MEM SWAP CODE DATA nDRT COMMAND                                                                                        
26379  20   0 20812 7996 3496 S    4  0.4  12m    4 2828    0 gs                                                                                             
 1082  20   0 85292  46m  15m S    2  2.5  36m 1660  30m    0 Xorg                                                                                           
 2036  20   0 22948 8756 7148 S    1  0.4  13m   40  788    0 multiload-apple                                                                                
 2411  20   0 47984  19m  10m S    1  1.0  27m 1924 7584    0 python                                                                                         
   62  20   0     0    0    0 S    0  0.0    0    0    0    0 kondemand/0                                                                                    
  930  20   0  3236 1528  792 S    0  0.1 1708  284  820    0 dbus-daemon                                                                                    
 1618  20   0  6964 3084 2244 S    0  0.2 3880  420  836    0 cupsd                                                                                          
 1971  20   0 15708 3100 2484 S    0  0.2  12m  216  10m    0 udisks-daemon                                                                                  
 2037  20   0 39316  11m 9676 S    0  0.6  26m   76 1404    0 sensors-applet                                                                                 
25733  20   0  2568 1280  956 R    0  0.1 1288   64  480    0 top                                                                                            
 2473  20   0  6712 4060 1564 S    0  0.2 2652  780 2492    0 bash                                                                        

Für alle Benutzerprozesse VIRT == SWAP + RESstimmte das aber RES == CODE + DATAnicht.

Ich habe einige SBCs, auf denen Embedded Linux ausgeführt wird, habe sie jedoch nicht topcrosskompiliert. Auf der Suche /proc/<pid>/statnach einem Shell-Prozess gibt es VSZ = 580 KB und RSS = 200 KB (tatsächlich 50 Seiten), aber es werden natürlich /proc/meminfokeine Bytes für den Austausch gemeldet . Vielleicht ist es topinteressant , mit diesem SBC in Fahrt zu kommen (da ich nicht weiß, woher topdie Nummern für den Tausch stammen).

Sägespäne
quelle
Ich verstehe, was RSS / VSZ ist, worüber ich mir Sorgen mache, warum ein Unterschied so groß ist. Manchmal ist VSZ 20-mal größer als RSS, auch auf Systemen ohne Swap. Das kommt mir komisch vor.
Petr
Siehe Anhang zur Antwort.
Sägemehl
Ja, ich weiß, es ist schwierig, Details dafür anzugeben, da ich sie selbst nicht habe, aber dies ist für die meisten Anwendungen üblich, unabhängig von der Sprache, in der sie geschrieben sind. Versuchen Sie es vielleicht mit top oder htop auf Ihrem eigenen Computer Sie werden sehen, dass es eine Reihe von Prozessen gibt, die eine erhebliche Menge an VSZ und fast kein RSS verwenden. Dies kann ich einfach nicht verstehen. In c / c ++ ist es zwar leicht nachzuvollziehen, aber in interpretierten Sprachen wie Python oder Java ist dies fast unmöglich. Und tatsächlich passiert dies wirklich nur im Linux-Kernel
Petr
Möglicherweise haben Sie keine Auslagerungsdatei, aber Linux zieht es vor, Dateien (z. B. Laden von Bibliotheken und ausführbaren Dateien) mit mmap zu lesen (verwenden Sie den straceBefehl zur Bestätigung). Dies würde den virtuellen Speicher auf die gleiche Weise wie eine Paging- / Swap-Operation verwenden, mit der Ausnahme, dass anstelle des Sicherungsspeichers (z. B. Swap-Partition auf der Festplatte) normale Dateien betroffen wären. Die mmap-Region würde für den verwendeten virtuellen Speicher angerechnet und nicht als Teil des RSS gezählt.
Sägemehl
Verrate mir dein Geheimnis, dass X so wenig Speicher benötigt, dass es 630MB VIRT / 128MB RES / 100MB SHR verbraucht. Im Allgemeinen scheint alles eine unangemessene Menge an virtuellem Speicher zu verbrauchen (3 GB virtueller Speicher für Prozesse, die weniger als 100 MB bei leerem Swap verbrauchen, sind keine Seltenheit). Und mit top VIRT = RES + SWAP, weil top SWAP als VIRT-RES berechnet, was nicht genau ist.
Barteks2x