On Wed 25 Jun 2008, Oliver Block wrote:
Bei mir ist das /proc/$PID/maps und das sieht auf den ersten Blick wirklich vielversprechend aus.
Kommt darauf an, was Du willst. smaps ist *wesentlich* aussagekräftiger. Hier ein kleiner Ausschnitt aus "cat /proc/self/smaps", also dem, was "cat" über sich selbst erzählt: 7f5d44ca9000-7f5d44df8000 r-xp 00000000 08:09 121449 /lib64/libc-2.8.so Size: 1340 kB Rss: 360 kB Pss: 4 kB Shared_Clean: 360 kB Shared_Dirty: 0 kB Private_Clean: 0 kB Private_Dirty: 0 kB Referenced: 360 kB Die erste Zeile findest Du so auch in "maps". Sie sagt Dir aber nur was über die theoretische Größe (0x7f5d44df8000 - 0x7f5d44ca9000 = 0x14F000 = 1372160 = 1340 kB) des Segments, aber nichts über den tatsächlichen Speicherverbrauch. Von diesen 1340 kB sind nämlich nur 360 kB (Rss) im Speicher auch vorhanden. Der Rest wurde entweder noch nicht vom Prozess angefordert, ist also nur in der ausführbaren Datei auf der Platte vorhanden, oder wurde ausgelagert und ist nur im Swapspace vorhanden. Die Seiten, die mit Shared_* beginnen, werden von mehreren Prozessen gleichtzeitig benutzt. Das ist entweder shared memory, oder wie hier das read-only Segment von irgendeiner Lib. Nur der Private_* markierte Teil des Segments gehört wirklich ausschließlich zu dem Prozess. Pss ist eine recht interessante Zahl. Es ist die Summe der Quotienten aus der Seitengröße und der Anzahl ihrer Benutzer, d.h. der Prozesse, die diese Seite benutzen. Addierst Du alle Pss zusammen, so erhältst Du eine Maß für den Anteil an Hauptspeicher, den dieser Prozess im Augenblick verbraucht. Eine Seite ist "dirty", wenn ihre Kopie im Hauptspeicher seit dem letzten Schreiben auf die Platte (sync) geändert wurde. Das Stück Speicher im Beispiel ist ein read-only Code-Segment aus der libc. Es ist von Anfang an read-only gemappt. Daher kann es keine "dirty" Seiten geben. "clean" ist das Gegenteil von "dirty". Willst Du Änderungen im Working Set eines Prozesses abschätzen, hilft "Referenced". Diese Zähler werden durch Schreiben in /proc/$PID/clear_refs gelöscht. Von da an wird Referenced jedesmal erhöht, wenn der Prozess eine neue Seite braucht. Ein "gutartiger" langlebiger Prozess sollte nach einer Einschwingphase keine neuen Seiten mehr brauchen. Im Beispiel wurde nie nach "clear_refs" geschrieben. Daher stimmt die Zahl mit "Rss" überein. Welchen Kernel benutzt Du? Falls es noch ein 2.4er ist, ist vielleicht /proc/$PID/statm aussagekräftiger. Was die einzelnen Zahlen bedeuten, ist mir aber inzwischen entfallen. Wenn Du aber einen 2.6er ohne smaps hast, kannst Du nicht wirklich Messungen zum Hauptspeicherverbrauch der einzelnen Prozesse vornehmen, außer Dich interessiert nur die Gesamtgröße (Size). Schaff Dir also einen aktuellen Kernel an, wirklich! Torsten -- Need professional mod_perl support? Just hire me: torsten.foertsch@gmx.net -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org