IIS7 mit viel Besucherverkehr

cgde

New Member
Hallo.

Ich weiß nicht recht ob ich mit meiner Frage hier richtig bin.
Allerdings habe ich auch Schwierigkeiten zu meiner Frage antworten zu finden.

Folgendes:

Ich betreibe eine im Moment stark wachsende Community.
Mit der Anzahl der live Besucher geht mein Server mehr oder minder in die Knie.
Die vielen Requests kann der Server nicht mehr schnell genug verarbeiten und der Seitenaufruf dauert enorm lang.
Ich bin im Besitz 2 Windows 2008 Server auf denen IIS7 installiert ist.

Nun habe ich von Reverse Proxys gelesen und stelle aufgrund der vielen Aussagen fest, das diese Methode die vielen Anfragen gut verarbeiten kann.
Welche Möglichkeiten und vor allem "wie" benutze ich einen solchen Proxy mit dem IIS?

Oder welche andere professionelle Methoden gibt es um dem Besucherverkehr gerecht zu werden?
Ich brauche dringend mehr Performance auf meinem Server und ich weiß noch nicht wie ich das umsetzen soll/kann.
Aber es muss doch möglich sein mehrere tausend Besucher gleichzeitig bedienen zu können, ohne das man starke Leistungseinbußen hat?!

Ich hoffe ein paar brauchbare antworten zu bekommen.

Vielen Dank schon einmal
 
Ich nehme an dass nicht IIS das Hauptproblem darstellt.
Bevor irgendwelche Vermutungen oder Tools ausgetestet werden solltest du zuallererst mal den Ressourcensünder suchen. Dies kann Festplattenbelastung, Netzbelastung, ... sein. Welches Programm oder Skript ist dafür verantwortlich und kann man das optimieren?

Reverse Proxies helfen nicht gegen die Last, sondern schützen höchstens alleinstehend gegen ein paar kleine (D)DoS-Angriffe wie Slowloris.
Die Installation erfolgt indem du den Port von IIS verlegst und nach aussen sperrst, den Reverse-Proxy auf dem Standard-Port konfigurierst und den "Ausgang" des RP mit IIS verbindest.

Du meinst vermutlich reverse caching proxies, wie zB Varnish. Davon abgesehen dass ich keine kenne die unter Windows halbwegs tauglich sind, benötigen diese oft ausser langwieriger Konfiguration auch Programme welche in der Lage sind diese du verwenden - sonst bringt er entweder ausser Ressourcenverschwendung nichts oder dynamische Inhalte bekommen Probleme. Kluge caching Proxies welche Änderungen erkennen sind sehr selten, ich konnte keinen finden der was taugte und musste meinen eigenen entwickeln.

Aber es muss doch möglich sein mehrere tausend Besucher gleichzeitig bedienen zu können, ohne das man starke Leistungseinbußen hat?!
Das hängt davon ab was die Besucher machenund wieviele concurrent connections es sind. Auf einer Machine messe ich bis zu 5 Millionen gemischte Requests am Tag bei mässiger Systembelastung (i7 2. Generation, 16GB RAM, Datenbanksystem auf SSD), andere Machinen wo ich verwaltet habe sind aufgrund der Art der darauf laufenden Programme bei paar hundert tausend Anfragen am Tag in die Knie gegangen.
 
Nun ja, der übeltäter ist eigentlich erkannt.
das hauptproblem stellen hier mysql und php dar.
wobei mysql auf 70% auslastung geht.

meine scripte habe ich weitestgehenst optimiert und lagere größere abfragen bereits schon in sessions aus um datenbankqueries einzusparen.

allerdings betreibe ich auch einen chat in php der sehr viele anfragen an den mysql sendet welches hier mit das hauptproblem darstellt.

vielleicht kannst du mir behilflich sein?!

ich bin für brauchbare hilfe gerne bereit auch etwas zu investieren, weil ich finde nichts nützliches wie ich vorgehen kann.
denn mysql hab ich meineswissen auch bereits schon mehrfacht versucht zu optimieren.

edit: im moment geht der server in die knie wenn ich noch nicht mal 90 besucher im chat habe.
das sind rund 130 besucher auf der gesamten plattform.
 
Last edited by a moderator:
Dann wäre es evtl. sinnvoll den Chat auf das XMPP (Jabber) Protokoll umzubauen, dann wird sich der Server langweilen.
 
Ich würde auch einen IRC server empfehlen (am besten auf einem Mini-vServer), der kann mehrere tausend Clients ab, ohne das es den Server irgendwie stören würde.
Für Inspircd gäbe es auch ein MYSQL Modul für den Auth.
 
Ich würde auch einen IRC server empfehlen (am besten auf einem Mini-vServer), der kann mehrere tausend Clients ab
Daa musste aufpassen dass der vServer (meist OpenVZ) genug Sockets zulässt.

allerdings betreibe ich auch einen chat in php der sehr viele anfragen an den mysql sendet welches hier mit das hauptproblem darstellt.
Es gab ja schon mehrere Alternativvorschläge. PHP und Mysql sind eigentlich die schlechteste mögliche Kombination für Chats. So etwas sollte man eigentlich immer in Application server realisieren. Entweder du verwendest ein bestehendes Protokoll oder du setzt zB auf Node.JS mit Socket.IO um recht unkompliziert einen Chat aus dem Bodem zu stampfen
 
danke für die vielen vorschläge.
das würde ja bedeuten, das ich sämtliche bislang vorgenommenen programmierungen inklusive gestaltungsarbeiten niederschmeißen müsste und auf einen fertig programmierten clienten angewiesen bin.
das könnten ja demnach dann applets oder sonstwas sein?!

jetzt hab ich mir gerade mal die jabber website angesehn.
aber das prinzip verstehe ich da immernoch nicht ganz.
das würde bei diesem jabber dingens bedeuten, das meine besucher
auf einen fremden account angewiesen sind?
so hatte ich mir das eigentlich nicht gedacht.
ich möchte 100% unabhängig von anderen betreibern sein.

wenn ich mit irc einen chat öffne bin ich doch ebenfalls wieder an die designklopper gebunden.

ich brauche eine lösung mit der ich absolut unabhängig bin und auch noch eigene modifikationen hinzufügen kann. gestaltung, youtube integrieren, bilder posten, avatare die z.b. nur von der website aus gesteuert werden, weil sie die user diese mit virtuellen moneten usw verdienen müssen. uvm. bislang war mir das nur mit php und js möglich.

gibt denn nicht die möglichkeit php mit etwas anderem kommunizieren zu lassen? zumindest den reinen chat textflussbetrieb?!
dann müsste ich doch auf design und features nicht verichten?!

wobei es hier interessant wird:
Entweder du verwendest ein bestehendes Protokoll oder du setzt zB auf Node.JS mit Socket.IO um recht unkompliziert einen Chat aus dem Bodem zu stampfen
ich denke das ist das, was du meinst, damit ich die alte variante weiter nutzen kann.
das wäre dann auch in meinem sinne. aber dabei brauch ich dann wohl doch etwas mehr hilfe
 
Last edited by a moderator:
niederschmeißen müsste und auf einen fertig programmierten clienten angewiesen bin.
Keineswegs. Auf Clientseite muss sich nicht mal was ändern wenn dein Programm die "sauberen" Programmierregeln befolgt und eine Abstraktionsschicht oder Templating verwendet.
In dem Sinne möchte ich auf best Practice für Netzbasierte Anwendungen hinweisen: http://api-first.com/

das würde bei diesem jabber dingens bedeuten, das meine besucher
auf einen fremden account angewiesen sind?
Jabber und IRC sind Protokolle, also standardisierte Methoden zur Authentifizierung, Kontaktknüpfung und Nachrichtenaustausch welche über eine Serverseite und eine Clientseite verfügt. (Nicht unbedingt notwendig; zB Skype ist grösstenteils P2P-basiert)
Die Serverseite wird NICHT von den Entwicklern von Jabber oder IRC zur Verfügung gestellt sondern muss selber betrieben werden.

Allerdings ist zu beachten dass webbasierte Clients in aller Regel nicht direkt mit Jabber oder IRC kommunizieren können. Websocket ist noch zu neu und unstandardisiert als dass man es wirklich verwenden könnte und Flash sowie Java-Applets sind beides vom Aussterben "bedrohte" Spezien - zumal auf neueren Client-Systemen wie Smart-TV's, Tablets, ...
Hier brauchst du dann zusätzlich noch eine Serverseite welche das ganze in ajax-taugliche HTTP-Requests (empfehlenswert Comet Long polling) "umwandelt". Aus Belastungsgründen sollte das ein Application server sein (also ein Programm das dauernd läuft und nicht wie bei PHP nur eine einzelne Anfrage beantwortet), ich schlage Node.JS dafür vor. Erweiterungen wie Socket.IO erlauben eine sehr flexible und bedarfsgerechte Kommunikation für Chats.
Natürlich kannst du den Chat auch direkt in Node.JS implementieren statt ihn nur als Proxy zu verwenden. Dann ist es aber nicht ohne weiteres möglich dass Besucher bsp. einen beliebigen Jabber-CLient auf dem Rechner verwenden um im Chat zu hängen.


gibt denn nicht die möglichkeit php mit etwas anderem kommunizieren zu lassen?
Lass PHP link liegen. Mit sehr viel Arbeit kannst du es performance-mässig stabilisieren, aber der Aufwand ist zumindest in diesem Stadium das Ergebnis nicht wert.

aber dabei brauch ich dann wohl doch etwas mehr hilfe
Lies dir die Beispiele auf socket.io durch. Ich nehme an du beherrscht zumindest rudimentär Javascript, somit solltest du in der Lage sein mit Node zu arbeiten.
 
Hat zwar überhaupt nichts mit dem Thema zu tun, aber könntest Du dir vielleicht mal angewöhnen, ein wenig auf Deine Rechtschreibung zu achten. Das macht das ganze etwas leserlicher. Danke :)
 
Nun ja, ich werde mir das mit dem Node krams einfach mal zu herzen führen und
Deine Tipps befolgen. Mit Javascript sollte ich so halbwegs umgehen können.
Klingt ja auch alles soweit einleuchtend.

Bist du denn bewandt mit diesem Thema und könnte ich tiefer in die Materie
eingreifen wobei Du mir evtl. dann helfen könntest falls ich irgendwo stocken bleiben sollte?

@Sbr.. wird gemacht ;)

Danke für die ausführlichen antworten.
 
Dann hab ich da nochmal eine bescheidene Frage:

Lassen sich Webcam und Voice Chat ebenfalls mit dem Socket.io betreiben?
Und wie siehts dann performancemäßig aus?

Ich wünsche ein frohes neues und erfolgreiches Jahr schonmal im voraus :)
 
Bist du denn bewandt mit diesem Thema und könnte ich tiefer in die Materie
eingreifen wobei Du mir evtl. dann helfen könntest falls ich irgendwo stocken bleiben sollte?
Im Thema Chats selber weniger, aber mit NodeJS und dem Datenaustausch über Socket.IO habe ich einige Erfahrung.

Lassen sich Webcam und Voice Chat ebenfalls mit dem Socket.io betreiben?
Socket.IO kann nur reine Datenstösse transportieren. Mindestens Chrome hat zwar in neueren Versionen eine API um AV-Verbindungen auf zu bauen (WebRTC) aber das ist halt nur einer von vielen Browsern.
Aber das Problem hattest du ja auch schon sicherlich vorher; wie hattest du es da realisiert? Externe AV-Server wie Red5 kannst du natürlich auch weiterhin einbinden.
Einfacher, aber nicht unbedingt billiger, wäre die Verwendung eines externen Anbieters
http://www.tokbox.com
Die haben sogar offizielle Beispiele für Node.JS Applicationen:
http://www.tokbox.com/blog/tag/node/
 
Ne, das mit dem Camstream ist noch Zukunftsmusik.
Mein Chat unterstützt das zwar, war nur eine generelle Frage ob das damit unterstützt wird.

Ich hab das mit dem Node.js mal überflogen und habs erstmal "noch" nicht verstanden. Mir mangelts da auch gerade etwas an Zeit.

Ich habe mir eben mal die MySQL Workbench installiert.
Die CPU Auslastung hierbei geht gerade mal auf max 22%.

Hier sind noch Angaben wie Query Cache Hit-Rate und Key Efficiency,
wobei beide Statistiken auf rund 98% laufen.

Ich habe die Befürchtung, das es einfach nur eine Fehlkonfiguration ist.

Ich meine in absehbarer Zukunft werd ich mich wohl so oder so mit den moderneren Techniken auseinandersetzen müssen, aber ich komme nicht drum herum jetzt sofort etwas zu tun ohne das ich mir jetzt eine neue Sprache oder Tools aneignen muss. Das kann ich machen, wenn ich mehr Ruhe im Hinterkopf habe. Die Mitglieder und Besucher gehen mir derzeit aus :(
Mit wachsendem Traffic wird die Seite extrem lahm.
Da muss doch auf die schnelle was zu machen sein?!

Ich meine, da sind gerademal 100 Leute gleichzeitig online. Das kann den doch noch garnicht so in die Knie zwingen :/
 
Ich meine, da sind gerademal 100 Leute gleichzeitig online. Das kann den doch noch garnicht so in die Knie zwingen
Mysql ist lahm. PHP ist lahm. IIS ist (halbwegs) lahm. Die Kombination ist ne Katastrophe, zumal wenn du auf Comet long polling oder (worst case) auf short polling setzt.
Damit jagst du hunderte bis tausende an Requests die Sekunde auf Mysql (was den schon komplett ans Limit fährt) und PHP kommt nicht besser über die Runde.

Die Mitglieder und Besucher gehen mir derzeit aus
Das ist der beste Zeitpunkt für Änderungen. Wenn deine Seite boomed hast du besseres zu tun.

Da muss doch auf die schnelle was zu machen sein?!
Mehr Server (Stichwort Mysql Read-Slaves), teure Admins für optimale Konfiguration, sofern deine Software es kann Caching.
So teuer wenn ein einziger Server mit einigen Umbauen zig tausende bis zehntausende Kunden schaffen würde.
Verklemm dich nicht jetzt schon in legacy software wenn du noch nicht mal richtig gestartet bist. Die Zukunft wird es dir danken.

Je nachdem wie deine Requests aufgebaut sind kannst du dir mysql-proxy mit Memcached-Plugin ansehen:
https://github.com/clofresh/mysql-proxy-cache
Da du aber bereits eine fast perfekte Cache-Hit Ratio hast wird das nicht sehr viel bringen; die ganze Leistung geht beim Cache-Mutex und dem Parsen vom SQL-Befehl drauf. Und natürlich auf PHP-seite.
Nebenbei; hast du einen Opcode Cache in PHP integriert?
 
Ja gut, nur bis ich das neue alles intus habe und damit umgehen kann, wars das mit den Besuchern :/

Nein, ich verwende keinen opcode cache, da ich diese mit IIS nicht installiert bekomme. Ich bekomme jedes mal ein internal Server Error 500 sobald ich versuche z.B. eaccelerator mit php zu starten.

Ich hätte noch einen zweiten Windows Server zur miete den ich auch ohne IIS sondern mit Apache installieren kann wenn das nötig ist.
Von Linux und co. hab ich allerdings garkeine Ahnung.
 
Linux-basierte Systeme (oder generell UNIX) wäre aber für solches Vorhaben angeraten. Meiner Meinung nach halten die viel mehr aus in diese Richtung und sind insgesamt konfigurierbarer.

Apache unter Windows ist performancemässig eine Katastrophe. IIS geht wenigstens noch.

Nein, ich verwende keinen opcode cache, da ich diese mit IIS nicht installiert bekomme.
Opcode Caches sind mehr oder weniger zwigend Pflicht wenn du so viele kleine Requests hast. Aber so ziemlich vieles wäre für einen halbwegs grossen Chat Pflicht was du nicht umsetzen willst oder kannst.
Wenn du mal auf der offiziellen Seite von IIS schauen würdest: http://www.iis.net/downloads/microsoft/wincache-extension

a gut, nur bis ich das neue alles intus habe und damit umgehen kann, wars das mit den Besuchern :/
Und wenn der Chat jedes mal zusammenbricht sobald paar Leute drin sind ist förderlich?
 
Ja, du hast womöglich recht.
Vermutlich liegt es am "können" in dieser hinsicht.

Ich habe mir aber sehr wohl bereits die cache extension für den IIS installiert.
Leider ist hier auch das fehlgeschlagen Wincache 1.1 war es zuletzt.

Und ja, garantiert ist Linux die bessere Variante dazu, aber was tun wenn man davon keine Ahnung hat?! I.d.R. müsste ich einige Kurse besuchen um wenigstens halbes Wissen schnell anzueignen um fortzufahren.
Aber wenns dabei an den Moneten mangelt, bringt mich das auch nicht sonderlich weiter.

Irgendeine Option muss jedenfalls her, damit ich Zeit zum lernen für die neuen Dinge gewinne.

Natürlich ist es nicht förderlich wenn jedesmal Wartungsarbeiten am Server gemacht werden müssen oder der aufgrund Überlastung zusammenbricht.
Ich weiß keinen Anfang, ich glaub das ist mein Problem :(
Ach, es sind so viele Anfänge :/
 
Und ja, garantiert ist Linux die bessere Variante dazu, aber was tun wenn man davon keine Ahnung hat?! I.d.R. müsste ich einige Kurse besuchen um wenigstens halbes Wissen schnell anzueignen um fortzufahren.
So schnell wirst du es auch nicht angeeignet kriegen.

Irgendeine Option muss jedenfalls her, damit ich Zeit zum lernen für die neuen Dinge gewinne.
Welches Chat-System ist es überhaupt? Evtl kannst du es mit wenig Umbauten dazu kriegen wenigstens eine andere Datenbank zu verwenden wie Redis.

Ach, es sind so viele Anfänge :/
Meine Empfehlung wäre ganz klar ein Relaunch mit sauber durchgetesteter und geplanter Infrastruktur und Software. Aktuell wirst du nur gegen eine Mauer rennen und zwar kräftig.

Übrigens solltest du dann auch direkt Cloud-Dienste wie Jiffybox integrieren. So könntest du den Kostenpunkt bei niedriger Belastung (zB die aktuelle Uhrzeit =D ) auf unter 10 Euro/Monat halten und bei Bedarf weitere Systeme zuschalten.
 
Ich nutze den Chatvon ProChatRooms http://prochatrooms.com/

Wenn du von diesem hier mal Quelltext sehen willst, sag es nur.

Redis Datenbank? Schon wieder was neues *lach

Edit: Ich habs jetzt tatsächlich geschafft den Wincache zu installieren.
Das Problem lag daran das dieser mit der php Version 5.3.19 garnicht läuft.
Musste mir dafür 5.3.13 installieren.

Edit2: Ich möchte an dieser Stelle noch meine Konfig.Datei von MySQL vorstellen um zu prüfen ob an dieser Stelle nicht auch
noch Schwierigkeiten sind/auftreten.


System: 8Gb stehen zur Verfügung

Code:
innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=1M
innodb_buffer_pool_size=1048M
innodb_log_file_size=10M
innodb_thread_concurrency=8
max_connections=500
old_passwords=1
max_user_connections=500
thread_cache_size=64
thread_stack=196608
binlog_cache_size=32768
net_read_timeout=30
net_retry_count=10
net_write_timeout=30
thread_concurrency=10
open_files_limit=0


key_buffer_size                   = 256M
read_buffer_size                  = 2M
read_rnd_buffer_size              = 16M
myisam_sort_buffer_size           = 128M


# Maximum size for in memory temporary tables, anything
# larger gets spun out to disc
tmp_table_size                    = 512M
max_heap_table_size               = 512M


# Sort buffer size for ORDER BY and GROUP BY queries, data
# gets spun out to disc if it does not fit
sort_buffer_size                  = 2M



# Query Cache Configuration
#
query_cache_limit                 = 2M
query_cache_size                  = 200M
query_cache_type                  = 1
query_prealloc_size               = 64K
query_alloc_block_size            = 131072
query_cache_min_res_unit          = 2K



Edit3: Node.Js ist nun auch installiert. Hab das erstmal alles auf einem Testserver. Die Testausgabe Hallo Welt über den Browser funktioniert ja schonmal auf port8090.
Wie ersetze ich nun die Queries, die ja eigentlich php erzeugt mit nodejs um?!

Edit4: Beobachtung der Leistung seit Installation des Wincache: Leistungssteigerung ca 60%. Gilt aber nur für den Seitenaufbau.
MySql info im Plesk Panel gibt mir nun eine Auslastung von ~65% wieder.

Anbei noch kurze Auszüge von PhpMyAdmin:

Netzwerk-Datenverkehr seit Start: 10.6 GiB

Dieser MySQL-Server läuft bereits 0 Tage, 3 Stunden, 59 Minuten und 55 Sekunden. Er wurde um 05. Jan 2013 um 17:36 gestartet.

Netzwerkverkehr ø pro Stunde
Empfangen 2.3 GiB 593.9 MiB
Gesendet 8.3 GiB 2.1 GiB
Insgesamt 10.6 GiB 2.7 GiB


Verbindungen ø pro Stunde %
max. gleichzeitige Verbindungen 44 --- ---
Fehlversuche 0 0 0%
Abgebrochen 1,312 328.11 0.52%
Insgesamt 252 k 62.95 k 100.00%



Verbindungen seit Start: 1,189,746 Dokumentation
ø pro Stunde: 299,831
ø pro Minute: 4,997
ø pro Sekunde: 83


Angaben # ø pro Stunde %
select 486 k 122.4 k 40.83%
change db 248 k 62.6 k 20.87%
set option 246 k 62 k 20.67%
update 194 k 49 k 16.34%
insert 13,147 3,313.2 1.11%
show status 922 232.4 0.08%
delete 736 185.5 0.06%
show processlist 466 117.4 0.04%
begin 48 12.1 <0.01%
rollback 48 12.1 <0.01%
show variables 17 4.3 <0.01%
show master status 2 0.5 <0.01%
show plugins 2 0.5 <0.01%
show slave status 2 0.5 <0.01%
show binlogs 1 0.3 <0.01%


ich hoff das sich damit was anfängen lässt um vielleicht genauer urteilen zu können.
 
Last edited by a moderator:
Back
Top