Ich habe das Original SIGCOMM '97 PostScript-Papier über HFSC gelesen , es ist sehr technisch, aber ich verstehe das Grundkonzept. Anstelle einer linearen Servicekurve (wie bei so ziemlich jedem anderen Scheduling-Algorithmus) können Sie eine konvexe oder konkave Servicekurve angeben und so Bandbreite und Verzögerung entkoppeln. Obwohl in diesem Artikel die Art der verwendeten Planungsalgorithmen erwähnt wird (Echtzeit und Link-Share), wird immer nur EINE Kurve pro Planungsklasse erwähnt (die Entkopplung erfolgt durch Angabe dieser Kurve, dafür wird nur eine Kurve benötigt) ).
Jetzt wurde HFSC für BSD (OpenBSD, FreeBSD usw.) mit dem ALTQ-Scheduling-Framework und Linux mit dem TC-Scheduling-Framework (Teil von iproute2) implementiert . Beide Implementierungen fügten zwei zusätzliche Servicekurven hinzu, die NICHT im Originalpapier enthalten waren! Eine Echtzeit-Servicekurve und eine Obergrenzen-Servicekurve. Bitte beachten Sie auch hier, dass das Originalpapier zwei Planungsalgorithmen (Echtzeit und Link-Share) erwähnt, in diesem Papier jedoch beide mit einer einzigen Servicekurve arbeiten. Es hat nie zwei unabhängige Servicekurven für eine gegeben, wie Sie sie derzeit in BSD und Linux finden.
Schlimmer noch, einige Versionen von ALTQ scheinen HSFC eine zusätzliche Warteschlangenpriorität hinzuzufügen (im Originalpapier gibt es auch keine Priorität). Ich habe mehrere BSD-HowTos gefunden, die diese Prioritätseinstellung erwähnen (obwohl die Manpage der neuesten ALTQ-Version keinen solchen Parameter für HSFC kennt, existiert sie offiziell nicht einmal).
Dies alles macht die HFSC-Planung noch komplexer als der im Originalartikel beschriebene Algorithmus, und im Internet gibt es unzählige Tutorials, die sich oft widersprechen, wobei eines das Gegenteil des anderen behauptet. Dies ist wahrscheinlich der Hauptgrund, warum niemand wirklich zu verstehen scheint, wie die HFSC-Planung wirklich funktioniert. Bevor ich meine Fragen stellen kann, benötigen wir ein Beispielsetup. Ich werde ein sehr einfaches verwenden, wie im Bild unten zu sehen:
Alternativtext http://f.imagehost.org/0177/hfsc-test-setup.png
Hier sind einige Fragen, die ich nicht beantworten kann, weil sich die Tutorials widersprechen:
Wofür brauche ich überhaupt eine Echtzeitkurve? Angenommen, A1, A2, B1, B2 sind alle 128 kbit / s Link-Share (keine Echtzeitkurve für eine), dann erhält jede von diesen 128 kbit / s, wenn die Wurzel 512 kbit / s zu verteilen hat (und A und B sind natürlich beide 256 kbit / s, oder? Warum sollte ich A1 und B1 zusätzlich eine Echtzeitkurve mit 128 kbit / s geben? Wofür wäre das gut? Um diesen beiden eine höhere Priorität einzuräumen? Laut Originalpapier kann ich ihnen eine höhere Priorität geben, indem ich eine Kurve verwende , darum geht es doch bei HFSC. Wenn Sie beiden Klassen eine Kurve von [256 kbit / s, 20 ms, 128 kbit / s] zuweisen, haben beide automatisch die doppelte Priorität als A2 und B2 (im Durchschnitt immer noch nur 128 kbit / s).
Zählt die Echtzeitbandbreite zur Link-Share-Bandbreite? Wenn z. B. A1 und B1 beide nur eine Link-Share-Bandbreite von 64 kbit / s in Echtzeit und 64 kbit / s in Echtzeit haben, ist möglicherweise auch ihre Link-Share-Anforderung erfüllt Erhalten Sie überschüssige Bandbreite, aber lassen Sie uns das für eine Sekunde ignorieren) oder bedeutet das, dass sie weitere 64 kbit / s über Link-Share erhalten? Hat also jede Klasse einen "Bandbreitenbedarf" von Echtzeit plus Link-Share? Oder hat eine Klasse nur dann eine höhere Anforderung als die Echtzeitkurve, wenn die Link-Share-Kurve höher ist als die Echtzeitkurve (die aktuelle Link-Share-Anforderung entspricht der angegebenen Link-Share-Anforderung abzüglich der dafür bereits bereitgestellten Echtzeitbandbreite) Klasse)?
Wird die obere Grenzkurve auch auf Echtzeit angewendet, nur auf Link-Share oder vielleicht auf beide? Einige Tutorials sagen den einen Weg, andere den anderen. Einige behaupten sogar, die Obergrenze sei das Maximum für Echtzeitbandbreite + Link-Share-Bandbreite? Was ist die Wahrheit?
Angenommen, A2 und B2 sind beide 128 kbit / s, macht es keinen Unterschied, ob A1 und B1 nur 128 kbit / s Link-Share oder 64 kbit / s Echtzeit- und 128 kbit / s Link-Share sind, und wenn ja , welcher Unterschied?
Warum brauche ich überhaupt "Kurven", wenn ich die separate Echtzeitkurve verwende, um die Prioritäten von Klassen zu erhöhen? Warum ist Echtzeit kein Pauschalwert und Link-Sharing auch ein Pauschalwert? Warum sind beide Kurven? Die Notwendigkeit von Kurven ist im Originalpapier klar, da es nur ein Attribut dieser Art pro Klasse gibt. Aber jetzt, mit drei Attributen (Echtzeit, Link-Freigabe und Obergrenze), wofür benötige ich noch Kurven für jedes Attribut? Warum soll ich die Kurven Form (nicht die durchschnittliche Bandbreite, aber ihre Pisten) , anders zu sein für die Echtzeit und Link-Sharing - Verkehr?
Gemäß der wenigen verfügbaren Dokumentation werden Echtzeitkurvenwerte für innere Klassen (Klasse A und B) vollständig ignoriert. Sie gelten nur für Blattklassen (A1, A2, B1, B2). Wenn dies zutrifft, warum legt die ALTQ HFSC-Beispielkonfiguration (Suche nach 3.3-Beispielkonfiguration ) Echtzeitkurven für innere Klassen fest und behauptet, dass diese die garantierte Rate dieser inneren Klassen festlegen? Ist das nicht völlig sinnlos? (Hinweis: pshare legt die Link-Share-Kurve in ALTQ fest und berechnet die Echtzeitkurve. Sie können dies im Abschnitt über der Beispielkonfiguration sehen.)
Einige Tutorials sagen, dass die Summe aller Echtzeitkurven nicht höher als 80% der Liniengeschwindigkeit sein darf, andere sagen, dass sie nicht höher als 70% der Liniengeschwindigkeit sein darf. Welches ist richtig oder sind sie vielleicht beide falsch?
Ein Tutorial sagte, Sie sollen die ganze Theorie vergessen. Unabhängig davon, wie die Dinge wirklich funktionieren (Planer und Bandbreitenverteilung), stellen Sie sich die drei Kurven nach dem folgenden "vereinfachten Denkmodell" vor: Echtzeit ist die garantierte Bandbreite, die diese Klasse immer erhält. Link-Share ist die Bandbreite, mit der diese Klasse vollständig zufrieden sein möchte, aber die Zufriedenheit kann nicht garantiert werden. Falls es zu viel Bandbreite gibt, wird der Klasse möglicherweise sogar mehr Bandbreite angeboten, als sie benötigt, um zufrieden zu sein, aber sie darf niemals mehr als die angegebene Obergrenze verwenden. Damit dies funktioniert, darf die Summe aller Echtzeit-Bandbreiten nicht über xx% der Leitungsgeschwindigkeit liegen (siehe Frage oben, der Prozentsatz variiert). Frage: Ist das mehr oder weniger genau oder ein totales Missverständnis von HSFC?
Und wenn die obige Annahme wirklich zutreffend ist, wo befindet sich die Priorisierung in diesem Modell? Beispielsweise hat jede Klasse möglicherweise eine Echtzeitbandbreite (garantiert), eine Link-Share-Bandbreite (nicht garantiert) und möglicherweise eine Obergrenze. Einige Klassen haben jedoch höhere Prioritätsanforderungen als andere Klassen. In diesem Fall muss ich immer noch Prioritäten setzen, selbst im Echtzeitverkehr dieser Klassen. Würde ich nach der Steigung der Kurven priorisieren? Und wenn ja, welche Kurve? Die Echtzeitkurve? Die Link-Share-Kurve? Die obere Grenzkurve? Alle von ihnen? Würde ich allen die gleiche oder eine andere Steigung geben und wie finde ich die richtige Steigung heraus?
Ich habe immer noch nicht die Hoffnung verloren, dass es zumindest eine Hand voll Menschen auf dieser Welt gibt, die HFSC wirklich verstanden haben und in der Lage sind, all diese Fragen genau zu beantworten. Und das zu tun, ohne sich in den Antworten zu widersprechen, wäre wirklich nett ;-)