Bandbreiten anpassung
Mr. CoolD
- php
Hallo erstmal ich suche nach einer Möglichkeit die Bandbreite meines Servers dynamisch auf die Zugriffe aufzuteilen das heißt folgendes
wenn jemand etwas von meinem Server downloadet hat er 100% der zur verfügung stehende Bandbreite wenn 2 downloaden hat jeder nur 50%
er soll also selbst die Zugriffe bemerken und sie dementsprechend die Bandbreite aufteilen wenn einer also eine große Datei zieht und noch nicht fertig ist nun aber ein zweiter ebenfalls was anfängt zu downloaden soll die Geschwindigkeit noch während des Downloads des ersten runtergeregelt werden. Er hatte zu Anfang also 100% und zbsp. ab Mitte seines Downloads nur noch 50% bzw 33% oder 25% je nach Anzahl der Zugriffe gleichzeitig. In erster Linie geht es darum allen die was haben wollen gerecht die Geschwindigkeit zuzuweisen. Keiner Wird bevorzugt außer ein Admin oder so. Wenn einer fertig ist soll diese Bandbreite wieder zur verfügung gestellt werden an die die noch am Downloaden sind.
Es ist halt etwas kompliziert aber wenn ich auf einer LAN bin und derzeit ein paar User ne Demo downloaden wollen dann bricht der Server regelmäßig ein und die Einer hat mehr Bandbreite als die Anderen
hoffe das Jemand sich für dieses Problem begeistern kann
und bedanke mich im voraus für eure antworten bzw Lösungsvorschläge
Mfg Ich ^^
Moin!
Es ist halt etwas kompliziert aber wenn ich auf einer LAN bin und derzeit ein paar User ne Demo downloaden wollen dann bricht der Server regelmäßig ein und die Einer hat mehr Bandbreite als die Anderen
Es wird unmöglich sein, die Bandbreite nach deinen Maßstäben gerecht aufzuteilen. Dies liegt in der Technologie des Netzwerks begründet.
Bei einer Datenübertragung wie z.B. einem Download werden alle gesendeten Pakete vom Empfänger irgendwann quittiert, um den erfolgreichen Empfang zu signalisieren. Braucht der Empfänger oder das übermittelnde Netzwerk dafür bei einem Downloader wenig Zeit, und bei einem anderen mehr, dann wird die Downloadrate bei demjenigen, der schnell die gesendeten Pakete quittieren kann, hoch sein, weil der Server schnell neue Pakete nachschicken kann, während derjenige, der nur langsam quittiert, eben auch nur langsamer neue Pakete kriegt.
Also selbst wenn du für zwei Downloader 50% Datenrate wollen würdest - es würde vermutlich daran scheitern, dass das Netzwerk dir da einen Strich durch die Rechnung macht. Und ich denke nicht, dass es in deinem Sinn ist, dem einen Downloader nur 50% Datenrate zur Verfügung zu stellen, wenn der andere Downloader seine 50% nicht voll nutzt, sondern 30% ungenutzt übrig läßt.
Darüber hinaus ist noch die Frage zu stellen, welches Protokoll zum Download du benutzt. HTTP ist nicht unbedingt gut geeignet, FTP ist deutlich besser. Vielleicht solltest du auch mal ausprobieren, stattdessen nur einen Bittorrent-Tracker und einen entsprechenden Client zum seeden zur Verfügung zu stellen. Dann laden die beteiligten Clients auch gegenseitig voneinander runter. Denn keine LAN-Party schließt ihre Teilnehmer einfach stumpf alle an einen Switch, und die Backbones sind, obwohl vielleicht in 1GB oder 10GB ausgelegt, dann ggf. doch die Engstelle.
Jedenfalls: Für die Begrenzung von HTTP-Traffic im Apachen gibt es das Modul mod_bandwidth, mit dem du allerdings nach meinem Wissensstand (den ich jetzt nicht aktualisiert habe) nicht das tun kannst, was du willst, sondern "nur" nach gewissen Regeln den Traffic eines Clients nach oben begrenzen, damit (für andere) Bandbreite freibleibt - und zwar immer. Außerdem ist das Begrenzen von Bandbreite dann doch nicht so ganz einfach, jedenfalls ist dessen Realisierung nicht so, wie man sich das vielleicht vorstellt, analog zu einem Wasserhahn: Einfach zudrehen sorgt für Reduktion des Datenflusses. Auf digitaler Ebene ist auch die Bandbreite digital, d.h. über einen gewissen Zeitraum hinweg werden einfach nur X Pakete gesendet, und zwar mit maximaler Bandbreite. Wenn die weg sind, wird Pause gemacht.
Für die Begrenzung von FTP-Traffic hat eigentlich jeder vernünftige FTP-Server schon direkt Konfigurationsmöglichkeiten eingebaut. Check' deine Doku diesbezüglich.
Und PS: Dein Problem läßt sich nicht mit PHP lösen. PHP kommt an die notwendigen Stellen zur Einflußnahme gar nicht heran. Oder würde dabei nur wahnsinnig viele Ressourcen verbraten, so dass dein Server erst recht in die Knie geht.
- Sven Rautenberg
Moin!
Jetzt, wo ich den Titel geändert habe, fällt mir noch eine Möglichkeit ein:
Die Linux-Firewall im 2.6-Kernel bietet ebenfalls Möglichkeiten zum Traffic-Shaping an (das ist dein Suchwort für Google).
- Sven Rautenberg
@ Antwort von Sven Rautenberg
Ich danke dir für deine Antwort wobei ich der Meinung bin wenn mein Server mit einer 1Gbit angeschlossen ist und sagen wir 20 man bei mir ziehen und jeder von denen 100 MBit hat kann normalerweise nicht jeder
100MBit ausnutzen da die Server Leitung in diesem Fall das Nadelöhr ist. Aber jeder von den 20 Clients hat dann noch Reserven was seine Netzwerkkarte betrifft und somit sollte sein Rechner eigentlich auch im Stande sein die ihm zugesicherte Bandbreite auszunutzen da jeder
50 MBit zugewiesen bekommt und sollte er fertig sein die Bandbreite sich auf die anderen verteilt.
Das umsetzen dieser Aufgabe ist insofern kniffelig da PHP nicht dynamisch Webseiten Aktualisieren kann und daher in Verbindung mit Javascript benutzt werden muss. Alternativen wie FTP Server oder andere Share Programme habe ich aber ich würde es gerne über HTTP Realisieren.
du hast natürlich völlig Recht das es eventuell zu Serverlastig sein könnte/wird.
dennoch währe ich an einer Lösung Interessiert
Mfg Ich ^^
Moin!
@ Antwort von Sven Rautenberg
Ich weiß, dass du mir geantwortet hast - das sieht man am Threadbaum eindeutig. Das hier ist schließlich kein Board. :)
Ich danke dir für deine Antwort wobei ich der Meinung bin wenn mein Server mit einer 1Gbit angeschlossen ist und sagen wir 20 man bei mir ziehen und jeder von denen 100 MBit hat kann normalerweise nicht jeder 100MBit ausnutzen da die Server Leitung in diesem Fall das Nadelöhr ist.
Aber jeder von den 20 Clients hat dann noch Reserven was seine Netzwerkkarte betrifft und somit sollte sein Rechner eigentlich auch im Stande sein die ihm zugesicherte Bandbreite auszunutzen da jeder 50 MBit zugewiesen bekommt und sollte er fertig sein die Bandbreite sich auf die anderen verteilt.
Bedenke, dass das, was auf der "Leitung draufsteht", sich auf die physikalische Datenübermittlung auf dieser Leitung bezieht. Du kannst die 100MBit/s nicht einfach durch 8 teilen (8 Bit = 1 Byte) und 12,5 MByte/s Datenrate erwarten (oder 125 MByte/s auf der Gigabit-Leitung).
In Abhängigkeit vom verwendeten Protokoll und natürlich der erwähnten Latenz der Clients landest du u.U. bei deutlich geringeren Werten. Das aber nur am Rande.
Die Frage ist doch, was du unter "gerecht" genauer definierst.
Wenn der Download einer Datei 5 Minuten benötigt, du zwei Clients hast, und beide nach 10 Minuten die Datei haben, dann ist das - auch im Sinne des Bandbreitenmanagements - "gerecht", und zwar auch dann, wenn der eine Client die Datei durch Nutzung von 99% Bandbreite schon kurz nach 5 Minuten hat, und der andere die ganzen 10 Minuten drauf warten muß.
Natürlich könnte man die Zeitscheiben kleiner machen und z.B. alle 10 Sekunden die pro Client übermittelte Datenmenge prüfen, und dann in den nächsten 10 Sekunden entsprechend reduzieren.
Aber das hilft dir eben nur bedingt, denn es ist ja nicht gesagt, dass jeder Client die ihm zugewiesene Bandbreite voll ausnutzen kann.
Du würdest also folgendes beobachten:
Nach 10 Sekunden hat A 90% der maximalen Bandbreite (bzw. Datenmenge) abgegriffen, Client B nur 10%. Also reduzierst du die verfügbare Datenmenge für A auf 50%.
Nach den nächsten 10 Sekunden siehst du, dass Client B trotzdem nur 20% der maximalen Bandbreite abgerufen hat. Was nun? In diesen 10 Sekunden hast du 30% Bandbreite verschenkt, für die Client A dankbar gewesen wäre. Vielleicht hat Client B parallel noch andere Datentransfers auf seinem Interface.
Und wenn diese Transfers beendet sind, dann wird er vielleicht in der Lage sein, seine zugewiesenen 50% oder gar 100% auszunutzen. Wäre Client A dann mit Download schon fertig, wäre alles in Butter, Client B würde optimal bedient werden. Durch deinen Eingriff und die willkürliche Realisierung von "gerecht ist, wenn jeder nur seinen Anteil Bandbreite kriegt, und nicht mehr" reduzierst du also sogar deinen Service.
Das umsetzen dieser Aufgabe ist insofern kniffelig da PHP nicht dynamisch Webseiten Aktualisieren kann und daher in Verbindung mit Javascript benutzt werden muss. Alternativen wie FTP Server oder andere Share Programme habe ich aber ich würde es gerne über HTTP Realisieren.
Den Absatz verstehe ich nicht. Von PHP war bislang noch gar nicht die Rede, ebensowenig von Javascript. Du hast nach "Server" gefragt und der Möglichkeit des Bandbreitenmanagements.
Also: Was darf es jetzt sein?
- Sven Rautenberg