Morgen zusammen,
Ich hab da ein Problem eine Herausforderung an der ich Euch gern teilhaben lassen würde.
Eines meiner Freizeitprojekte hat vor wenigen Tagen eine Erweiterung erfahren.
Dabei stosse ich, langsam aber sich, an die Grenzen meiner Serverkapazität und erst Recht meines KnowHows.
Ausgangslage:
Seit einigen Tagen habe ich ein Tracking für Team-Fortress 2 Gameserver am Laufen.
Bei den bisherigen Games konnte alles innerhalb des Skriptes abgehandelt werden
(UPD-Packet an Gameserver senden, auf Antwort warten, parsen. Das wurde so realisiert, dass die Aufrufe nicht blockierend sind)
Nun ist bei TF2 das Query Format etwas komplizierter.
UDP-Challenge Request -> Antwort -> UDP Info Request (mit Challenge-Daten) -> UDP Player Request (mit Challenge Daten) -> parsen.
Da ich das ganze nicht non-blocking verwirklichen konnte, habe ich dies in ein extra Skript ausgelagert, und eine Query-Klasse (dieser sehr ähnlich: https://github.com/xPaw/PHP-Source-Query-Class )
herangezogen. Dieses Skript erzeugt ein Array mit allen Informationen eines Gameservers und gibt diese serialisiert aus (echo)
Die Server sollen regelmässig abgefragt werden. Innerhalb des Hauptskriptes wird durch die Serverliste iteriert und das extra-Skript mittels eines Konstrukts wie "exec (php SCRIPT > TmpFileAufRAMFS)" aufgerufen.
Sobald die entsprechende PID nicht mehr vorhanden ist (sprich: Das Query-Skript hat seine Arbeit getan und die Ausgabe in dem entsprechenden TmpFile [serverspezifisch] gespeichert), wird die Datei vom Hauptskript wieder eingelesen, geparst und die Daten in der Mysql Datenbank gespeichert. Das ganze läuft somit asynchron, nicht blockierend.
Herausforderung:
Momentan schaffe ich es, etwa 1200 Server pro Scanrunde (60s) abzuscannen.
Diesen Count möchte ich "etwas" nach Oben bringen (Ziel: >2000).
Nun habe ich mich etwas "schlau" gemacht, und bin auf die Idee gekommen (keine Ahnung ob diese gut ist) dieses externe Skript mittels pre-Compiling zu beschleunigen.
Allerdings bin ich, was dieses angeht, absolut und 100%ig unbedarft, hab noch nie damit gearbeitet.
Hat jemand von Euch irgendwelche Tipps wie ich eine solche Ausführung tunen kann, prinzipiell bin ich zu allen Schandtaten bereit.
Vielleicht noch etwas Info:
Der Server läuft auf Debian 6, php in Version PHP 5.3.3-7 , als CLI. Ein Update auf php >= 5.4 fällt leider flach, da die ganze Seite einige tausend Funktionsaufrufe mit Call-time pass-by-reference hat.
Ich bin Euch für jeden Tipp dankbar.
Ich hab da ein Problem eine Herausforderung an der ich Euch gern teilhaben lassen würde.
Eines meiner Freizeitprojekte hat vor wenigen Tagen eine Erweiterung erfahren.
Dabei stosse ich, langsam aber sich, an die Grenzen meiner Serverkapazität und erst Recht meines KnowHows.
Ausgangslage:
Seit einigen Tagen habe ich ein Tracking für Team-Fortress 2 Gameserver am Laufen.
Bei den bisherigen Games konnte alles innerhalb des Skriptes abgehandelt werden
(UPD-Packet an Gameserver senden, auf Antwort warten, parsen. Das wurde so realisiert, dass die Aufrufe nicht blockierend sind)
Nun ist bei TF2 das Query Format etwas komplizierter.
UDP-Challenge Request -> Antwort -> UDP Info Request (mit Challenge-Daten) -> UDP Player Request (mit Challenge Daten) -> parsen.
Da ich das ganze nicht non-blocking verwirklichen konnte, habe ich dies in ein extra Skript ausgelagert, und eine Query-Klasse (dieser sehr ähnlich: https://github.com/xPaw/PHP-Source-Query-Class )
herangezogen. Dieses Skript erzeugt ein Array mit allen Informationen eines Gameservers und gibt diese serialisiert aus (echo)
Die Server sollen regelmässig abgefragt werden. Innerhalb des Hauptskriptes wird durch die Serverliste iteriert und das extra-Skript mittels eines Konstrukts wie "exec (php SCRIPT > TmpFileAufRAMFS)" aufgerufen.
Sobald die entsprechende PID nicht mehr vorhanden ist (sprich: Das Query-Skript hat seine Arbeit getan und die Ausgabe in dem entsprechenden TmpFile [serverspezifisch] gespeichert), wird die Datei vom Hauptskript wieder eingelesen, geparst und die Daten in der Mysql Datenbank gespeichert. Das ganze läuft somit asynchron, nicht blockierend.
Herausforderung:
Momentan schaffe ich es, etwa 1200 Server pro Scanrunde (60s) abzuscannen.
Diesen Count möchte ich "etwas" nach Oben bringen (Ziel: >2000).
Nun habe ich mich etwas "schlau" gemacht, und bin auf die Idee gekommen (keine Ahnung ob diese gut ist) dieses externe Skript mittels pre-Compiling zu beschleunigen.
Allerdings bin ich, was dieses angeht, absolut und 100%ig unbedarft, hab noch nie damit gearbeitet.
Hat jemand von Euch irgendwelche Tipps wie ich eine solche Ausführung tunen kann, prinzipiell bin ich zu allen Schandtaten bereit.
Vielleicht noch etwas Info:
Der Server läuft auf Debian 6, php in Version PHP 5.3.3-7 , als CLI. Ein Update auf php >= 5.4 fällt leider flach, da die ganze Seite einige tausend Funktionsaufrufe mit Call-time pass-by-reference hat.
Ich bin Euch für jeden Tipp dankbar.