# Server-Auslastungsanalyse RAM/CPU unter Linux (mit "TOP")



## lukelukeluke (24. Juli 2006)

Hi,
Ich bin gerade, daran die Auslastung meines Servers zu verstehen... Ich habe einen Linux Server auf dem ca. 20 Webseiten (inkl. Confixx,Subdomains,FTP,E-Mail,PHP,MySQL,etc...) laufen.
Seit einer Woche habe ich nun auch ein selbst geschriebenes Java-Server-Programm am laufen, bei welchem für jede Client-Connection ein eigener Thread (oder Task? Im Java-Code steht "extends Thread"...) erstellt wird (wird in "TOP" angezeigt, Screenshot ist angehängt).

In TOP wird ausserdem oben folgendes angezeigt:
top - 11:09:47 up 104 days, 18:03,  1 user,  load average: 0.63, 0.81, 0.78
Tasks:  *67* total,   *1* running,  *63* sleeping,   *0* stopped,   *3* zombie
Cpu(s):   *0.9%* user,   *0.4%* system,   *0.0%* nice,  *98.7%* idle
Mem:   *2066216k* total,  *1734948k* used,   *331268k* free,   *282980k* buffers
Swap:  *2008084k* total,   *640908k* used,  *1367176k* free,   *766780k* cached

Wobei ich folgendes berechnet habe (ich hoffe das stimmt):
Memory Total: 2066216 k-bit / 8 = 258277 k-bytes / 1024 = *252 M-Bytes*
Memory Used: 1734948 k-bit / 8 / 1024 = *211 M-Bytes*
Memory Free: 331268 k-bit / 8 / 1024 = *40 M-Bytes*

Swap Total: *245 MB*
Swap Used: *78 MB*
Swap Free: *166 MB*

Folgende Fragen stellen sich mir:
1) Stimmen meine Berechnungen? Ist die Anzeige in k-bit und wird mit durch 8 und durch 1024 in M-Bytes umgerechnet?
2) Ist mein Server i.O.? Hat er genügend Leistung für die darauf laufenden Komponenten? Ich plane ein RAM-Update auf 512 MB, kann ich im Voraus bestimmen, ob dies notwendig ist?
3) Wie schlimm sind diese Threads des Java-Programmes? Wieviel solcher kann mein System aushalten? 100? 1'000?
Danke für alle Hinweise!


----------



## ishino (25. Juli 2006)

Die Zahlen sind in Kilobyte zu lesen, also nur durch 1024 teilen. Der Server hat demnach 2 GB RAM und genauso viel Swap. Dein RAM-Upgrade auf 512 MB waere also eher  kontraproduktiv. ;-)

Nach den Zahlen fuer die Systemlast zu urteilen, ist der Server ausreichend dimensioniert. Die Last liegt im Schnitt unter 1, d.h. weniger als ein lauffaehiger Prozess (also keine die auf I/O warten oder idle sind, etc.) steht an, um vom Prozessor Rechenzeit zu bekommen. Sobald die Last ueber der Anzahl von Prozessoren in der Maschine wachst, sollte man sich Gedanken um ein Upgrade machen.

Zu den Java-Prozessen gaebe es nur in sofern was zu sagen, als dass jeder Prozess ein gewisses Mass an Overhead fuer das System bedeutet (u.a. beim Paging, also dem Auslagern nicht benoetigter Seiten aus dem Speicher ins Swap). Ansonsten ist das kein grosses Problem. Wieviele Prozesse es werden koennen, haengt von diversen Faktoren ab. Unter anderem kann es sein, dass ein Limit gesetzt ist, ueber das hinaus einfach keine neuen Prozesse mehr erzeugt werden koennen (Limit entweder global fuer alle oder fuer einzelne User).


----------



## lukelukeluke (25. Juli 2006)

Hallo ishino, Bist du sicher, dass man es so berechnet? Ich bezahle bei meinem Miet-Server naemlich nur 256 MB RAM... Kann es sein dass dies bei virtuellen Servern anders ist als bei Dedicated Servern? Dass dort also etwas anders angezeigt wird? Könnte ich mit einem Programm eventuell den RAM testen, sozusagen Random vollschreiben und sehen, ob wirklich 2 GB zur Verfügung steht? Gruss, Luke


----------



## ishino (26. Juli 2006)

Ich bin mir sicher, dass es auf _meinem_ System so ist.  

Die Ausgabe von meinem top:


```
olymp ~ # top -n 1 | head -n 5 | grep total
Tasks:  58 total,   1 running,  57 sleeping,   0 stopped,   0 zombie
Mem:   1035980k total,   477428k used,   558552k free,    37444k buffers
Swap:  2008116k total,        0k used,  2008116k free,   324892k cached
```

Und das ganze mit verschiedenen Varianten von *free*, procps version 3.2.7:


```
olymp ~ # free -V       
procps version 3.2.7
```

die Optionen stehen fuer die Einheit bei der Speicherangabe, m fuer MG, k fuer KB, b fuer Bytes, default ist -k, also in KB:


```
olymp ~ # free -m
             total       used       free     shared    buffers     cached
Mem:          1011        465        546          0         35        317
-/+ buffers/cache:        112        899
Swap:         1961          0       1961
olymp ~ # free -k
             total       used       free     shared    buffers     cached
Mem:       1035980     476576     559404          0      36804     324732
-/+ buffers/cache:     115040     920940
Swap:      2008116          0    2008116
olymp ~ # free -b
             total       used       free     shared    buffers     cached
Mem:    1060843520  488013824  572829696          0   37687296  332525568
-/+ buffers/cache:  117800960  943042560
Swap:   2056310784          0 2056310784
olymp ~ # free   
             total       used       free     shared    buffers     cached
Mem:       1035980     476576     559404          0      36804     324732
-/+ buffers/cache:     115040     920940
Swap:      2008116          0    2008116
olymp ~ #
```

Wieviel man davon benutzen darf, kann man zum Beispiel in einer Bash=Shell per *ulimit* einstellen.


```
olymp ~ # ulimit -a 
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
max nice                        (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 8191
max locked memory       (kbytes, -l) 32
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
max rt priority                 (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 8191
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
```

Interessant ist -v, die Groesse des virtuellen Speichers. Wenn ich das verkleinere (ulimit -v <wert>), habe ich zwar immer noch 1 GB physikalischen Speicher, aber ich darf nur einen Teil davon benutzen. top zeigt dann immer noch die gleichen Werte, nur kann ich halt keinen Speicher mehr allokieren.

Ich glaube zwar nicht, dass das auf Deinem Server so gemacht wird, aber es gibt eben Moeglichkeiten, den Speicher zu begrenzen, deshalb vielleicht das "Problem" mit dem Miet-RAM...

...oder Du hast einfach nur einen Provider, der a) nett ist oder b) nich gepeilt hat, dass Du mehr RAM hast oder c) dem das egal ist ;-)


----------



## lukelukeluke (26. Juli 2006)

Hi ishino, danke für deine Erklärung!
*free* hat mir schon ein bischen weitergeholfen. *unlimit* habe ich leider nicht installiert, ein Paket advon konnte ich auf http://www.rpmseek.com auch nicht finden...
Ich glaube nicht das mein Provider einen Fehler gemacht hat - erst recht nicht dass er so zuvorkommend ist.
Ausserdem ist doch komisch, dass auf meinem Server so viel RAM gebraucht wird (ich habe in diesem Moment *1940 MB* verbraucht und nur *81 MB* frei. Das kann fast nicht sein...! Ausserdem müste das ganze ja auf 256 MB laufen können, wäre ja dann mit der Geschwindigkeit nicht mehr vorstellbar wenn alles im Swap wäre.
Hat jemand von euch eine Ahnung was bei virtuellen Servern anders sein könnte?


----------



## RedWing (26. Juli 2006)

Hallo,

ich denke das ist so:
VServer = Gastgeber BS + viele Gastbetriebssysteme

Wenn du auf deinen dir zugeteilten Gast Betriebssystem mit free dir die Speichernutzung ausgeben 
laesst zeigt dir free den Speicher der Hardware an...
Die einzelnen Gastbetriebssysteme teilen sich aber den Speicher somit steht dir als Nutzer nicht so
viel zur Verfuegung, weswegen du auch nur fuer 256 MB zahlst. Real auf dem Rechner existieren aber
2 GB. Das wuerde im uebrigen auch die hohe Speicherbenutzung erklaeren.
Aber alles nur eine Vermutung 

Gruß,

RedWing


----------



## ishino (26. Juli 2006)

Ich denke auch, dass Dir einfach nur ein Teil des Speichers zur Verfuegung gestellt wird. Wenn ich mit ulimit meinen SPeicher limitiere, sehe ich trotzdem noch das eine GB, kann es aber eben nicht nutzen. Sowas in der Art wird auf den VServern sicherlich auch der Fall sein.


----------



## lukelukeluke (27. Juli 2006)

Ja das könnte schon sein.
Wenn ich jedoch mit VM-Ware einen virtuellen Server erstelle und darauf Linux installiere, wird nur soviel RAM angezeigt, wie ich dieser virtuellen Umgebung zugewiesen habe...
Irgendetwas ist also faul. Ausserdem kann ich ja so nicht prüfen, ob sie mein Upgrade auf 512 MB wirklich machen, wenn ich es in Auftrag gebe.
Dieses *unlimit* Tool, kann ich das auf meinem System installieren? rpmseek und google geben mir nicht gerade was brauchbares darüber...


----------



## ishino (27. Juli 2006)

ulimit ist in die Bash-Shell integriert, Du brauchst dafuer kein rpm. Allerdings hab ich das auch nur als Beispiel herangezogen, um zu zeigen, dass die Begrenzung des nutzbaren Speichers prinzipiell kein Problem darstellt. Wie schon gesagt, Dein Provider wird sicherlich andere Wege gehen, um Dir einen entsprechend Deiner Miete ausgestatteten Server hinzustellen.


----------

