Speicherverbrauch
SventB
- php
Hallo,
meine apache Prozesse haben einen Recht hohen Speicherbedarf, zwischen 6 und 12 MB:
www-data 13587 0.5 9.3 107844 12336 ? S 21:04 0:11 /usr/sbin/apache2 -k start
www-data 13591 0.4 5.9 103608 7812 ? S 21:06 0:08 /usr/sbin/apache2 -k start
Deshalb versagt mein Server auch ca jede Stunde und die Webseite ist offline. Ich würde gerne den Speicherbedarf der Skripte reduzieren. Lokal habe ich Win XP mit XAMPP laufen. Wenn ich mir mit der Funktion memory_get_usage() den aktuellen Speicherbedarf ausgeben lasse, erhalte ich ein (für mich) erstaunliches Ergebnis: Der meiste Speicherbedarf fällt am Skriptanfang an, dort, wo ich die ganzen Klassen inkludiere, z.B.
echo memory_get_usage(1) / (1024*1024) . '<br>';
include(BASEPATH . 'inc/test.class.php');
echo memory_get_usage(1) / (1024*1024);
ergibt die Ausgabe
1.5
2.25
Mich erstaunen nicht nur die geraden Zahlen, sondern vor allem der sprunghafte Anstieg des Speicherbedarfes. In der php Datei stehen ca 1600 Zeilen Code und sie ist 64549 bytes groß.
Kann mir das bitte jemand erklären?
Hello,
Deshalb versagt mein Server auch ca jede Stunde und die Webseite ist offline. Ich würde gerne den Speicherbedarf der Skripte reduzieren. Lokal habe ich Win XP mit XAMPP laufen. Wenn ich mir mit der Funktion memory_get_usage() den aktuellen Speicherbedarf ausgeben lasse, erhalte ich ein (für mich) erstaunliches Ergebnis: Der meiste Speicherbedarf fällt am Skriptanfang an, dort, wo ich die ganzen Klassen inkludiere, z.B.
Deshalb vertrete ich auch nach über einem Jahr Sammelei von Erfahrungswerten Anderer immer noch (oder erst Recht) die Meinung, dass OOP in der vorliegenden Form und PHP (oder andere Client-Server orientierte Scriptsprachen) nicht zusammenpassen...
Außerdem fehlt PHP die Möglichkeit, geladene Module wieder zu entladen während der Laufzeit des Scriptes!
Man kann aber trotzdem etwas tun gegen den ungebremsten Speicherverbrauch. Man lädt nur die Klassen (Module), die im Script wirklich benötigt werden. Das geht auch dynamisch.
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
Deshalb vertrete ich auch nach über einem Jahr Sammelei von Erfahrungswerten Anderer immer noch (oder erst Recht) die Meinung, dass OOP in der vorliegenden Form und PHP (oder andere Client-Server orientierte Scriptsprachen) nicht zusammenpassen...
Andere Programmierparadigmen, z.B. die funktionale Programmierung, sind aber auch nicht besser... !?
Man kann aber trotzdem etwas tun gegen den ungebremsten Speicherverbrauch. Man lädt nur die Klassen (Module), die im Script wirklich benötigt werden. Das geht auch dynamisch.
Das heißt, ich müßte die Klassen ziemlich weit aufsplitten... also am besten in jedem Modul nur eine Hand voll Funktionen!?
Hello,
Andere Programmierparadigmen, z.B. die funktionale Programmierung, sind aber auch nicht besser... !?
bei der Imperativen Programmierung, falls Du die meintest, kann man besser steuern und kontrollieren, welche Elemente benutzt werde sollen. Die OOP ist da doch schon etwas mystisch und wenn man seine Klassen nicht sauber trennt, braucht man nachher doch alle, ohne wirklich zu wissen, warum eigentlich...
Da wird es gleich Protest hageln. Aber das könnte eventuell dazu beitragen, dass Du Deine Fehler erkennen kannst :)
Hand voll Funktionen!?
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
Hellihello
Das heißt, ich müßte die Klassen ziemlich weit aufsplitten... also am besten in jedem Modul nur eine Hand voll Funktionen!?
http://framework.zend.com vielleicht mal anschauen?
Dank und Gruß,
http://framework.zend.com vielleicht mal anschauen?
Nutze ich bereits. Je nachdem welches Zend-Modul ich nutze, benötige ich mehr oder weniger Speicher:
Zend_Db: 0,06 MB
Zend_Form: 0,5 MB
Ist natürlich wieder abhängig davon, wieviel Zeilen Code in den Dateien steht:
Zend_Db: 270 Zeilen
Zend_Form: 3000 Zeilen
Hallo,
Deshalb vertrete ich auch nach über einem Jahr Sammelei von Erfahrungswerten Anderer immer noch (oder erst Recht) die Meinung, dass OOP in der vorliegenden Form und PHP (oder andere Client-Server orientierte Scriptsprachen) nicht zusammenpassen...
ach ja? ASP.NET ist auf Windows-Servern völlig normal. Funktioniert prima, auch im Webumfeld. Bei normalen Client-Server-Anwendungen in C# und VB in OOP kann ich auch keine Probleme feststellen, ebensowenig bei den Java-Anwendungen die ich an jedem Arbeitstag nutze.
Und Speicherschwein kann ich auch ohne OOP problemlos sein. Mit folgendem Code, der weniger als 100 Byte umfasst kann ich locker 250 MB Speicher verbraten, ohne OOP zu nutzen.
<?php
$input = file_get_contents("grosse_datei.txt");
?>
Könntest Du mir bitte den Zusammenhang, den Du da konstruierst, erläutern?
Freundliche Grüße
Vinzenz
Hello,
Könntest Du mir bitte den Zusammenhang, den Du da konstruierst, erläutern?
Aus dem Stand nur schlecht...
Bei PHP (ohne Zusatzsoftware) muss jedes Mal der gesamte nicht interpretierte Klassenapparat, also im Quelltext, geladen werden, interpretiert werden und dann davon die privaten Instanzen des Prozesses gebildet werden.
Bei Dot-Net wird der Quellcode bereits in Zwischencode umgewandelt, also vorinterpretiert. Die Ausführung findet dann unter Verwendung von kompakten Codes (5kBytes enthalten da schon eine Menge Instruktionen, wofür man bei PHP ca. 50kBytes braucht) mit einem einmalig geladenenen Runtimesystems, das sich bestens ans OS anlehnt, ausgeführt. Das ist vergleichbar mit PHPs Modulen im Apachen. Die können aber im Vergleich zu Dot-Net zu wenig.
Die Geschichte mit der Intermediate Language mutet einem auf den ersten Blick recht abenteuerlich an, auf den zweiten sieht man dann bei real benutzen Systemen die Vorteile.
Dein Beispiel mit dem Laden einer großen Datei hinkt übrigens auch, weil man gerade DIESEN Speicher noch während des Scriptes mehrfach wieder freigeben und neu allokieren lassen kann.
Außerdem weißt Du ja, dass ich sowieso Gegner der namensbasierten Filezugriffsfunktionen in PHP bin, weil sie eben genau diese Macke und zusätzlich die Macke der falschen Lockingstrategie (Streaming) haben, bzw. diese noch nicht einmal konsequent umsetzen.
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
Hallo,
meine apache Prozesse haben einen Recht hohen Speicherbedarf, zwischen 6 und 12 MB:
wie süß...
Wenn du mit tollen Servern in Java geschrieben arbeiten musst, kannst du über solche Zahlen nur lachen. Da sind 300-400 MB minimum um den Server (mit JVM etc.) zu starten ...
Aber mal im ernst: 20 MB ist eigentlich nicht wirklich viel. Deswegen sollte der Server eigentlich nicht abstürzen.
Als Tipp evt.: Neuste PHP Version installiert?
Grüße
Klaus
Hello,
Aber mal im ernst: 20 MB ist eigentlich nicht wirklich viel. Deswegen sollte der Server eigentlich nicht abstürzen.
Er benötigt die 20MB pro Instanz, Wenn er also nur 40 Zugriffe in einem gemeinsamen Zeitraum hat (z.B. innerhalb einer Sekunde), dann ist er schon bei 800MB angekommen nur für die PHP-Scripte. Dazu kommt dann noch der dynmaisch allokierte Speicher des OS für Filezugriffe usw. Da steht man schnell an der Wand.
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
Er benötigt die 20MB pro Instanz, Wenn er also nur 40 Zugriffe in einem gemeinsamen Zeitraum hat (z.B. innerhalb einer Sekunde), dann ist er schon bei 800MB angekommen nur für die PHP-Scripte. Dazu kommt dann noch der dynmaisch allokierte Speicher des OS für Filezugriffe usw. Da steht man schnell an der Wand.
Genau so ist es. Habe schon versucht, die Zugriffe auf 10 oder 20 einzugrenzen (über MaxClients in /etc/apache2/apache2.conf) aber dann gibt der Server nach kürzester Zeit überhaupt keinen Mucks mehr von sich.
Aber das ist ein anderes Thema...
Aber mal im ernst: 20 MB ist eigentlich nicht wirklich viel. Deswegen sollte der Server eigentlich nicht abstürzen.
Wenn man nur 128 MB hat schon :(
Als Tipp evt.: Neuste PHP Version installiert?
PHP Version 5.2.0-8+etch13 sollte ok sein, oder? Ist aber auch schon 2 Jahre alt.
Habe einen VServer mit vorinstallierter LAMP Umgebung, sehr wenig Erfahrung mit Server-Administration und anscheinend einen ISP (greatnet), der seine Server schlecht konfiguriert (z.B. hatte MySQL 100 MB von den 128 MB zugewiesen bekommen) und unerfahrene Kunden so in den kostenpflichtigen Support treiben möchte...
Mahlzeit,
Wenn man nur 128 MB hat schon :(
Wechsel schnell den Anbieter. Das reicht ja nichtmal für ne kleine statische Seite, schon gar nicht für was dynamisches.
Wunderst du dich auch, dass dein Auto nur 100 Meter fährt, wenn du nur nen Fingerhut sprit einfüllst?
PHP Version 5.2.0-8+etch13 sollte ok sein, oder? Ist aber auch schon 2 Jahre alt.
Du kannst dir ja ne neue Version kompilieren, dürfte aber mit 128MB RAM länger dauern.
sehr wenig Erfahrung mit Server-Administration
Wieso nimmst du dir dann nicht einen Server, der für dich administriert wird?
Entweder brauchst du einen vServer, dann eigne dir das nötige Wissen an oder bezahle jemanden für die Arbeit, oder du brauchst den nicht, dann nimm dir Webspace und du hast das Problem nicht mehr.
Wer keine AHnung hat, soll keinen Server betreiben, da er Hackern etc. eine Waffe zur Verfügung stellt. Wenn auch huier eine ziemlich mickrige mit den 128MB
Wechsel schnell den Anbieter. Das reicht ja nichtmal für ne kleine statische Seite, schon gar nicht für was dynamisches.
Wunderst du dich auch, dass dein Auto nur 100 Meter fährt, wenn du nur nen Fingerhut sprit einfüllst?
Bisher hatte ich ein Hosting-Paket, auf dem die Seite wunderbar lief. Doch ich habe wohl recht hohe Serverlast erzeugt und andere Hosting-Pakete beeinträchtigt, denn der ISP wollte mich nicht mehr. Da dachte ich, ein VServer ist die nächsthöhere Stufe... war ein Irrtum.
Wieso nimmst du dir dann nicht einen Server, der für dich administriert wird?
Teuer!
Entweder brauchst du einen vServer, dann eigne dir das nötige Wissen an oder bezahle jemanden für die Arbeit, oder du brauchst den nicht, dann nimm dir Webspace und du hast das Problem nicht mehr.
Ich eigne mir das nötige Wissen an. Und wenn mich Recherchen nicht weiterbringen, frage ich :)
Wer keine AHnung hat, soll keinen Server betreiben, da er Hackern etc. eine Waffe zur Verfügung stellt.
Da der ISP eine vorkonfigurierte LAMP Umgebung angeboten hat und ich nur wenige Einstellungen ändern möchte (nun ja mittlerweile sind es mehr als ich vorgehabt hatte), sah ich mich hier auf der sicheren Seite.
Mahlzeit,
Da der ISP eine vorkonfigurierte LAMP Umgebung angeboten hat und ich nur wenige Einstellungen ändern möchte (nun ja mittlerweile sind es mehr als ich vorgehabt hatte), sah ich mich hier auf der sicheren Seite.
Wenn du regelmässige Sicherheitsupdates als unnötig ansiehst (so lese ich deine Aussage hier, du willst nur wenig ändern), trifft genau das zu, was ich geschrieben habe.
Ein Server benötigt _regelmässige_ Wartung und eine Prüfung der Logfiles auf Unstimmigkeiten. Und wenn du dir das Wissen aneignen willst ist das sicher loebenswert aber in den 3-5 Jahren, bis du diesen Wissen erlangt hast, lebst du mit der Gefahr, dass dich dein Server viel Geld bis hin zu einer Gefängnisstrafe kostet, je nachdem, was jemand mit deinem Server anstellt. Wärst nicht der Erste, dessen Server zur Verbreitung von Filmen, Musik oder, noch schlimmer, Kinderpornografie verwendet wird.
Inwiefern du ein solches Risiko tragen willst, weiss ich nicht, das ist auch allein deine Entscheidung. Ich vermute aber, dir ist das Risiko, das du eingehst, gar nicht klar. Das zeigt schon, dass du dich auf deinen ISP verlässt, anstatt dein System grundlegend zu überprüfen.
Hello,
Aber mal im ernst: 20 MB ist eigentlich nicht wirklich viel. Deswegen sollte der Server eigentlich nicht abstürzen.
Wenn man nur 128 MB hat schon :(
Auch, wenn man 1G hat muss man noch aufpassen!
Ich habe die Schweinereien noch beseitigen müssen, als man nur ca. 720k (max) hatte im Client und vielleicht 4M im Server. Das war sehr spannend, ob man nun temporäre lokale Kopien der Filedescriptoren aufbaut, um Netzwerkverkehr zu sparen, oder es besser unterlässt und jeden Pups beim Server nachfragt.
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
echo $begrüßung;
Der meiste Speicherbedarf fällt am Skriptanfang an, dort, wo ich die ganzen Klassen inkludiere, z.B.
Tipp: Verwende __autoload(), dann werden nur die Klassen inkludiert, die wirklich benötigt werden.
echo "$verabschiedung $name";
Tipp: Verwende __autoload(), dann werden nur die Klassen inkludiert, die wirklich benötigt werden.
Stimmt schon, nur habe ich meinen Code auf ca 10 Klassen aufgeteilt, die ich bei einem Skriptdurchlauf meistens alle brauche - aber um 20% läßt sich der Speicherverbrauch damit sicher reduzieren...
Tipp: Verwende __autoload(), dann werden nur die Klassen inkludiert, die wirklich benötigt werden.
Stimmt schon, nur habe ich meinen Code auf ca 10 Klassen aufgeteilt, die ich bei einem Skriptdurchlauf meistens alle brauche - aber um 20% läßt sich der Speicherverbrauch damit sicher reduzieren...
Vermutlich lässt sich auch einiges an deinen Algorithmen optimieren (du weißt schon, 90% aller Fehler sitzen 60 cm vor dem Bildschirm ;)) - Dateien block-/zeilenweise lesen statt komplett, nicht mehr benötigte Variablen freigeben - hängt halt ab davon, was dein Skript eigentlich tut...
Den Umstieg zur prozeduralen Programmierung, den Tom empfiehlt, würde ich dabei eher als letzten Strohhalm vor (oder nach?) dem Nervenzusammenbruch sehen.
Christoph
Hello,
Den Umstieg zur prozeduralen Programmierung, den Tom empfiehlt, würde ich dabei eher als letzten Strohhalm vor (oder nach?) dem Nervenzusammenbruch sehen.
Ich habe den Umstieg nicht empfohlen. :-)
Das ist nur meine standadisierte Provokation gegen halbfertige Sachen. Die OOP, wie sie von PHP angewendet wird, ist nicht zuende gedacht, bzw. bekommt man sie inzwischen vermutlich gegen Geld? Da mag ich die Zends jetzt nicht anschießen, denn das käufliche Mammutpaket kenne ich nicht wirklich.
Aber das, was man kostenlos nutzen darf, ist eben nur modellhaft und nicht für den wirklich Einsatz fertig gebaut.
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
Hello,
Tipp: Verwende __autoload(), dann werden nur die Klassen inkludiert, die wirklich benötigt werden.
Wäre es nicht sinnvoll, sich dann bei wichtigen Klassen wirklich mal über eine Kompilation Gedanken zu machen und die dann als Shared Object einzubinden? Das müsste doch auch nach Gebrauch wieder freigegeben werden können, bzw. wird ohne hin von allen Prozesse gemeinsam genutgzt. Dann wäre schon mal der Definitions-Overhead weg.
Dass die jeweilige Instanz dann immer noch ihre eigenen Clones von diversen Teilen der Klassen benötigt, wird man allerdings nicht beseitigen können.
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg