Auch schon ein
wenig älter:
Jessika schrieb:
Gibt es hier eigentlich nur Nutzer die sich über diese Funktion gegenseitig ihre bestehenden Trafficshaping Modifikationen posten oder kann das auch noch jemand erklären, was und warum was welche Auswirkungen oder Beeinflussungen ergibt!?
Ich möchte hier gerne etwas allgemeiner Aspekte zu QoS erklären.
Nochmal ein Wort der Warnung vorab, meine Anmerkungen basieren auf dem Wissen von diesem Thread und meinem allgemeinen Wissen über andere QoS Implementierungen z. B. bei Cisco-Routers. Jedoch habe ich selbst noch keine QoS Einstellungen auf der FB vorgenommen, werde es aber bald tun.
Also:
Im ganzen Thread sind m. E. immer 2 Dinge vermischt. Die Priorität von 0 bis 3 und die Bandbreitenbegrenzung (shaping). Dabei sind das verschiedene Dinge.
Das Verschicken eines Pakets vom Router über eine Leitung teilt sich eigentlich in 2 Arbeitsschritte auf, die unabhängig voneinander stattfinden.
- Einsortieren der Pakete in die richtige Warteschlage für diese Leitung.
- Abarbeiten der Warteschlangen und Raussenden der Pakete über die Leitung.
Das muss man wissen: es gibt immer Warteschlangen, bevor die Daten in einzelnen Bits über die Leitung gehen.
Schritt 1, Einsortieren der Pakete in die Warteschlangen/Puffer/Queues:
- Jedes Paket das auf einem Interface (z. B. DSL-Leitung für UL) verschickt werden soll, muss erst qualifiziert werden, d. h. gemäß Filterregeln (out_rules) wird die Priorität festgelegt.
- Zu jedem Interface gibt es 4 Puffer, pro Priorität eine.
- Das Paket wird entsprechend seiner Prio dort entsprechend einsortiert (wenn noch Platz ist, s. u).
- Das wird mit allen Paketen gemacht, die auf diesem Interface übertragen werden sollen.
Schritt 2, Abarbeiten der Puffer, quasiparallel zu Schritt 1. Hierfür ignorieren wir mal kurz den Shapingaspekt, nehmen also an, die bps_limits stehen alle auf 0:
Es läuft die ganze Zeit ungefähr folgende Prozedur ab:
- Wenn im Puffer prio3 ein Paket ist, schicke es über die Leitung raus. Nachdem das Paket raus ist, Rücksprung zu 1. Falls kein Paket in Puffer prio3 war, weiter mit 2.
- Wenn im Puffer prio2 ein Paket ist, schicke es über die Leitung raus. Nachdem das Paket raus ist, Rücksprung zu 1. Falls kein Paket in Puffer prio2 war, weiter mit 3.
- Wenn im Puffer prio1 ein Paket ist, schicke es über die Leitung raus. Nachdem das Paket raus ist, Rücksprung zu 1. Falls kein Paket in Puffer prio1 war, weiter mit 4.
- Wenn im Puffer prio0 ein Paket ist, schicke es über die Leitung raus. Nachdem das Paket raus ist, Rücksprung zu 1. Falls kein Paket in Puffer prio0 war, gibt's nix zu senden, weiter mit 1.
Und das alles hat noch nix mit Shaping zu tun, sondern ist soweit ein strict-priority-scheduler.
Wenn also jemand mit prio 3 bis 1 die UL-Bandbreite komplett dicht macht, dann werden alle prio0 Pakete im Puffer verhungern. Solch ein Puffer hat aber eine maximale Länge, nur weiß ich die von der FB nicht. Vielleicht jemand anders? Wenn der Puffer voll ist, dann kann beim Schritt 1 (Einsortieren) nichts mehr in den Puffer geschrieben werden, das Paket muss verworfen werden, es geht verloren.
Nun kommt es auf das Ende-zu-Ende Protokoll an, ob solch ein Paketverlust schlimm ist oder nicht.
- UDP hat keine Mechanismen, um Paketverluste zu bemerken. Da ist die Applikation gefragt, die UDP verwendet, ob sie damit leben kann. Bei VoIP geht z. B. die Qualität runter.
- TCP kann eine gewisse Zeit Paketverluste kompensieren, aber wenn man einen TCP Stream zu lange anhält, dann bricht er auch ab.
- Wenn der Datenstrom abbricht, oder zu lange ausbleibt, kommt es auf die Anwendung an, ob sie das kompensieren kann (z. B. einfach wieder neu anfängt), oder richtige Fehlermeldungen produziert und andere hässliche Sachen.
Insgesamt ist es eigentlich kein guter Stil, wenn TCP Ströme ganz abbrechen. Man kann sie auf seeeehr langsam runterfahren, aber ganz abbrechen ist oft für die Anwendung (z. B. FTP, HTTP) gar nicht gut.
Und nun kommt Shaping.
Damit nämlich auch z. B. ein Hintergrund-UL-FTP noch ne Chance hat, ganz langsam, aber ohne abzubrechen, zu existieren, muss ich ihm eine minimale Luft zum Leben lassen. D. h. ich darf nicht 100 % der Bandbreite für wichtigere Sachen zuteilen, sondern nur z. B. 95 % und den Rest für Best Effort (prio 0) übriglassen.
Beim Shapen werden in Schritt 2 die Pakete nicht nur strikt nach Prioritäten aus den 4 Puffern genommen. Es wird auch geguckt, ob im Mittel über die letzte Zeit (weiß jemand, welchen Algorithmus die FB wirklich als gleitenden Mittelwert nutzt?) die Pakete einer bestimmten Priorität auch die Limits für die Bandbreite (bps_limit) und Paketanzahl (pps_limit) eingehalten haben. Wenn die Limits überschritten sind, dann wird der entsprechende Puffer solange übersprungen, bis durch die Aktualisierung des gleitenden Mittelwert der Mittelwert wieder unter das Limit fällt.
Also hier Schritt 2, Abarbeiten der Puffer, quasiparallel zu Schritt 1, jetzt mit Shaping.:
Es läuft die ganze Zeit folgende Prozedur ab:
- Wenn im Puffer prio3 ein Paket ist, prüfe, ob ein Limit (bps/pps) überschritten wurde. Wenn nein schicke es über die Leitung raus. Berechne einen neuen Mittelwert für bps/pps. Nachdem das Paket raus ist, Rücksprung zu 1. Falls kein Paket in Puffer prio3 war, oder ein Limit überschritten wurde, weiter mit 2.
- Wenn im Puffer prio2 ein Paket ist, prüfe, ob ein Limit (bps/pps) überschritten wurde. Wenn nein schicke es über die Leitung raus. Berechne einen neuen Mittelwert für bps/pps. Nachdem das Paket raus ist, Rücksprung zu 1. Falls kein Paket in Puffer prio2 war, oder ein Limit überschritten wurde, weiter mit 3.
- Wenn im Puffer prio1 ein Paket ist, prüfe, ob ein Limit (bps/pps) überschritten wurde. Wenn nein schicke es über die Leitung raus. Berechne einen neuen Mittelwert für bps/pps. Nachdem das Paket raus ist, Rücksprung zu 1. Falls kein Paket in Puffer prio1 war, oder ein Limit überschritten wurde, weiter mit 4.
- Wenn im Puffer prio0 ein Paket ist, prüfe, ob ein Limit (bps/pps) überschritten wurde. Wenn nein schicke es über die Leitung raus. Berechne einen neuen Mittelwert für bps/pps. Nachdem das Paket raus ist, Rücksprung zu 1. Falls kein Paket in Puffer prio2 war, oder ein Limit überschritten wurde, weiter mit 1.
Daran kann man erkennen, dass, wenn ich Prio0 auf 40 % begrenze, wirklich max. 40 % der Bandbreite genutzt werden, selbst wenn 100 % frei sind. Während das bei für Prio 3 gut vertretbar ist, die Bandbreite zu begrenzen (z. B. 95 %, das tut nämlich nicht weh, wenn einem 5 % fehlen), ist es natürlich für Prio 0 unnötig, die Bandbreite zu begrenzen, denn die sind in Schritt 2 ja sowieso immer als letzte dran.
So, nach so viel Technikgeschwafel kommt noch meine persönliche Einschätzungen. Man sollte die verschiedenen Auswirkungen der Priorisierung und des Shapings verstehen um optimale Einstellungen zu finden. Man sollte den höheren Prioritäten keine 100 % geben, sondern weniger. TCP ACKs sind wichtig im UL, damit der DL fluppt. Gegebenenfalls allgemein kleine Pakete egal welcher Coleur vor großen Paketen bevorzugen, um die Latenz zu verringern.
Ich hoffe das hilft mehr als das es verwirrt.
Viele Grüße
Carsten