Re: Speicherverbrauch und top unter FreeBSD 6.x

From: Alvar Freude <alvar(at)a-blast.org>
Date: Mon, 10 Apr 2006 00:44:31 +0200

Hi,

mal wieder eine alte Mail ... ;)

-- Oliver Fromme <olli(at)lurza.secnetix.de> wrote:

> Alvar Freude <alvar(at)a-blast.org> wrote:
> > schon länger ist mir aufgefallen: kann es sein, dass ab FreeBSD 6
> bei > top ein anderer Speicherverbrauch angezeigt wird als bei älteren
> > Versionen,
>
> In 7-current wurde vor kurzem ein neues malloc eingeführt,
> das zu gewissen Anomalien bei der Anzeige des Speicherver-
> brauchs von Prozessen führte (es wird erheblich mehr ange-
> zeigt, als tatsächlich benutzt wird).
>
> Das neue malloc wurde allerdings bisher nicht nach 6-stable
> MFCt, daher wäre das vermutlich keine Erklärung für Deine
> Beobachtung.

hmmm ...
Es sind die vor einigen Wochen aktuellen 6.0-Updates drin, nichts vom 7er.

> 64bit-Code benötigt natürlich tendenziell mehr Speicher,
> da bestimmte Datentypen (z.B. Pointer) doppelt so groß
> sind. Auch amd64-Maschinencode ist tendenziell auch etwas
> größer als der entsprechende i386-Code (das wird aber
> teilweise wieder dadurch ausgeglichen, daß 64bit-Opera-
> tionen weniger Anweisungen benötigen). In der Praxis dür-
> fte das allerdings nur einen geringen Unterschied machen,
> d.h. keinesfalls Faktor zwei oder mehr.

ok -- es ist aber definitiv deutlich mehr ;)

Habe es gerade mal mit einem nackten Perl (das auf Eingaben von STDIN
wartet) getestet, ausgaben von top:

6.0 auf amd64, Perl 5.8.7:
9336K size, 2052K res

6.1 beta auf i386 (Athlon-tbird), Perl 5.8.8:
2648K size, 1192K res

Bei der bash sieht es ähnlich aus, die verbraucht bei beiden sogar noch
etwas mehr:

amd64:
9920K size, 2452K res

i386:
3208K size, 1624K res

Demnach, braucht alles in etwa drei mal so viel Speicher (laut top).
Alldings SIZE; bei RES ist der Unterschied geringer, ca 1.5 mal so viel.
Vielleicht doch irgendwelchen System-Libs, die unter amd64 deutlich
zunehmen?

> > Denn ein normaler Apache ohne irgendwelche besonderen Module
> verbraucht > laut top gleich beim Start schon >30 MB.
>
> Das ist eigentlich nicht ungewöhnlich, wenn Du die ganzen
> Standard-Module, mod_ssl, mod_perl und php drinhast.
> Oder zählst Du die schon als »besondere Module«?

ja, die zähle ich durchaus zu besonderen Modulen.
mod_perl ist im Backend im anderen Jail, mod_php kommt mir nicht
freiwillig auf den Rechner ;)
mod_ssl ist allerdings installiert.

Den Unterschied beim Apache kann ich nicht so einfach messen, da ich da
nichts wirklich vergleichbar konfiguriertes habe, bei dem ich
Nebeneffekte ausschließen kann.

Aber: Der Apache 2.2 mit mod_ssl, Worker MPM (threads) zeigt rund 60 MB
size an, 7 MB res; unter 6.0/AMD64; ein 2.0 unter 5.4 i386, prefork: ca.
10 MB size, 6 MB res.

Aber hier kann auch wieder der virtuelle Speicher mitspielen, beide
laufen schon eine Weile (aber RAM ist genug frei).

> Es kommt natürlich auch darauf an, was Du mit »Speicher-
> verbrauch« genau meinst. top(1) und ps(1) zeigen ja so-
> wohl die virtuelle Größe (VSZ oder SIZE) als auch die
> residente Größe (RSS oder RES) an.
>
> Erstere beinhaltet sämtliche Pages des VM-Systems, die
> dem Prozeß zugeordnet sind, was z.B. auch gemappte Dateien
> und Devices beinhaltet, und Speicher, der zwar alloziiert
> wurde, aber nie verwendet wird (und daher auch keinen
> Speicher belegt). Manche Programme gehen mit sowas recht
> großzügig um (prominente Beispiele sind der rpc.statd und
> der X-Server), was ja auch nicht schadet.

ah, OK, SIZE kann damit also auch nochmal größer sein, als überhaupt
insgesamt verbraucht wird.

> Allerdings beinhalten _beide_ Angaben auch Pages, die meh-
> reren Prozessen gleichzeit gehören. Das sind z.B. Pages
> von Executables (wenn ein Binary mehrfach gestartet wird
> -- auch von unterschiedlichen Benutzern --, liegt sein
> Text-Segment nur einmal im Speicher), Libraries oder
> Shared-Memory-Segmente, mit denen Prozesse untereinander
> kommunizieren.

ja -- wenn ich das bei meinem Webserver alles zusammenrechnen würde,
müsste der 16 GB RAM haben oder so.

> > Kann ich also irgendwie
> >rauskriegen, wieviel Speicher sich > die einzelnen Prozesse teilen?
>
> Nö. Das ist auch gar nicht so ohne weiteres möglich, weil
> die Information im VM-System nicht vorhanden ist. Soviel
> ich weiß, verwaltet der Kernel nur eine Zuordnung von Pro-
> zessen zu Pages, aber nicht umgekehrt. Der Overhead wäre
> einfach zu groß, und der Nutzen gering.

OK, verstehe.
Das ist natürlich zum Debuggen schade, da sich so nicht so leicht
herausfinden lässt, ob denn in meinem Fall z.B. wirklich alle
Datenstrukturen zwischen den einzelnen Apaches geshared werden (weil vor
dem Forken initialisiert) oder nicht.

> PS: Übrigens, im Zweifelsfall würde ich der Ausgabe von
> ps(1) mehr trauen als der von top(1). ps ist ein »native«
> BSD-Tool, das entsprechend gepflegt wird, während top nur
> »contributed« ist (Third-party), das zwar auch von BSDlern
> integriert und gepflegt wird, aber manchmal ist es halt
> nicht so richtig am Ball. Ich habe es schon mehrfach er-
> lebt, daß die Ausgaben von top schlicht und einfach falsch
> waren, während ps eine vernünftige Ausgabe produzierte.

die sind in den Fällen hier beide sehr ähnlich, wenn ich das nicht
falsch gesehen habe.

Ciao
  Alvar

-- 
** Alvar C.H. Freude, http://alvar.a-blast.org/
** http://www.wen-waehlen.de/
** http://odem.org/
** http://www.assoziations-blaster.de/

To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Mon 10 Apr 2006 - 00:46:11 CEST

search this site