Viele Fragen sind es sicherlich nicht, die offenbleiben, weil Linux das passende Tool fehlt – aber es gibt sie. Dann kann sich der Admin mit einem kleinen Skript selbst helfen.
Ein prinzipielles Problem aller universellen Betriebssysteme, dem sich auch Linux mit einem aufwändigen und trickreichen Mechanismus stellen muss, besteht darin, dass niemand vorab weiß, wie viele Programme zu einer bestimmten Zeit parallel auszuführen sind und wie viel Hauptspeicher jedes davon benötigt. Daher ist es unmöglich, einem Programm feste Hauptspeicherbereiche mit absoluten Adressen zuzuweisen.
Stattdessen verfolgen die Betriebssystembauer das Konzept des virtuellen Speichers, der jedem Programm zunächst den Eindruck vermittelt, es könne exklusiv auf den gesamten vorhandenen Speicher zugreifen. Eine besondere Speicherverwaltungseinheit der CPU, die Memory Management Unit (MMU), bildet dann zudem im Hintergrund pro Prozess die virtuellen Adressen des Programms auf physische Adressen ab.
Nun kann es allerdings vorkommen, dass die laufenden Prozesse mehr Speicher anfordern als tatsächlich zur Verfügung steht. In diesem Fall hilft sich das Betriebssystem, indem es momentan nicht benötigte Hauptspeicherinhalte auf den Massenspeicher sichert und damit für solche Prozesse Platz frei macht, die ihn aktuell benötigen. Dieser Prozess heißt Swapping.
Weil das Swapping mit vielen Schreibzugriffen auf den Massenspeicher (also häufig die Festplatten) einhergeht, ist es langsam und bremst das gesamte System. Wer mit einem Performance-Problem zu kämpfen hat, für den ist es aus diesem Grund auch interessant, ob Swapping die Ursache mangelnder Geschwindigkeit sein kann.
Wenn ja, dann ist gut zu wissen, die Daten welcher Prozesse auf die Platten ausgelagert wurden. Ärgerlicherweise kann Linux darüber nicht direkt Auskunft geben. Zwar können Tools wie »top« oder »vmstat« immerhin summarisch über die Swap-Nutzung informieren, nicht jedoch pro Prozess. Diese Lücke schließt ein cleveres Shellskript (Listing 1) des schwedischen Sysadmin Erik Ljungstrom, das er vor Jahren einmal in seinem Blog veröffentlichte [1].
Listing 1
swapstat.sh
01 #!/bin/bash
02 # Get current swap usage for all running processes
03 # Erik Ljungstrom 27/05/2011
04 SUM=0
05 OVERALL=0
06 for DIR in `find /proc/ -maxdepth 1 -type d | egrep "^/proc/[0-9]"` ; do
07 PID=`echo $DIR | cut -d / -f 3`
08 PROGNAME=`ps -p $PID -o comm --no-headers`
09 for SWAP in `grep Swap $DIR/smaps 2>/dev/null| awk '{ print $2 }'`
10 do
11 let SUM=$SUM+$SWAP
12 done
13 echo "PID=$PID - Swap used: $SUM - ($PROGNAME )"
14 let OVERALL=$OVERALL+$SUM
15 SUM=0
16 done
17
18 echo "Overall swap used: $OVERALL"
Das weitgehend selbsterklärende Skript ermittelt zuerst die PIDs aller Prozesse aus »/proc« und sucht sich dann in einer Schleife dazu die passenden Namen der Prozesse (mit »ps«) und den von ihnen benutzten Swap Space (ebenfalls aus »proc«) zusammen.
Infos
-
“Find Out What Is Using Your Swap”: http://northernmost.org/blog/find-out-what-is-using-your-swap/





