{"id":3488,"date":"2011-08-26T17:24:51","date_gmt":"2011-08-26T15:24:51","guid":{"rendered":"https:\/\/www.gambaru.de\/blog\/2011\/08\/26\/den-speicherverbrauch-im-blick-behalten-mit-ps_mem-py\/"},"modified":"2019-11-19T02:10:16","modified_gmt":"2019-11-19T01:10:16","slug":"den-speicherverbrauch-im-blick-behalten-mit-ps_mem-py","status":"publish","type":"post","link":"https:\/\/gambaru.de\/blog\/2011\/08\/26\/den-speicherverbrauch-im-blick-behalten-mit-ps_mem-py\/","title":{"rendered":"Den Speicherverbrauch im Blick behalten mit ps_mem.py"},"content":{"rendered":"<p>Um den Speicherverbrauch von Anwendungen zu messen, gibt es in Debian diverse Programme, die \u00fcber den belegten Arbeitsspeicher Aufschluss geben. Teilweise wird man aber nicht richtig schlau daraus, wieviel Speicher ein Programm tats\u00e4chlich f\u00fcr sich allein beansprucht.<br \/>\nMit htop erh\u00e4lt man z.B. gleich drei unterschiedliche Werte in kb VIRT, RES und SHR.<br \/>\n<strong>VIRT<\/strong> gibt dabei den virtuellen Speicherverbrauch an, welcher eine Summe aus tats\u00e4chlich belegtem und mit anderen Prozessen geteiltem Speicher ist. Zus\u00e4tzlich kann auch der Inhalt einer Datei mit Hilfe von Memory Mapping direkt in den virtuellen Adressraum eines Prozesses abgebildet werden. Jeder Prozess hat seinen eigenen virtuellen Adressraum und ist dadurch von allen anderen getrennt. Kurz gesagt ist es eine Technik um die Schranken des begrenzten physikalischen Speichers zu umgehen und Prozessen Speicher dynamisch zuzuteilen, so wie er gerade ben\u00f6tigt wird.<br \/>\nSollten also mehrere Programme die gleiche Bibliothek ben\u00f6tigen wird der Speicher nicht jedesmal extra neu zugeteilt sondern zwischen den Prozessen, die ihn anfordern, geteilt, wor\u00fcber der Wert <strong>SHR<\/strong> genauer Aufschluss gibt.<br \/>\n<strong>RES<\/strong> hingegen ist die Kennzahl, die den aktuell physikalisch genutzten Speicher repr\u00e4sentiert. In den meisten F\u00e4llen ist VIRT nicht der Wert, der mich interessiert, wenn ich untersuche, welches Programm gerade das System herunterzieht.<br \/>\nEine ausf\u00fchrliche Erkl\u00e4rung zum Speichermanagement eines Linuxsystems gibt es im <a href=\"http:\/\/tldp.org\/LDP\/tlk\/mm\/memory.html\">Linux Documentation Project<\/a> zu lesen.<br \/>\nMir ist schon beim Vergleich des <a href=\"https:\/\/www.gambaru.de\/blog\/2011\/04\/16\/ubuntu-11-04-speicherverbrauch-und-compiz\/\">Speicherverbrauchs von Ubuntu 11.04 und Debian Testing<\/a> aufgefallen, dass man die Thematik nicht einfach mit dem Gnome-Systemmonitor und ein paar Zahlen erschlagen kann. Der Linuxkernel handelt auch getreu dem Motto: \"Ungenutzter Speicher ist verschwendeter Speicher.\" So ist es auch kein Wunder, wenn sich der belegte physikalische Speicher mit der Zeit nach und nach f\u00fcllt, weil Linux anf\u00e4ngt nicht nur Programme sondern auch aufgerufene Dateien zu cachen, was einen deutlichen Performancegewinn beschert.<\/p>\n<p>Vor l\u00e4ngerer Zeit entdeckte ich bei <a href=\"http:\/\/kmandla.wordpress.com\/2009\/08\/29\/looking-close-at-memory-usage\/\">K.Mandla<\/a> ein in Python geschriebenes <a href=\"http:\/\/www.pixelbeat.org\/scripts\/ps_mem.py\">kleines Skript namens ps_mem.py<\/a>, welches den Speicherverbrauch von Programmen in privaten und geteilten Speicher aufteilt. Prozesse werden nicht getrennt betrachtet sondern eine Summe pro Anwendung gebildet. Klingt vielleicht anfangs verwirrend, aber mir erschien es damals als ob das Skript damit die Antwort auf die Frage liefert, wieviel RAM eine einzelne Anwendung tats\u00e4chlich einnimmt.<br \/>\nUm die Genauigkeit der Messergebnisse zu verbessern, l\u00e4sst sich das Skript nur mit Root-Rechten und dem Befehl <code> python ps_mem.py<\/code> ausf\u00fchren. Ich empfehle daher einen kurzen Blick in den Code zu werfen, ob irgendetwas Merkw\u00fcrdiges dort zu finden ist und es nicht blind zu verwenden. Mir ist bisher noch nichts besonderes aufgefallen.<br \/>\nIch werde es in Zukunft dazu nutzen, um eine weitere Vergleichsm\u00f6glichkeit zu den bekannten Systemmonitoren zu haben. Eines kann man jetzt schon sagen, die Textausgabe des Skripts ist \u00fcbersichtlich. Die aktuelle Ausgabe auf dem Inspiron 4000 sieht so aus.<\/p>\n<pre class=\"brush:plain\">Private  +   Shared  =  RAM used\tProgram\n  4.0 KiB +  12.5 KiB =  16.5 KiB\tdhclient\n  4.0 KiB +  39.0 KiB =  43.0 KiB\tdbus-launch\n  8.0 KiB +  45.0 KiB =  53.0 KiB\tgetty (2)\n 48.0 KiB +  13.5 KiB =  61.5 KiB\tssh-agent\n 52.0 KiB +  12.5 KiB =  64.5 KiB\tpolipo\n 44.0 KiB +  24.0 KiB =  68.0 KiB\tinit\n 40.0 KiB +  32.0 KiB =  72.0 KiB\tacpid\n  4.0 KiB +  77.5 KiB =  81.5 KiB\tsshd\n 84.0 KiB +  24.0 KiB = 108.0 KiB\tsleep\n  4.0 KiB + 105.0 KiB = 109.0 KiB\txfconfd\n 76.0 KiB +  36.0 KiB = 112.0 KiB\tcron\n108.0 KiB +  10.0 KiB = 118.0 KiB\t.wallpaper\n  8.0 KiB + 110.0 KiB = 118.0 KiB\tsu\n 16.0 KiB + 112.0 KiB = 128.0 KiB\tgvfs-gphoto2-volume-monitor\n  4.0 KiB + 132.5 KiB = 136.5 KiB\tgdm3\n 24.0 KiB + 130.0 KiB = 154.0 KiB\tgvfs-afc-volume-monitor\n  4.0 KiB + 160.0 KiB = 164.0 KiB\tpolkitd\n  4.0 KiB + 171.0 KiB = 175.0 KiB\tgvfsd-trash\n 48.0 KiB + 128.0 KiB = 176.0 KiB\tgvfsd-dnssd\n  4.0 KiB + 182.0 KiB = 186.0 KiB\tgdm-session-worker\n  8.0 KiB + 179.0 KiB = 187.0 KiB\tudevd (3)\n  4.0 KiB + 189.5 KiB = 193.5 KiB\tgdm-simple-slave\n148.0 KiB + 115.5 KiB = 263.5 KiB\tgvfsd\n184.0 KiB +  85.5 KiB = 269.5 KiB\tgvfsd-metadata\n220.0 KiB +  77.5 KiB = 297.5 KiB\twpa_supplicant\n180.0 KiB + 182.5 KiB = 362.5 KiB\tgnome-keyring-daemon\n 16.0 KiB + 361.0 KiB = 377.0 KiB\tgvfsd-network\n404.0 KiB +  45.5 KiB = 449.5 KiB\trsyslogd\n256.0 KiB + 205.0 KiB = 461.0 KiB\tconsole-kit-daemon\n244.0 KiB + 266.0 KiB = 510.0 KiB\tgconfd-2\n392.0 KiB + 203.0 KiB = 595.0 KiB\tupowerd\n460.0 KiB + 268.5 KiB = 728.5 KiB\tconky\n604.0 KiB + 193.0 KiB = 797.0 KiB\tgvfs-gdu-volume-monitor\n644.0 KiB + 248.5 KiB = 892.5 KiB\tudisks-daemon (2)\n640.0 KiB + 381.0 KiB =   1.0 MiB\tdbus-daemon (2)\n524.0 KiB + 613.5 KiB =   1.1 MiB\tnotification-daemon\n436.0 KiB + 796.5 KiB =   1.2 MiB\tpython2.6\n640.0 KiB + 782.5 KiB =   1.4 MiB\tbash (3)\n  1.1 MiB + 452.5 KiB =   1.5 MiB\ttint2\n860.0 KiB + 764.5 KiB =   1.6 MiB\txfce4-power-manager\n  1.6 MiB + 356.0 KiB =   1.9 MiB\topenbox\n  2.4 MiB + 274.5 KiB =   2.7 MiB\turxvt\n  1.9 MiB +   1.4 MiB =   3.3 MiB\tleafpad\n  2.0 MiB +   3.2 MiB =   5.2 MiB\tosmo\n  9.0 MiB + 185.5 KiB =   9.2 MiB\ttor\n  8.8 MiB + 996.0 KiB =   9.8 MiB\tXorg\n  7.7 MiB +   2.5 MiB =  10.3 MiB\tclaws-mail\n 96.9 MiB +   4.5 MiB = 101.4 MiB\tmidori\n---------------------------------\n                        159.9 MiB\n=================================<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Um den Speicherverbrauch von Anwendungen zu messen, gibt es in Debian diverse Programme, die \u00fcber den belegten Arbeitsspeicher Aufschluss geben. Teilweise wird man aber nicht richtig schlau daraus, wieviel Speicher ein Programm tats\u00e4chlich f\u00fcr sich allein beansprucht. Mit htop erh\u00e4lt man z.B. gleich drei unterschiedliche Werte in kb VIRT, RES und SHR. VIRT gibt dabei &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/gambaru.de\/blog\/2011\/08\/26\/den-speicherverbrauch-im-blick-behalten-mit-ps_mem-py\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eDen Speicherverbrauch im Blick behalten mit ps_mem.py\u201c<\/span> weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[6],"tags":[31,53],"_links":{"self":[{"href":"https:\/\/gambaru.de\/blog\/wp-json\/wp\/v2\/posts\/3488"}],"collection":[{"href":"https:\/\/gambaru.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gambaru.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gambaru.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gambaru.de\/blog\/wp-json\/wp\/v2\/comments?post=3488"}],"version-history":[{"count":1,"href":"https:\/\/gambaru.de\/blog\/wp-json\/wp\/v2\/posts\/3488\/revisions"}],"predecessor-version":[{"id":11045,"href":"https:\/\/gambaru.de\/blog\/wp-json\/wp\/v2\/posts\/3488\/revisions\/11045"}],"wp:attachment":[{"href":"https:\/\/gambaru.de\/blog\/wp-json\/wp\/v2\/media?parent=3488"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gambaru.de\/blog\/wp-json\/wp\/v2\/categories?post=3488"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gambaru.de\/blog\/wp-json\/wp\/v2\/tags?post=3488"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}