Freigabe von nicht mehr benötigten Ressourcen

jochen35

New Member
Hallo,

ich habe einen vServer (KVM) mit 512 MB RAM auf dem unter anderem Nginx, MySQL und PHP läuft. Trotz des geringen Hauptspeichers läuft der Server recht flott. Ich bin natürlich darauf bedacht, dass der Server möglichst wenig Hauptspeicher benötigt.

Nun ist mir aufgefallen, dass einige PHP-Prozesse weiter laufen, obwohl diese nicht mehr benötigt werden und MySQL scheint einmal belegten Hauptspeicher nicht mehr freizugeben. Es ist also so, dass der Server mehr Hauptspeicher belegt je länger er läuft, obwohl die Anzahl der Zugriffe gleichgeblieben ist. Kann man das System daraufhin optimieren, dass die nicht mehr benötigten Ressourcen automatisch wieder freigegeben werden oder macht das eventuell keinen Sinn?

Hier noch die Ausgabe von top:

Code:
 top - 11:26:46 up 1 day, 12:19,  1 user,  load average: 0,17, 0,14, 0,09
Tasks:  86 total,   2 running,  84 sleeping,   0 stopped,   0 zombie
%Cpu(s):  7,1 us,  0,0 sy,  0,0 ni, 92,9 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
KiB Mem:    508940 total,   501456 used,     7484 free,    12952 buffers
KiB Swap:  1045500 total,   174700 used,   870800 free,    82936 cached

  PID USER      PR  NI  VIRT  RES  SHR S  %CPU %MEM    TIME+  COMMAND
23481 root      20   0  357m 231m 3080 R   0,0 46,6   2:36.28 ajenti-panel
 3170 mysql     20   0  490m  53m 4320 S   0,0 10,7   7:53.10 mysqld
 3991 www-data  20   0  246m  40m  20m S   0,0  8,2   1:33.10 php5-fpm
11795 www-data  20   0  195m  31m  20m S   0,0  6,4   1:18.29 php5-fpm
 3976 www-data  20   0  190m  30m  19m S   0,0  6,1   0:55.65 php5-fpm
 8473 www-data  20   0  188m  27m  18m S   0,0  5,5   0:53.01 php5-fpm
 4606 www-data  20   0  188m  26m  17m S   0,0  5,3   1:31.49 php5-fpm
 4593 www-data  20   0  182m 8220 6088 S   0,0  1,6   0:04.41 php5-fpm
 3975 www-data  20   0  181m 7592 6412 S   0,0  1,5   0:04.98 php5-fpm
14256 www-data  20   0  182m 6344 5276 S   0,0  1,2   0:04.35 php5-fpm
 3962 www-data  20   0 70580 3340 1892 S   0,0  0,7   0:07.40 nginx
 1893 root      20   0 51456 3016 1148 S   0,0  0,6   0:11.37 munin-node
17841 root      20   0 71292 2364 1476 S   6,8  0,5   0:01.01 sshd
 3972 root      20   0  179m 1916  708 S   0,0  0,4   0:06.98 php5-fpm
17847 root      20   0 19736 1772 1184 S   0,0  0,3   0:00.09 bash
 3387 root      20   0 52456 1656  888 S   0,0  0,3   0:28.75 supervisord
29459 root      20   0 23416 1564 1124 R   6,8  0,3   0:00.54 top
 3265 root      20   0 67892 1524 1160 S   0,0  0,3   0:00.00 nginx
 2245 root      20   0 32240 1504  564 S   0,0  0,3   0:00.21 authdaemond
 3973 www-data  20   0  179m 1464  308 S   0,0  0,3   0:00.00 php5-fpm
 3974 www-data  20   0  179m 1460  308 S   0,0  0,3   0:00.00 php5-fpm
 3977 www-data  20   0  179m 1460  308 S   0,0  0,3   0:00.00 php5-fpm
 2571 greylist  20   0 31976 1312 1312 S   0,0  0,3   0:00.03 greylistd
 2034 root      20   0 52936 1128  756 S   0,0  0,2   0:01.21 rsyslogd
 2247 root      20   0 31428  852  572 S   0,0  0,2   0:00.15 authdaemond
 2244 root      20   0 31428  828  564 S   0,0  0,2   0:00.13 authdaemond
 2246 root      20   0 31428  816  564 S   0,0  0,2   0:00.09 authdaemond
 2248 root      20   0 31428  816  564 S   0,0  0,2   0:00.12 authdaemond
 3933 root      20   0 25444  736  732 S   0,0  0,1   0:00.00 pure-ftpd
 2365 root      20   0 20648  700  596 S   0,0  0,1   0:00.55 cron
    1 root      20   0 10648  620  588 S   0,0  0,1   0:02.14 init
 3473 root      20   0 16496  620  616 S   0,0  0,1   0:00.00 getty
 3474 root      20   0 16496  620  616 S   0,0  0,1   0:00.00 getty
 3475 root      20   0 16496  620  616 S   0,0  0,1   0:00.00 getty
 3476 root      20   0 16496  620  616 S   0,0  0,1   0:00.00 getty
 3477 root      20   0 16496  620  616 S   0,0  0,1   0:00.00 getty
 3478 root      20   0 16496  620  616 S   0,0  0,1   0:00.00 getty
 2321 root      20   0  8296  616  544 S   0,0  0,1   0:00.06 couriertcpd
 2297 root      20   0  8296  592  544 S   0,0  0,1   0:00.07 couriertcpd
 2214 root      20   0 23000  580  536 S   0,0  0,1   0:00.02 authdaemond
 3283 Debian-e  20   0 46804  556  464 S   0,0  0,1   0:00.06 exim4
  280 root      20   0 21360  544  544 S   0,0  0,1   0:00.03 udevd
 3354 root      20   0 49932  544  456 S   0,0  0,1   0:00.00 sshd
 1597 root      20   0  9960  516  308 S   0,0  0,1   0:00.00 dhclient
 2262 root      20   0  8296  504  500 S   0,0  0,1   0:00.00 couriertcpd
 2335 root      20   0  8296  504  500 S   0,0  0,1   0:00.00 couriertcpd
 2712 mysql     20   0  4180  488  484 S   0,0  0,1   0:00.01 mysqld_safe
 2320 root      20   0  6356  416  344 S   0,0  0,1   0:00.04 courierlogger
 2296 root      20   0  6356  404  340 S   0,0  0,1   0:00.05 courierlogger
 2073 root      20   0  4116  396  392 S   0,0  0,1   0:00.00 acpid
 2213 root      20   0  6356  344  340 S   0,0  0,1   0:00.00 courierlogger
  401 root      20   0 21352  320  316 S   0,0  0,1   0:00.00 udevd
  400 root      20   0 21312  284  280 S   0,0  0,1   0:00.00 udevd
 2261 root      20   0  6356  228  224 S   0,0  0,0   0:00.00 courierlogger
 2334 root      20   0  6356  228  224 S   0,0  0,0   0:00.00 courierlogger
 2396 messageb  20   0 29804  140  136 S   0,0  0,0   0:00.00 dbus-daemon
    2 root      20   0     0    0    0 S   0,0  0,0   0:00.00 kthreadd
    3 root      20   0     0    0    0 S   0,0  0,0   0:02.04 ksoftirqd/0
    5 root      20   0     0    0    0 S   0,0  0,0   0:00.00 kworker/u:0
    6 root      rt   0     0    0    0 S   0,0  0,0   0:00.00 migration/0
    7 root      rt   0     0    0    0 S   0,0  0,0   0:01.03 watchdog/0
    8 root       0 -20     0    0    0 S   0,0  0,0   0:00.00 cpuset
    9 root       0 -20     0    0    0 S   0,0  0,0   0:00.00 khelper
   10 root      20   0     0    0    0 S   0,0  0,0   0:00.00 kdevtmpfs
   11 root       0 -20     0    0    0 S   0,0  0,0   0:00.00 netns
   12 root      20   0     0    0    0 S   0,0  0,0   0:00.27 sync_supers
   13 root      20   0     0    0    0 S   0,0  0,0   0:00.01 bdi-default
   14 root       0 -20     0    0    0 S   0,0  0,0   0:00.00 kintegrityd
   15 root       0 -20     0    0    0 S   0,0  0,0   0:00.00 kblockd
   16 root      20   0     0    0    0 S   0,0  0,0   0:06.71 kworker/0:1
   17 root      20   0     0    0    0 S   0,0  0,0   0:00.06 khungtaskd
   18 root      20   0     0    0    0 S   0,0  0,0   0:02.46 kswapd0
   19 root      25   5     0    0    0 S   0,0  0,0   0:00.00 ksmd
   20 root      20   0     0    0    0 S   0,0  0,0   0:00.00 fsnotify_mark
   21 root       0 -20     0    0    0 S   0,0  0,0   0:00.00 crypto
  132 root      20   0     0    0    0 S   0,0  0,0   0:10.12 jbd2/vda1-8
  133 root       0 -20     0    0    0 S   0,0  0,0   0:00.00 ext4-dio-unwrit
  142 root      20   0     0    0    0 S   0,0  0,0   0:00.00 kworker/u:1
  410 root       0 -20     0    0    0 S   0,0  0,0   0:00.00 kpsmoused
  418 root      20   0     0    0    0 S   0,0  0,0   0:00.00 vballoon
  419 root      20   0     0    0    0 S   0,0  0,0   0:00.00 khubd
  421 root       0 -20     0    0    0 S   0,0  0,0   0:00.00 ata_sff
  449 root      20   0     0    0    0 S   0,0  0,0   0:00.00 scsi_eh_0
  450 root      20   0     0    0    0 S   0,0  0,0   0:00.00 scsi_eh_1
 1940 root      20   0     0    0    0 S   0,0  0,0   0:05.56 flush-254:0
12562 root      20   0     0    0    0 S   0,0  0,0   0:05.10 kworker/0:0

Gruß
Jochen
 
Das was du da optimieren willst macht die Speicherverwaltung unter Linux schon automatisch für dich.
Code:
12952 buffers
Zeigt dir in dem Moment an wie viel Speicher zwar benutzt aber eventuell freigegeben werden könnte. Das ist nicht mehr viel.

Aber mal Hand aufs Herz, du besorgst dir einen vServer mit 512 MB RAM und packst dann ein Webpanel drauf was schonmal knappe 50% vom RAM frisst ?
Code:
23481 root      20   0  357m 231m 3080 R   0,0 46,6   2:36.28 ajenti-panel

Aber sich dann beklagen wenn MySQL und PHP ein paar MB zum Ausführen der Scripte verschlucken. Das muss man nicht verstehen oder? :)

Außerdem kann man den Speicherverbrauch von MySQL und PHP beschränken. Aber das findet sich ja alles in der Konfiguration bzw Dokumentation.


Grüße
 
Das Panel verbraucht natürlich vergleichsweise viel Speicher, aber nach einem Neustart des Servers und den ersten Zugriffen auf die Seite ist noch deutlich mehr Speicher frei. Mir geht es auch nicht darum über den Sinn oder Unsinn meiner Konfiguration zu diskutieren, sondern eben um die beschriebene Problematik.

Im Wesentlichen sind es wohl die php-fpm Prozesse. Selbst wenn zu dem Server keine Verbindungen mehr offen sind und die letzten schon vor mehreren Stunden geschlossen wurden, sind die diese php-fpm Prozesse nach wie vor aktiv und belegen entsprechend Hauptspeicher.
 
Dann beschränk halt die Anzahl der Child-Prozesse die php-fpm spawned in der Konfiguration. Dann kannst du zwar nicht mehr so viele Anfragen parallel verarbeiten aber das willst du ja eh nicht.
Und dann kannst du noch am Memory-Limit von PHP drehen wenn du meinst das die php-fpm-Prozesse das Problem sind.
 
Nun ist mir aufgefallen, dass einige PHP-Prozesse weiter laufen, obwohl diese nicht mehr benötigt werden und MySQL scheint einmal belegten Hauptspeicher nicht mehr freizugeben. Es ist also so, dass der Server mehr Hauptspeicher belegt je länger er läuft, obwohl die Anzahl der Zugriffe gleichgeblieben ist. Kann man das System daraufhin optimieren, dass die nicht mehr benötigten Ressourcen automatisch wieder freigegeben werden oder macht das eventuell keinen Sinn?

Vorneweg: Es macht keinen Sinn.
Linux hat ein relativ gut durchdachtes Speichermanagment. Dabei werden Sachen, die einmal in den RAM geladen wurden, für eine mögliche spätere Verwendung im Speicher gehalten, um ein erneutes Laden zu vermeiden und dadurch die Gesamtperformance zu optimieren. Das erklärt auch, warum dein RAM mit der Zeit (scheinbar) immer voller wird.
Wenn ein anderer Dienst RAM anfordert und das System nicht mehr die angeforderte RAM-Menge aus dem freien Speicher bereitstellen kann, werden Teile des bisher reservierten Speichers freigegeben.
Und wenn das auch nicht mehr funktioniert, wird auf den SWAP zurückgegriffen.

Mir geht es auch nicht darum über den Sinn oder Unsinn meiner Konfiguration zu diskutieren, sondern eben um die beschriebene Problematik.
Naja...Hier liegt aber im Endeffekt dein Problem. Mit 512MB RAM fährst du bei deiner Konfiguration immer am Limit, worauf die Menge des belegten SWAP hinweist.
Auch wenn dein Server im Moment 'recht flott' läuft, sollte ein Upgrade deiner Ressourcen überdacht werden. Sobald die Anzahl der Seitenaufrufe signifikant steigen sollte, wirst du Performanceprobleme bekommen.
 
Last edited by a moderator:
Wenn ein anderer Dienst RAM anfordert und das System nicht mehr die angeforderte RAM-Menge aus dem freien Speicher bereitstellen kann, werden Teile des bisher reservierten Speichers freigegeben.

Ok, aber solange noch php-fpm Prozesse aktiv sind kann der Speicher doch nicht freigegeben werden oder sehe ich das falsch. Wenn man sich das Ergbnisn von top mal ansieht, fällt doch eigentlich sofort ins Auge, das die php-fpm Prozesse deutlich zu lange laufen oder nicht? Wie gesagt, die Prozesse sind immer noch aktiv, obwohl schon längere Zeit keine Zugriff mehr stattfinden.

Auch wenn dein Server im Moment 'recht flott' läuft, sollte ein Upgrade deiner Ressourcen überdacht werden. Sobald die Anzahl der Seitenaufrufe signifikant steigen sollte, wirst du Performanceprobleme bekommen.

Da sollte es eigentlich keine Probleme geben, da der Server ausschließlich für eine private Cloud gedacht ist, wo maximal 10 Nutzer drauf zugreifen.

Gruß
Jochen
 
Ok, aber solange noch php-fpm Prozesse aktiv sind kann der Speicher doch nicht freigegeben werden oder sehe ich das falsch. Wenn man sich das Ergbnisn von top mal ansieht, fällt doch eigentlich sofort ins Auge, das die php-fpm Prozesse deutlich zu lange laufen oder nicht? Wie gesagt, die Prozesse sind immer noch aktiv, obwohl schon längere Zeit keine Zugriff mehr stattfinden.

Nein, eben nicht.
Wenn du dir die top-Anzeige im Startpost nochmal anschaust
Tasks: 86 total, 2 running, 84 sleeping, 0 stopped, 0 zombie
siehst du, daß gerade mal 2 Tasks laufen (ajenti und top). Die php-Tasks laufen nicht (mehr), aber der Speicher bleibt reserviert, bis er anderweitig benötigt und angefordert wird oder bis z.B. ein neuer php-Task gestartet wird. Dann können z.B. früher schon geladene Laufzeitbibliotheken direkt wieder angesprochen werden und müssen nicht erneut von der HD in den RAM geladen werden.
 
Last edited by a moderator:
Gute Lektüre zum Thema Caches / Buffers, auch mit weiterführenden Informationen: http://linuxatemyram.com

Ansonsten kannst du grundsätzlich bei fast allen Daemons irgendwie konfigurieren, wie viele Prozesse oder Threads vorgehalten werden; oftmals auch mit Minimum-/Maximum-Angaben oder anderen Detail-Spezifikationsmöglichkeiten.

Dass du nach einem Neustart mehr RAM frei hast, ist korrekt und normal, aber nicht "besser". MySQL zum Beispiel wird signifikant schneller, wenn es wichtige Queries oder ganze Tabellen im Cache hat. Andere Daemons wiederum werden in erster Linie auf das Nutzerverhalten reagieren und mehr "Worker" bereitstellen, wenn entsprechende Arbeit auf sie wartet.

Zu MySQL sei noch gesagt, dass es hier nicht nur um Disk-I/O-Caching geht, sondern auch einmal "berechnete" Queries zwischengespeichert werden. Du sparst also auch CPU-Usage durch das Caching seitens MySQL. Der mysqld bietet mehr Konfigurationsparameter als man an einem Tag abarbeiten kann; ich schließe mich aber der Meinung an, dass bei 512 MB RAM nicht mehr sooo viel optimiert werden kann. Das ist einfach für so ein Setup die Untergrenze.


[Edit] @nexus: Dass die Prozesse "nicht laufen", heißt aber nur, dass sie genau in diesem Moment nicht im Running-State sind. Das würde ich keineswegs als "sie laufen nicht" bezeichnen bzw. diese Erläuterung ist etwas irreführend, weil die Prozesse trotzdem nicht einfach beendet werden dürfen.
 
Last edited by a moderator:
Ich sags ja nur ungern: Aber ich habs doch schon vor Tagen gesagt:
:p

Das Setup was du da betreibst mit so wenig Ram abzufrühstücken ist nicht nur für das System eine Herausforderung, sondern auch für den Admin.
Tipps um Ram zu sparen, hatte ich in deinem anderen Thread ebenfalls schon genannt.
FPM oder CGI ist zum Ram-Sparen nun mal die dämlichste Idee. ;)

Und das ein Server im laufe der Zeit mehr Speicher schluckt, liegt am Caching des Kernels (zu vernachlässigen) und der Dienste. Wenn du denen sagst, sie dürfen Cachen, dann machen die den halt auch irgendwann voll.
Die Standardkonfiguration aller Dienste der meisten Distributionen sind im übrigen für weit mehr als 512MB Ram ausgelegt.
Du musst also (wie in dem anderen Thread schon mal geschrieben) an verdammt vielen Schräubchen jedes einzelnen Dienstes drehen um mit dem Ram ein System stabil betreiben zu können.

Entgegen trotz der Warnungen im anderen Thread nun unsere Zeit zu vergeuden, weil du nicht hören konntest und nun nicht fühlen willst, finde ich ziemlich frech.
 
@nexus: Dass die Prozesse "nicht laufen", heißt aber nur, dass sie genau in diesem Moment nicht im Running-State sind. Das würde ich keineswegs als "sie laufen nicht" bezeichnen bzw. diese Erläuterung ist etwas irreführend, weil die Prozesse trotzdem nicht einfach beendet werden dürfen.
Ich bin mir durchaus bewußt, daß meine Erklärung nicht völlig korrekt war, mir ging es eher um die Verständlichkeit des dahinterstehenden Prinzips. Ich werde mich aber in Zukunft bemühen, sowas besser zu formulieren. :)
 
Entgegen trotz der Warnungen im anderen Thread nun unsere Zeit zu vergeuden, weil du nicht hören konntest und nun nicht fühlen willst, finde ich ziemlich frech.

Sorry, ich will natürlich hier nicht Eure Zeit vergeuden, daher bitte ich diesen Beitrag als geschlossen zu betrachten.

Leider war ich wohl zu naiv zu glauben, dass man sich in solch einem Forum auch derartigen Themen mit entsprechendem Interesse annehmen wird. Unmöglich ist es auf jeden Fall nicht, nur eben eine Herausforderung.

Gruß
Jochen
 
Last edited by a moderator:
Sorry, ich will natürlich hier nicht Eure Zeit vergeuden, daher bitte ich diesen Beitrag als geschlossen zu betrachten.

Leider war ich wohl zu naiv zu glauben, dass man sich in solch einem Forum auch derartigen Themen mit entsprechendem Interesse annehmen wird. Unmöglich ist es auf jeden Fall nicht, nur eben eine Herausforderung.
Hehe...nicht gleich bockig werden ;) :D
Sieh es doch auch mal aus der Sicht der Helfenden...Man investiert seine Freizeit, um Hilfesuchenden mögliche Wege (oder auch Alternativen) für ihre Probleme aufzuzeigen und muß dann kurze zeit später in einem anderen Thread feststellen, daß die gemachten Vorschläge unbeachtet bleiben. Sowas enttäuscht dann schon ein wenig.
In deinem speziellen Fall wurde dir ja schon in dem anderen Thread nahegelegt, daß dein RAM einfach zu wenig für dein Setup ist. Und bei allem nötigen Respekt...ein RAM-Upgrade auf 1GB kostet heutzutage vllt. 2-3€ mehr im Monat, das sollte eigentlich auch zu verschmerzen sein.
Die Alternative Webspace wurde ja schon mehrfach genannt...da hättest du für vergleichbare monatliche Kosten ein rund laufendes System, welches deine Bedürfnisse mit Sicherheit abdecken würde und zusätzlich ersparst du dir viele, viele Stunden Arbeitsaufwand für die ganze Administration.

P.S.:
Ein Server, der im Internet erreichbar ist, ist aus vielen Gründen keine Spielwiese und denkbar schlecht dafür geeignet, fehlendes Basiswissen zu erlernen. Sowas macht man zuhause in einer lokalen VM.
 
Last edited by a moderator:
Back
Top