Page 1 of 1

Infos über swap

Posted: 2008-04-23 08:40
by spenser
Hi!

Ich habe das Problem, dass ich gerne wissen möchte, welche Prozesse meinen swap nutzen. Ich sehe z.B. in top ja nur, wieviel von dem swap gerade genutzt wird. Ich möchte aber wissen, wer mir den swap im Laufe der Zeit vollschreibt.
Gibts da ein Tool, das mit anzeigt, wer derjenige ist?
Ich arbeite unter Debian.

Danke!

Re: Infos über swap

Posted: 2008-04-23 10:53
by standbye
Du kannst nur sehen wer Memory insgesammt anfordert (top und dann drück mal "m" um es nach memory sortieren zu lassen)

ob ein prozess in den swap ausgelagert wird entscheidet der linux kernel.

Re: Infos über swap

Posted: 2008-04-23 11:09
by Joe User
lsof?

Re: Infos über swap

Posted: 2008-04-23 13:06
by spenser
Standbye wrote:Du kannst nur sehen wer Memory insgesammt anfordert (top und dann drück mal "m" um es nach memory sortieren zu lassen)
Kann es sein, dass Du "F und dann n" meinst?
Zumindest wäre das bei meinem top die Sortieroption.

Re: Infos über swap

Posted: 2008-04-23 13:12
by spenser
Joe User wrote:lsof?
Wonach muß ich da genau filtern?
Bei

Code: Select all

lsof |grep swap
kommt nicht viel hilfreiches raus.

Re: Infos über swap

Posted: 2008-04-23 13:20
by Joe User

Code: Select all

man lsof
lsof /dev/swap

Re: Infos über swap

Posted: 2008-04-23 13:34
by Roger Wilco
Würde mich ehrlichgesagt überraschen, wenn das klappen würde, Joe. ;)

Die Prozesse fordern ja ganz normal vom Kernel Speicher an und greifen nicht direkt auf die Swap-Partition/-Datei zu.

Re: Infos über swap

Posted: 2008-04-23 13:43
by spenser
Roger Wilco wrote:Würde mich ehrlichgesagt überraschen, wenn das klappen würde, Joe. ;)

Die Prozesse fordern ja ganz normal vom Kernel Speicher an und greifen nicht direkt auf die Swap-Partition/-Datei zu.
Ich sags mal so:

Code: Select all

~# lsof /dev/swap
lsof: status error on /dev/swap: No such file or directory
lsof 4.78

Re: Infos über swap

Posted: 2008-04-24 14:14
by standbye
Spenser wrote:
Standbye wrote:Du kannst nur sehen wer Memory insgesammt anfordert (top und dann drück mal "m" um es nach memory sortieren zu lassen)
Kann es sein, dass Du "F und dann n" meinst?
Zumindest wäre das bei meinem top die Sortieroption.
Drück einfach mal shift + M und lass dich überraschen

@ Joe, das wird nich gehen, der Kernel verwaltet ja den SWAP Userprozesse haben keinen direkten Zugriff

Re: Infos über swap

Posted: 2008-04-26 11:32
by sogo
es gibt keine direkte Zuordnung von Prozessen und Swap. Der Kernel sieht nur (Speicher-)Seiten und entscheidet, ob diese ausgelagert werden sollen oder nicht. Viele Seiten sind nur einmal im Speicher vorhanden,werden aber von mehreren Prozessen benutzt (bspw. libc ;-) ) und umgekehrt (shared memory ist zum Beispiel Teil von keine Prozess).

-- sogos

Re: Infos über swap

Posted: 2008-04-26 12:54
by oxygen
Man kann leicht sehen wieviel Swap ein Prozess benutzt wenn man RSZ (Resident Set Size) und VSZ (Virtual Set Size) vergleicht.

Re: Infos über swap

Posted: 2008-04-28 07:53
by sogo
oxygen wrote:Man kann leicht sehen wieviel Swap ein Prozess benutzt wenn man RSZ (Resident Set Size) und VSZ (Virtual Set Size) vergleicht.
Nein, das hat mit swap nichts zu tun. RSS/VSS ist - als Daumenregel - der Unterschied von angeforderten Speicher und benutzten Speicher.

-- sogos

Re: Infos über swap

Posted: 2008-04-28 17:04
by oxygen
sogo wrote: Nein, das hat mit swap nichts zu tun. RSS/VSS ist - als Daumenregel - der Unterschied von angeforderten Speicher und benutzten Speicher.
-- sogos
Meine Aussage stimmt. Kannst gerne nachlesen. Einen unterschied zwischen angefordertem Speicher und benutztem Speicher gibt es nicht. Soviel wie Prozess fodert bekommt er auch (oder stürzt mit einem malloc ab).
man ps wrote:rss, the non-swapped physical memory that a
task has used (in kiloBytes). (alias rssize, rsz).

vsz, the amount of (virtual) memory that the process is using in KiB
(1024-byte units). (alias vsize).
-> RSZ - VSZ = Swap.

Re: Infos über swap

Posted: 2008-04-28 17:32
by Roger Wilco
oxygen wrote:Meine Aussage stimmt. Kannst gerne nachlesen.
Nein, tut sie nicht. ;)
oxygen wrote:Einen unterschied zwischen angefordertem Speicher und benutztem Speicher gibt es nicht. Soviel wie Prozess fodert bekommt er auch (oder stürzt mit einem malloc ab).
Ich kann sehr viel mehr Speicher anfordern, als das System physikalischen Speicher (+Swap) besitzt. Nutzen kann ich aber eben nur so viel, wie physikalisch vorhanden ist.
oxygen wrote:
man ps wrote:rss, the non-swapped physical memory that a
task has used (in kiloBytes). (alias rssize, rsz).

vsz, the amount of (virtual) memory that the process is using in KiB
(1024-byte units). (alias vsize).
-> RSZ - VSZ = Swap.
Und woraus schließt du, dass virtueller Speicher ausgelagert wird?
Allgemein würde ich dir die Texte im Verzeichnis Documentation/vm des Kernel Quelltexts empfehlen.

Kleines Beispiel (Ausgabe von top auf meinem Desktop):

Code: Select all

Mem:   2062092k total,  1908432k used,   153660k free,       52k buffers
Swap:   979924k total,      220k used,   979704k free,   780888k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
10352 ####      20   0  922m 432m  25m S    1 21.5   1:23.84 java
 3462  ####      20   0  712m 163m  26m S    0  8.1   1:56.97 thunderbird-bin
 3449  ####      20   0  265m 154m  18m S    1  7.7  26:55.92 firefox-bin
Demnach müsste der Java-Prozess knapp 500 MB auf die Swap-Partition auslagern. Diese wird aber praktisch nicht verwendet. Zusammen mit dem Thunderbird Prozess müssten rund 1,2 GB Swap genutzt werden. Es gibt aber nur 1 GB. ;)

Re: Infos über swap

Posted: 2008-04-28 17:39
by oxygen
Roger Wilco wrote: Kleines Beispiel (Ausgabe von top auf meinem Desktop):

Code: Select all

Mem:   2062092k total,  1908432k used,   153660k free,       52k buffers
Swap:   979924k total,      220k used,   979704k free,   780888k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
10352 ####      20   0  922m 432m  25m S    1 21.5   1:23.84 java
 3462  ####      20   0  712m 163m  26m S    0  8.1   1:56.97 thunderbird-bin
 3449  ####      20   0  265m 154m  18m S    1  7.7  26:55.92 firefox-bin
Demnach müsste der Java-Prozess knapp 500 MB auf die Swap-Partition auslagern. Diese wird aber praktisch nicht verwendet. Zusammen mit dem Thunderbird Prozess müssten rund 1,2 GB Swap genutzt werden. Es gibt aber nur 1 GB. ;)
Virt ist der Speicherverbrauch des Prozess wenn er sich allein im System befände.

Re: Infos über swap

Posted: 2008-04-28 17:44
by Roger Wilco
oxygen wrote:Virt ist der Speicherverbrauch des Prozess wenn er sich allein im System befände.
Das musst du mir jetzt bitte etwas genauer erklären.

Re: Infos über swap

Posted: 2008-04-28 17:46
by oxygen
Roger Wilco wrote:
oxygen wrote:Virt ist der Speicherverbrauch des Prozess wenn er sich allein im System befände.
Das musst du mir jetzt bitte etwas genauer erklären.
Der Wert enthält alle shared libaries die der Prozess benutzt. z.B. auch die libc. Diese befindet aber natürlich nur 1x im Speicher und nicht für jeden Prozess extra.
EDIT: Zugegebenermaßen bringt das eine Ungenauigkeit in die Rechnung. Allerdings wird die Ungenauigkeit mit zunehmender Prozessgröße kleiner. Im Desktopbereich wird die Rechnung auf Grund von riesen libaries wie GTK oder QT schwierig. Aber auf dem Server kann man die Faustregel durchgehen lassen.

Re: Infos über swap

Posted: 2008-04-28 18:15
by sogo
oxygen wrote:
sogo wrote: Nein, das hat mit swap nichts zu tun. RSS/VSS ist - als Daumenregel - der Unterschied von angeforderten Speicher und benutzten Speicher.
-- sogos
Meine Aussage stimmt. Kannst gerne nachlesen. Einen unterschied zwischen angefordertem Speicher und benutztem Speicher gibt es nicht. Soviel wie Prozess fodert bekommt er auch (oder stürzt mit einem malloc ab).
Doch, nennt sich memory over commitment. Beispiel:

Code: Select all

> cat allyoucaneat.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main()
{

#define MEGAB 1024*1024

        int i;
        int *ret;

        do
        {
                ret=malloc(10*MEGAB);
                printf("allocated %d MBn",10*MEGAB/1024/1024);
                usleep(200);
        } while (ret);

        printf("ate enough...n");
        sleep(1000);
        return(0);
}

Code: Select all

[... viele]
allocated 10 MB
allocated 10 MB
allocated 10 MB
allocated 10 MB
allocated 10 MB
allocated 10 MB
allocated 10 MB
allocated 10 MB
allocated 10 MB
allocated 10 MB
allocated 10 MB
allocated 10 MB
allocated 10 MB
allocated 10 MB
allocated 10 MB
allocated 10 MB
allocated 10 MB
allocated 10 MB
allocated 10 MB
ate enough...

Code: Select all

ps auxxww | grep allyou
xxxx 11325  0.0  0.0 3116804 1600 pts/3    S+   16:28   0:00 ./allyoucaneat
Das sind stolze 3.1GB (auf x86,deswegen Ende hier...) aber nur 1600 non-swappable Speicher belegt.

Code: Select all

>free
             total       used       free     shared    buffers     cached
Mem:       2073240    1933892     139348          0      33600     359628
-/+ buffers/cache:    1540664     532576
Swap:      2031608     571180    1460428
Aber nur 500MB swapped (war schon vorher).

Schauen wir uns mal den Speicher an:

Code: Select all

 > cat /proc/11325/maps
00110000-00111000 r-xp 00110000 00:00 0          [vdso]
00922000-0093d000 r-xp 00000000 fd:00 13205515   /lib/ld-2.7.so
0093d000-0093e000 r-xp 0001a000 fd:00 13205515   /lib/ld-2.7.so
0093e000-0093f000 rwxp 0001b000 fd:00 13205515   /lib/ld-2.7.so
00945000-00a98000 r-xp 00000000 fd:00 13205517   /lib/libc-2.7.so
00a98000-00a9a000 r-xp 00153000 fd:00 13205517   /lib/libc-2.7.so
00a9a000-00a9b000 rwxp 00155000 fd:00 13205517   /lib/libc-2.7.so
00a9b000-00a9e000 rwxp 00a9b000 00:00 0
0123d000-08048000 rwxp 0123d000 00:00 0
08048000-08049000 r-xp 00000000 fd:00 8824045    /home/xxxxxx/allyoucaneat
08049000-0804a000 rw-p 00000000 fd:00 8824045    /home/xxxxxx/allyoucaneat
08300000-08321000 rw-p 08300000 00:00 0
08321000-08400000 ---p 08321000 00:00 0
08489000-b7fa3000 rw-p 08489000 00:00 0
b7fc4000-bf7d2000 rw-p b7fc4000 00:00 0
bf866000-bf87b000 rw-p bffea000 00:00 0          [stack]
Das Data Segment an 08489000-b7fa3000 sind unsere ca. 3GB. was noch interessant ist, dass fast alle Segemente swapbar sind.
Nicht swapbar ist (natuerlich) der vdso (obwohl zaehlt nicht mit), sowie die executable, der Rest kann ohne Probleme auf die Platte ausgelagert werden.
Interessant waere, wenn ich ein mlock() auf den malloc-ed Speicher machen wuerde...
oxygen wrote:
man ps wrote:rss, the non-swapped physical memory that a
task has used (in kiloBytes). (alias rssize, rsz).

vsz, the amount of (virtual) memory that the process is using in KiB
(1024-byte units). (alias vsize).
-> RSZ - VSZ = Swap.
Nein, nein und nein.
VSZ (oder VSS) ist die Groesse *innerhalb* der VM. RSZ(RSS) ist die Groesse, die im RAM bleiben muss. Beide Groesse haben nichts zu tun mit der Menge an Speicher die der Prozess einnimmt. Eine solche Groesse gibt es nicht. Ich koennte das Beispiel nach belieben veraendern (was passiert, wenn ich eine 3 GB grosse Datei mmap-e ? ;-) und was passiert, wenn die Maschine under mem-pressure dann geraet..) und wir wuerden immer etwas anderes sehen. Die ganze Region als shared-mem deklariert und es wuerde garnicht in ps auftauchen.
Merke: Speicher ist relativ, der Kernel ist sehr intelligent Speicher effizient zu verwalten.
Die Angaben in ps sind *niemals* genaue Angaben, da in dem Moment, wo sie ausgegeben werden schon geaendert sein koennen.

Zurueck zu dem og. Beispiel: eventuell sind einige Seiten auf dem Swap ausgelagert worden. Wenn Du genau wissen willst, welche Seiten das sind, kannst Du oprofile oder systemtap nehmen, allerdings muss Du schon wissen wonach Du suchst.

http://www.informit.com/content/images/ ... n_book.pdf ist ein guter Einstieg dies anhand von Linux zu verstehen.

-- sogos