Firmenbrief

15.02.2012

Interessante Linux-Tools für Systemadministratoren - Heute: pmap


Mit diesem Teil der Artikelserie widmen wir uns wieder der Betrachtung von Prozessen. Wer gerne in der Shell von Linux arbeitet und sich mit Tools wie top oder htop anzeigen lässt, welche Prozesse derzeit auf dem System gestartet laufen, wirft auch gerne ein Auge auf die RAM-Auslastung.

Dabei wird zwar ersichtlich, welche Prozesse in etwa wie viel Arbeitsspeicher für sich in Anspruch nehmen. Allerdings ist unklar, wofür genau der RAM Verwendung findet.

Erschwerend kommt noch hinzu, dass Linux mit Shared Memory arbeitet - gleich mehrere Prozesse können auf den gleichen Speicherbereich zugreifen. Häufig ist es der Fall, dass viele laufende Prozesse auf die gleichen Systemfunktionen zurückgreifen. Dank dem Shared Memory muss jedoch nicht jeder Prozess eine eigene Instanz der Systemfunktion in den Arbeitsspeicher laden, sondern alle Prozesse teilen sich diesen Bereich im Speicher. Somit wird verhindert, dass der RAM-Verbrauch eines Systems unnötig in die Höhe schießt.

Wenn der RAM-Verbrauch eines einzelnen Prozesses also in die Höhe schießt, ist es auf den ersten Blick nicht ersichtlich, was genau diese Last verursacht.

Hier kommt dann pmap ins Spiel: Das kleine Tool analysiert einen Prozess und stellt bei diesem Vorgang fest, welche Komponenten eines Prozesses wie viel Platz im Arbeitsspeicher belegen.

Suchen Sie sich mit top, htop, ps, oder pstree einen Prozess heraus und merken sich die PID. Anschließend rufen Sie pmap mit der PID des Prozesses als Parameter auf. In unserem Beispiel betrachten wir einen MySQL-Server mit der PID 948:

pmap 948
root@server:~# pmap 948
948:   /usr/sbin/mysqld
00110000      4K r-x--    [ anon ]
00111000     84K r-x--  /lib/tls/i686/cmov/libpthread-2.11.1.so
00126000      4K r----  /lib/tls/i686/cmov/libpthread-2.11.1.so
00127000      4K rw---  /lib/tls/i686/cmov/libpthread-2.11.1.so
00128000      8K rw---    [ anon ]
0012a000     76K r-x--  /lib/libz.so.1.2.3.3
0013d000      4K r----  /lib/libz.so.1.2.3.3
0013e000      4K rw---  /lib/libz.so.1.2.3.3
0013f000      8K r-x--  /lib/tls/i686/cmov/libdl-2.11.1.so
00141000      4K r----  /lib/tls/i686/cmov/libdl-2.11.1.so
00142000      4K rw---  /lib/tls/i686/cmov/libdl-2.11.1.so
00143000     36K r-x--  /lib/tls/i686/cmov/libcrypt-2.11.1.so
0014c000      4K r----  /lib/tls/i686/cmov/libcrypt-2.11.1.so
0014d000      4K rw---  /lib/tls/i686/cmov/libcrypt-2.11.1.so
(Ausgabe gekürzt.)

Wie Sie sehen, zeigt pmap die vom Prozess geladene Lib, den Pfad zur in Anspruch genommenen Datei und die dafür reservierte Speicheradresse (linke Spalte). In der zweiten Spalte ist ersichtlich, wie viel RAM für das Laden dieser Komponente benötigt wird.

pmap ist ein kleines, aber mächtiges Tool. Systemadministratoren und Linux-Fans können damit schnell heraus finden, was hinter dem hohen RAM-Verbrauch eines Prozesses steckt.

Übrigens: pmap findet diese Informationen nicht selbst heraus. Für jeden Prozess unter Linux gibt es im virtuellen Dateisystem /proc einen eigenen Bereich, in dem genau solche Informationen permanent aktualisiert abgelegt werden. In unserem Fall wären die Informationen, welche pmap auswertet, auch mit

cat /proc/948/maps

einsehbar.