Einige ideen um die Serverlast der engine zu mindern
Verfasst: 14. Dez 2008, 17:59
Hallo,
ich bin seid kurzem Freewarspieler und habe auch vorher schon immer ma wieder zugeschaut( ein Kumpel von mir ist seid 2 Jahren aktiv)
Auf dem Wiki und so steht überall, das freewar aufgrund der engine ziemlich beschränkt ist, da diese scheinbar ziemlich CPU zieht und es deswegen auch bei eigentlich geringen Spielerzahlen ( 30 -200 ) schon lag gibt.
Ich hätte hier meinen Senf aus jetzt fast 7 Jahren codeerfahrung, wie man das ganze etwas schneller laufen lassen könnte ( geht direkt an sotrax):
Ich weiss natürlich nicht, wie freewar programmiert ist, daher werden einige von den sachen sicher schon gemacht worden sein:
1) PHP-Caching aktivieren:
Dies redutziert die compilezeit von PHP ohne änderungen am Code:
Sollte eigentlich schon an sein, wenn nicht, geht das einfach und die meisten cacher kosten nichts:
z.B. währen da:
http://www.php-accelerator.co.uk/
http://pecl.php.net/package/APC ( APC, nimmt die Wikipedia)
http://eaccelerator.net/ ( wie der TurkMMCache. hatte ich selber und war sehr zufrieden, mein jetziger serverop hat aber überall Xcache installiert)
http://xcache.lighttpd.net/
Diese können PHP selbst um einige hundert prozent schneller machen.
2) Persistene Datenbankverbindungen.
Sollten eigentlich auch schon da sein. Machen das ganze auch noch mal schneller
3) wichtig für browsergames: (HIER IST das wichtigste)
http://www.danga.com/memcached/
Das ist ein system mit dem ihr datenbankabfragen und auch andere daten "cachen" könnt.
Daten aus diesem cache zu holen und zu speichern ist um vieles schneller als eine Datenbank, da sowohl alle daten im arbeitsspeicher vorgehalten werden, als auch keine komplexen SQL-Features implementiert sein müssen) .
Zum einen könnt ihr im memcached, wie auch auf der seite empfohlen, häufige Datenbankabfragen zwischenspeichern (z.B. "Welche Items hat spieler xy").
Ein Weg währe z.B. die items, stats und ähnliches aller spieler, die online sind, im memcached abzulegen und alle paar minuten (z.B. wenn die serverlast gerade niedrig ist: cron oder ähnliches) die daten aller spieler in eine persistente( also MySQL) datenbank abzuspeichern. Dabei könnten dann auch die Daten aller inaktiven und ausgeloggten Spieler aus dem memcached entfernt werden, damit dieser klein und effizient bleibt. Wenn ein neuer spieler einloggt ist er noch nicht im memcache vorhanden und wird aus der Datenbank nachgeladen. Deswegen gibt es sehr viel weniger datenbankabfragen( < 1% normalerweise, da ja alles schon im speicher des memcacheds abgespeichtert ist) und somit weniger Festplatten/ prozessoraktivität -> Die engine läuft schneller und kann mehr anfragen / sekunde bearbeiten.
Zum anderen müssen ja nicht alle informationen permanent im memcached abgespeichert werden -> zum beispiel ob ein gewisser NPC gespawnt ist muss ja nicht zwingend in der Datenbank stehen. Solche dinge können auch einfach nur im memcached geschrieben werden-> nach einem kompletten serverausfall sind dann eben alle NPCs wieder mit vollen HP auf der startposition . Ähnlich verhält sich der Cache und sogar items die nur rumliegen....
4) generelles auslagern periodischer aufgaben in cronjobs.
Wie oben bereits angedeutet können mit dem Linux / UNIX (oder wenn ihr das habt auch Windows-portierbarem) Cron-System aufgaben periodisch durchgeführt werden , zum beispiel das respawnen von monstern. Anstelle in jeder clientanfrage zu prüfen, ob ein monster respawnt werden muss, ob sich ein monster bewegt oder ähnlcihes, könnte dieser PHP code auch einfach in einem anderen script abgelegt werden, dass das z.B. alle 30 sekunden oder noch häufiger von cron ausgeführt wird.
Somit "laggen" client nicht, wenn ihre anfrage eben auch mal die Monster-KI oder einige respawns erledigen muss.
5) Chat optional in Flash implementieren.
Der chat momentan ist durch ein häufig aktualisiertes javascript/HTML mit PHP implementiert -> das ist langsam und setzt dem server großer last aus. Fast alle clients haben heutzutage flash also könnte man bei allen, die Flash haben, ein einfaches Flash script schreiben, dass den Chat anbietet (Flash kann dinge wie chat sehr viel schneller implementieren als Javascript, z.B. durch flash-HTTP-data connections). Dies sieht dann genauso aus wie jetzt, nur hat der server weniger arbeit.
Alle clients die kein Flash-Plugin haben sehen weiterhin das gewohnte Interface und vllt eine Notiz, dass sie Freewar die arbeit leichter machenund weniger lag haben, wenn sie flash installieren( selbiges gilt für leute hinter Proxies, o ä. die so konfiguriert sind, dass Flash- daten nicht durchkönnen).
So ich hoffe diese paar dinge helfen euch irgendwie - Solltet ihr hilfe beim coden oder so brauchen bin ich immer wieder hier aktiv oder unter meinem namen auf ActionFreewar zu erreichen...
Edit: nehmt dies nicht als beleidigung- es ist eher ein gut gemeinter Rat, damit FW noch schneller laufen kann. Euer spiel ist echt cool, vor allem wenn man betrachtet, dass ihr sogut wie keine resourcen habt( im Vergleich zu z.B. ogame)
ich bin seid kurzem Freewarspieler und habe auch vorher schon immer ma wieder zugeschaut( ein Kumpel von mir ist seid 2 Jahren aktiv)
Auf dem Wiki und so steht überall, das freewar aufgrund der engine ziemlich beschränkt ist, da diese scheinbar ziemlich CPU zieht und es deswegen auch bei eigentlich geringen Spielerzahlen ( 30 -200 ) schon lag gibt.
Ich hätte hier meinen Senf aus jetzt fast 7 Jahren codeerfahrung, wie man das ganze etwas schneller laufen lassen könnte ( geht direkt an sotrax):
Ich weiss natürlich nicht, wie freewar programmiert ist, daher werden einige von den sachen sicher schon gemacht worden sein:
1) PHP-Caching aktivieren:
Dies redutziert die compilezeit von PHP ohne änderungen am Code:
Sollte eigentlich schon an sein, wenn nicht, geht das einfach und die meisten cacher kosten nichts:
z.B. währen da:
http://www.php-accelerator.co.uk/
http://pecl.php.net/package/APC ( APC, nimmt die Wikipedia)
http://eaccelerator.net/ ( wie der TurkMMCache. hatte ich selber und war sehr zufrieden, mein jetziger serverop hat aber überall Xcache installiert)
http://xcache.lighttpd.net/
Diese können PHP selbst um einige hundert prozent schneller machen.
2) Persistene Datenbankverbindungen.
Sollten eigentlich auch schon da sein. Machen das ganze auch noch mal schneller
3) wichtig für browsergames: (HIER IST das wichtigste)
http://www.danga.com/memcached/
Das ist ein system mit dem ihr datenbankabfragen und auch andere daten "cachen" könnt.
Daten aus diesem cache zu holen und zu speichern ist um vieles schneller als eine Datenbank, da sowohl alle daten im arbeitsspeicher vorgehalten werden, als auch keine komplexen SQL-Features implementiert sein müssen) .
Zum einen könnt ihr im memcached, wie auch auf der seite empfohlen, häufige Datenbankabfragen zwischenspeichern (z.B. "Welche Items hat spieler xy").
Ein Weg währe z.B. die items, stats und ähnliches aller spieler, die online sind, im memcached abzulegen und alle paar minuten (z.B. wenn die serverlast gerade niedrig ist: cron oder ähnliches) die daten aller spieler in eine persistente( also MySQL) datenbank abzuspeichern. Dabei könnten dann auch die Daten aller inaktiven und ausgeloggten Spieler aus dem memcached entfernt werden, damit dieser klein und effizient bleibt. Wenn ein neuer spieler einloggt ist er noch nicht im memcache vorhanden und wird aus der Datenbank nachgeladen. Deswegen gibt es sehr viel weniger datenbankabfragen( < 1% normalerweise, da ja alles schon im speicher des memcacheds abgespeichtert ist) und somit weniger Festplatten/ prozessoraktivität -> Die engine läuft schneller und kann mehr anfragen / sekunde bearbeiten.
Zum anderen müssen ja nicht alle informationen permanent im memcached abgespeichert werden -> zum beispiel ob ein gewisser NPC gespawnt ist muss ja nicht zwingend in der Datenbank stehen. Solche dinge können auch einfach nur im memcached geschrieben werden-> nach einem kompletten serverausfall sind dann eben alle NPCs wieder mit vollen HP auf der startposition . Ähnlich verhält sich der Cache und sogar items die nur rumliegen....
4) generelles auslagern periodischer aufgaben in cronjobs.
Wie oben bereits angedeutet können mit dem Linux / UNIX (oder wenn ihr das habt auch Windows-portierbarem) Cron-System aufgaben periodisch durchgeführt werden , zum beispiel das respawnen von monstern. Anstelle in jeder clientanfrage zu prüfen, ob ein monster respawnt werden muss, ob sich ein monster bewegt oder ähnlcihes, könnte dieser PHP code auch einfach in einem anderen script abgelegt werden, dass das z.B. alle 30 sekunden oder noch häufiger von cron ausgeführt wird.
Somit "laggen" client nicht, wenn ihre anfrage eben auch mal die Monster-KI oder einige respawns erledigen muss.
5) Chat optional in Flash implementieren.
Der chat momentan ist durch ein häufig aktualisiertes javascript/HTML mit PHP implementiert -> das ist langsam und setzt dem server großer last aus. Fast alle clients haben heutzutage flash also könnte man bei allen, die Flash haben, ein einfaches Flash script schreiben, dass den Chat anbietet (Flash kann dinge wie chat sehr viel schneller implementieren als Javascript, z.B. durch flash-HTTP-data connections). Dies sieht dann genauso aus wie jetzt, nur hat der server weniger arbeit.
Alle clients die kein Flash-Plugin haben sehen weiterhin das gewohnte Interface und vllt eine Notiz, dass sie Freewar die arbeit leichter machenund weniger lag haben, wenn sie flash installieren( selbiges gilt für leute hinter Proxies, o ä. die so konfiguriert sind, dass Flash- daten nicht durchkönnen).
So ich hoffe diese paar dinge helfen euch irgendwie - Solltet ihr hilfe beim coden oder so brauchen bin ich immer wieder hier aktiv oder unter meinem namen auf ActionFreewar zu erreichen...
Edit: nehmt dies nicht als beleidigung- es ist eher ein gut gemeinter Rat, damit FW noch schneller laufen kann. Euer spiel ist echt cool, vor allem wenn man betrachtet, dass ihr sogut wie keine resourcen habt( im Vergleich zu z.B. ogame)