mmofacts.com

Deamon schreiben?

gepostet vor 17 Jahre, 2 Monate von Dexus
Hallo!
Also da ich kein C/C++ kann brauche ich mal eure Hilfe!
Also ich habe mehrere Kampfscripte (folgent KS) in PHP geschrieben.
Dazu ein Shell Script das jede Sekunde das KS ausführt.
Da dieser Script jedoch sehr Server lastig ist, wollte ich wissen ob es auch möglich ist einen Deamon zu schreiben der halt nicht 50% des Systems auslastet.
Aktuell sind mein "Ausführ Script" so aus:
#!/bin/bash

cd /var/www/web4/html/KampfScript/s7
echo "Restart Script",
killall start.sh && echo "gekillt";
./start.sh >/dev/null 2>&1 &
sleep 1;
echo "fertig";
Der Code wird jede Minute vom CronJob ausgeführt.
der dann diesen Code ausführt:
#!/bin/sh

while true; do
/usr/bin/php ks.php
sleep 1;
done;
Könnte mir jemand das als Daemon umsetzen, das ich einen ruhigeren Ablauf habe?
Dabei sollte es auch möglich sein, mehrere Scripte (KS) gleich Zeitig starten zu können.
Ich würde mich über eure Hilfe freuen.
gepostet vor 17 Jahre, 2 Monate von COrthbandt
Die Restart-Logik nach C/C++ zu verlegen wird Dein Problem nicht lösen.
Wenn Dein KS 50% CPU-Last verursacht heisst das in diesem Kontext:
1. Dein KS rechnet für ca. 1 Sekunde
2. Dein KS läuft gar nicht ein mal pro Sekunde, sondern nur ca. alle 2 Sekunden
Das zweite Problem wäre zu lösen, indem Du den PHP-Task parallel startest (mit & am Ende).
Allerdings wird damit die CPU-Last noch weiter steigen.
Für das eigentliche (1.) Problem sehe ich zwei Möglichkeiten:
1. Tatsächlich das KS in C/C++ nachbauen (Haufen Arbeit)
2. PHP beschleunigen
So wie Du da PHP aufrufst wird jedes mal das ganze Script neu geparst, mit allen imports. Das kostet u.U. mehr als das eigentliche Processing. Bevor Du versuchst, dieses Problem mit der C-Keule zu erschlagen würde ich empfehlen einen PHP-Accelerator einzusetzen.
Zusätzlich wäre es noch denkbar, das PHP-Script die ganze Zeit laufen zu lassen und die KS-Verarbeitung von aussen oder per Timer zu triggern. Dann sparst Du Dir auf jeden Fall den Overhead für Parsing, DB öffnen usw. Das kann eine Menge ausmachen.
gepostet vor 17 Jahre, 2 Monate von Dexus
Problem ist ich habe IonCube, das würde das Script schon mal schneller machen habe ich auch schon getestet.
Jedoch ein Dauerhaftes Laufen lassen von PHP, ist das überhaupt möglich? Wie mache ich das, wenn ich Änderungen habe damit das Script auch mal Stirbt?
Im Augenblick habe ich wegen diesen Problem voll den BlackOut, sitze da schon 4 tage dran. Wenn ich 2 Scripts nach dem oben genannten Muster alufen lassen (für jedes Script einzeln) habe ich eine Server Auslastung von bis zu 900% laut WBB (Admin Interface).
Edit:
Das PHP Script ist eigentlich nicht der Auslöser der 50% Server last
0.1592559814450 Ausführ zeit für 86 Abfragen, Updates usw. sprich das gesamte PHP Script.
gepostet vor 17 Jahre, 2 Monate von None
Wuerde mal einen Geschwindkeitstest fuer dein Script machen. Lass es mal einen Tag alle paar Minuten laufen und schreib die Laenge jedesmal (mit Datum versteht sich) in ein Logfile.
Nun solltest du sehen wie deine Laufzeit so aussieht in der Praxis. Danach kannst du entscheiden wie du vorgehst. Bisher hast du ja keinerlei Daten - ein Wert aus einem Drittanbieter Webinterface zaehle ich nicht dazu. Du hast doch top, also warum auf solche - moeglicherweise falsche - Zusatzsoftware vertrauen?
Habe die Erfahrung gemacht, dass PHP in meinem Fall sogar langsamer als die bash war. Vielleicht spielst du mal ein wenig mit diversen Arten der Implementierung herum, da sieht man recht flott was das Richtige ist. Damit meine ich das Script selbst, nicht der Start des Scriptes. Jede Sekunde ein Polling zu machen ist eigentlich sehr unschoen
Du musst dir im Klaren sein, dass dieses Verfahren extrem viel Overhead hat und du Massen unnoetiger Rechenzeit verschwendest.
Minimum als Polling, waere ein Pruefen (Muss ich was tun?) als Polling und das Skript selbst nur bei anstehenden Aktionen zu starten.
gepostet vor 17 Jahre, 2 Monate von raufaser
Hallo Dexus,
ich kann dir sagen, wie ich es gemacht habe, da bei mir auch einige Dinge regelmäßig von PHP gemacht werden. Da sind z.B. das Auffüllen von Lebens- und Manapunkten (alle 60 Sekunden), Respawnen von Monstern (alle 180 Sekunden), Bewegen von Monstern ... etc pp.
Ich habe es so gemacht, dass diese Sachen in einem PHP Script mit Endlosschleife in einer screen Session laufen.
z.B.

while( 1 )
{
// Hier Aktionen durchführen
// Ausführung erst nach 60 Sekunden wiederholen
sleep( 60 );
}
?>
Gestartet wird das Script dann einfach auf der Console mit (Beispiel):

screen -d -n Resto -f "/usr/bin/php -f /pfad/zum/script.php"
Dadurch, dass das Script endlos in der Screen Session läuft kann man wunderbar mit einem OPCode Cache (ich empfehle eAccelerator) arbeiten, was sicherlich ein mehr an Performance bringen wird.
Ich habe mir dann dafür noch ein kleines Runlevel Control Script gemacht, so dass ich alle Screen Sessions leicht neustarten kann.
Ich hoffe das hilft dir irgendwie...
Gruß,
Marc
gepostet vor 17 Jahre, 2 Monate von Dexus
Danke! Ich werde es mal ausprobieren.
gepostet vor 17 Jahre, 2 Monate von Dexus
top - 17:42:03 up 95 days,  4:21,  2 users,  load average: 1.20, 0.90, 0.38
Tasks: 37 total, 2 running, 35 sleeping, 0 stopped, 0 zombie
Cpu(s): 12.6% us, 5.3% sy, 0.0% ni, 82.0% id, 0.0% wa, 0.0% hi, 0.0% si
Mem: 1310720k total, 325868k used, 984852k free, 0k buffers
Swap: 0k total, 0k used, 0k free, 0k cached

ist das so noch in Rahmen oder ist das schon überlastet?
das WBB Forum zeit 147% an
gepostet vor 17 Jahre, 2 Monate von raufaser
Die Werte sind nicht unbedingt aussagekräftig, wenn man nicht genau weiß, was hinter den Werten steht und vorallem wenn man nicht weiß, ob das nun Dauerzustand ist ohne Lastspitzen, oder ob es sich um eine Lastspitze handelt.
Ganz allgemein gesagt ist ein Load von 1,2 aber noch okay. Meiner Erfahrung nach beginnt es fühlbar zu werden (bei HTTP Requests) ab einem Load der höher als 5 ist (~2,5 GHz, ~1 Gig MEM, Apache). Aber auch das ist nur eine sehr allgemeine Aussage. Kommt auch auf den Dienst an, der beansprucht wird und so weiter...
Genauere Analysen könnte man nur mit ensprechenden Tools durchführen. Die einfachste Form der Analyse ist aber ein Cronjob jede Minute mit:
cat /proc/loadavg && date >>/var/log/loadavg
Da bekommt man dann einen ungefähren Eindruck, wann der Server welche Last hat.
Gruß,
Marc
gepostet vor 17 Jahre, 2 Monate von None
Original von raufaser
Ganz allgemein gesagt ist ein Load von 1,2 aber noch okay. Meiner Erfahrung nach beginnt es fühlbar zu werden (bei HTTP Requests) ab einem Load der höher als 5 ist (~2,5 GHz, ~1 Gig MEM, Apache).

Das ist ziemlich weit von der Wahrheit entfernt. In den Load spielt weder die Hz-Zahl noch die Grösse des RAMs mitrein.
Auch ist der Load keine Aussage über die CPU-Auslastung wie viele immer denken. Er ist eigentlich nur ein Schätzeisen und zeigt den derzeitigen Trend auf. Da geht es um Dinge wie laufende Prozesse, rechenintensivität der Prozesse und die Run Query. Letztere gibt an wie ausgelastet ein Rechner ist und lässt sich "erfühlen". Brauchst du kein uptime mehr um zu sehen, dass dein System ausgelastet ist, hast du ne hohe Run Query. Aber auch ne niedrige Query ist nicht wünschenswert.
Sehr lesenswert zu dem Thema ist das LinuxMagazin 08/07. Dort ist ein Beitrag von nem Forscher der San Jose State University über das Thema.
gepostet vor 17 Jahre, 2 Monate von Dexus
da sich php und mysql zusammen aktuell um die 97 % bewegen denke ich das ich nen anderen Server brauche. Vserver sind einfach Scheiße wie immer, wenn es um BG's geht...
gepostet vor 17 Jahre, 2 Monate von TheUndeadable
> da sich php und mysql zusammen aktuell um die 97 % bewegen denke ich das ich nen anderen Server brauche.
Ich denke eher, dass du ein konzeptionelles Problem hast.
Wieviel Spieler hast du momentan zu verwalten? 500 Spieler müssten auf einem VServer schaffbar sein.
gepostet vor 17 Jahre, 2 Monate von raufaser
Original von Samson
Auch ist der Load keine Aussage über die CPU-Auslastung wie viele immer denken. Er ist eigentlich nur ein Schätzeisen und zeigt den derzeitigen Trend auf.

Das hab ich ja auch nicht behauptet. Aber der Load ist ein brauchbarer Indikator, ob ein Server nun überlastet ist, oder nicht. Aber eben ein sehr individueller Wert. Und natürlich hat der Speicher auch was mit der Load zu tun. Wenn du zuwenig Speicher hast und deswegen der Swap bemüht werden muss, wirkt sich das auch auf den Load aus.
Im übrigen: Ich teile das, was TheUndeadable geschrieben hat.
Gruß,
Marc
gepostet vor 17 Jahre, 2 Monate von Dexus
also es waren auf 2 Servern zusammen gerade mal 30, da lagten die http requests schon.... ohne KS ging es wieder nach dem ich einen Totalen reset des Vserver machen musste.
gepostet vor 17 Jahre, 2 Monate von Dexus
Nach paar bearbeitungen sieht alles gelich viel besser aus
Serverlast 0
gepostet vor 17 Jahre, 2 Monate von raufaser
Vergessen den Prozess zu starten? ;-)
*scnr*
Marc
PS: Aber ist natürlich gut, dass du es nun hinbekommen hast.
gepostet vor 17 Jahre, 2 Monate von None
Original von raufaser
Wenn du zuwenig Speicher hast und deswegen der Swap bemüht werden muss, wirkt sich das auch auf den Load aus.

Sicher, aber nur indirekt weil bei Datenstroemen auf die Platte die CPU mitspielt. Swapst du ein paar Kilobyte, ist das kaum merklich im load. Uberigens: mit den neuen Kernelfunktionen gehen Daten vom RAM in die Netzwerkkarte nun ohne Nutzung des Prozessors, dass spart Load.
Es geht beim Load nur um Prozesse und deren Stati, ob dein Speicher voll ist oder nicht spielt keinerlei Rolle. So steht es in timer.c und der Kernel-Doku...
gepostet vor 17 Jahre, 2 Monate von Klaus
Ich las mal als Zusammenfassung des "Load": Umso länger die Prozesse auf Ausführung warten müssen (und da kommen ja viele flaschenhälse in Frage), desto höher die Belastung.
gepostet vor 17 Jahre, 2 Monate von TheUndeadable
Korrekt wäre: Je mehr.
gepostet vor 17 Jahre, 2 Monate von Nuky
"Dadurch, dass das Script endlos in der Screen Session läuft kann man wunderbar mit einem OPCode Cache (ich empfehle eAccelerator) arbeiten, was sicherlich ein mehr an Performance bringen wird."
äääh? Die Opcode - Optimierung bringt den minimalsten Geschwindigkeitsvorteil. Der Vorteil eröffnet sich erst beim häufigen starten.
gepostet vor 17 Jahre, 2 Monate von Dexus
Da ich eh kein OPCode nutzen kann durch IonCube, denke ich hat sich das erledigt, und System läuft nun 1 a aber ich danke euch allen für die Idee und Hilfen.
gepostet vor 17 Jahre, 2 Monate von raufaser
Original von Nuky
"Dadurch, dass das Script endlos in der Screen Session läuft kann man wunderbar mit einem OPCode Cache (ich empfehle eAccelerator) arbeiten, was sicherlich ein mehr an Performance bringen wird."
äääh? Die Opcode - Optimierung bringt den minimalsten Geschwindigkeitsvorteil. Der Vorteil eröffnet sich erst beim häufigen starten.

Stimmt, hab bullshit erzählt... ich habe sogar für die PHP Scripte in den Screen Sessions den Cache extra ausgeschaltet und eine extra php.ini angelegt...
Zur Zeit bin ich ein wenig durch den Wind... auf der Arbeit den ganzen Tag Coden, dann Abends am Spiel coden... das gibt doch nur Gehirnmatsch.
Erstmal ne Runde CS zocken heute Abend!
Marc
gepostet vor 17 Jahre, 2 Monate von Tesla2k
Original von raufaser

while( 1 )
{
// Hier Aktionen durchführen
// Ausführung erst nach 60 Sekunden wiederholen
sleep( 60 );
}
?>

Bei der Methode gibt es aber doch ein Problem. Die Aktion wird nicht alle 60 Sekunden sondern alle 60+Bearbeitungszeit Sekundne ausgeführt und das addiert sich dabei auch noch immer weiter auf. Das bedeuted, dass sich der Ausführungzeitpunkt immer weiter nachhinten verschiebt.
Ich denke eine Lösung könnte sein, dass man immer von der aktuellen Zeit ausgehend ausrechnet wann das script wieder laufen soll.
gepostet vor 17 Jahre, 2 Monate von raufaser
Ja, da hast du natürlich Recht, kommt aber auch auf das Spiel an: Bei mir ist nur wichtig, dass es "ungefähr" alle 60 Sekunden einmal tickt. Feiner wäre es natürlich, mit Zeitgrenzen zu arbeiten, was ja auch programmiertechnisch kein Problem ist.
Gruß,
Marc

Auf diese Diskussion antworten