Przeczytałem oryginalny artykuł SIGCOMM '97 PostScript o HFSC, jest to bardzo technicznie, ale rozumiem podstawową koncepcję. Zamiast podawać liniową krzywą usługi (jak w przypadku prawie każdego innego algorytmu szeregowania), można określić wypukłą lub wklęsłą krzywą usługi, dzięki czemu można rozdzielić szerokość pasma i opóźnienie. Jednak mimo że w niniejszym dokumencie wspomniano o rodzaju stosowanych algorytmów szeregowania (w czasie rzeczywistym i współużytkowaniu łącza), zawsze wspomina się tylko o JEDNEJ krzywej na klasę planowania (odsprzężenie odbywa się poprzez określenie tej krzywej, do tego potrzebna jest tylko jedna krzywa ).
Teraz HFSC został zaimplementowany dla BSD (OpenBSD, FreeBSD itp.) Przy użyciu struktury planowania ALTQ i został zaimplementowany Linux przy użyciu struktury planowania TC (część iproute2). Obie implementacje dodały dwie dodatkowe krzywe serwisowe, których NIE było w oryginalnym dokumencie! Krzywa serwisowa w czasie rzeczywistym i krzywa serwisowa górnego limitu. Ponownie zauważmy, że w oryginalnym artykule wspomniano o dwóch algorytmach planowania (w czasie rzeczywistym i współdzieleniu łącza), ale w tym dokumencie oba działają z jedną krzywą usług. Nigdy nie było dwóch niezależnych krzywych usług dla jednej z nich, jak obecnie w BSD i Linux.
Co gorsza, niektóre wersje ALTQ wydają się dodawać dodatkowy priorytet kolejki do HSFC (w oryginale nie ma czegoś takiego jak priorytet). Znalazłem kilka poradników BSD wspominających o tym ustawieniu priorytetu (mimo że strona podręcznika w najnowszej wersji ALTQ nie zna takiego parametru dla HSFC, więc oficjalnie nawet nie istnieje).
Wszystko to sprawia, że planowanie HFSC jest jeszcze bardziej skomplikowane niż algorytm opisany w oryginalnej pracy. W Internecie dostępnych jest mnóstwo samouczków, które często są ze sobą sprzeczne, z których jeden twierdzi, że jest odwrotnie. Jest to prawdopodobnie główny powód, dla którego nikt tak naprawdę nie rozumie, jak naprawdę działa harmonogram HFSC. Zanim będę mógł zadawać pytania, potrzebujemy jakiejś konfiguracji przykładowej. Użyję bardzo prostego, jak widać na poniższym obrazku:
alt text http://f.imagehost.org/0177/hfsc-test-setup.png
Oto kilka pytań, na które nie mogę odpowiedzieć, ponieważ samouczki są ze sobą sprzeczne:
Po co w ogóle potrzebuję krzywej w czasie rzeczywistym? Zakładając, że A1, A2, B1, B2 mają 128 kbit / s współdzielenia łącza (żadna krzywa w czasie rzeczywistym dla żadnej z nich), to każdy z nich otrzyma 128 kbit / s, jeśli katalog główny ma 512 kbit / s do dystrybucji (i A i B mają oczywiście 256 kbit / s), prawda? Dlaczego miałbym dodatkowo nadawać A1 i B1 krzywą czasu rzeczywistego o prędkości 128 kbit / s? Do czego to by było dobre? Nadać tym dwóm wyższy priorytet? Według oryginalnej pracy mogę nadać im wyższy priorytet za pomocą krzywej , o to w końcu chodzi o HFSC. Nadając obu klasom krzywą [256 kbit / s 20 ms 128 kbit / s] oba mają automatycznie dwa razy wyższy priorytet niż A2 i B2 (wciąż uzyskują średnio tylko 128 kbit / s)
Czy przepustowość w czasie rzeczywistym liczy się do przepustowości współdzielenia łącza? Np. Jeśli A1 i B1 mają tylko przepustowość dzielenia łącza 64 kbit / s w czasie rzeczywistym, to znaczy, że gdy są one obsługiwane w czasie rzeczywistym 64 kbit / s, ich wymóg udostępniania łącza jest również spełniony (mogą uzyskać nadmierną przepustowość, ale zignorujmy to na sekundę) czy to oznacza, że uzyskują kolejne 64 kbit / s za pośrednictwem łącza? Czy więc każda klasa ma „wymaganie” przepustowości w czasie rzeczywistym plus współdzielenie łącza? Czy klasa ma wyższe wymagania niż krzywa w czasie rzeczywistym, jeżeli krzywa udziału łącza jest wyższa niż krzywa czasu rzeczywistego (obecny wymóg udziału łącza równa się określonemu wymaganiu udziału łącza minus przepustowość w czasie rzeczywistym już zapewniona do tego klasa)?
Czy górna krzywa graniczna ma zastosowanie również w czasie rzeczywistym, tylko do udostępniania linków, a może do obu? Niektóre samouczki mówią w jeden sposób, inne w inny sposób. Niektórzy twierdzą nawet, że górna granica to maksymalna przepustowość w czasie rzeczywistym + przepustowość udostępniania łącza? Jaka jest prawda?
Zakładając, że zarówno A2, jak i B2 mają prędkość 128 kbit / s, czy robi to jakąkolwiek różnicę, jeśli A1 i B1 mają tylko 128 kbit / s tylko udział łącza, lub 64 kbit / s w czasie rzeczywistym i 128 kbit / s udział łącza, a jeśli tak, , Co za różnica?
Jeśli używam osobnej krzywej czasu rzeczywistego do zwiększenia priorytetów klas, dlaczego w ogóle potrzebowałbym „krzywych”? Dlaczego w czasie rzeczywistym nie ma płaskiej wartości i podziału linków również płaskiej wartości? Dlaczego obie krzywe? Potrzeba krzywych jest wyraźna w oryginalnym artykule, ponieważ istnieje tylko jeden tego rodzaju atrybut na klasę. Ale teraz, mając trzy atrybuty (w czasie rzeczywistym, współdzielenie łącza i górny limit), po co nadal potrzebuję krzywych na każdym z nich? Dlaczego miałbym chcieć, aby kształt krzywych (nie średnia przepustowość, ale ich nachylenie) był inny dla ruchu w czasie rzeczywistym i współdzielenia łącza?
Zgodnie z niewielką dostępną dokumentacją wartości krzywych w czasie rzeczywistym są całkowicie ignorowane dla klas wewnętrznych (klasa A i B), są one stosowane tylko do klas liści (A1, A2, B1, B2). Jeśli to prawda, dlaczego konfiguracja próbki ALTQ HFSC (wyszukiwanie konfiguracji próbki 3.3 ) ustawia krzywe w czasie rzeczywistym dla klas wewnętrznych i twierdzi, że ustawiają one gwarantowaną szybkość tych klas wewnętrznych? Czy to nie jest całkowicie bezcelowe? (uwaga: pshare ustawia krzywą podziału łącza w ALTQ i oblicza krzywą w czasie rzeczywistym; możesz to zobaczyć w akapicie powyżej przykładowej konfiguracji).
Niektóre samouczki mówią, że suma wszystkich krzywych w czasie rzeczywistym nie może być większa niż 80% prędkości linii, inni twierdzą, że nie może przekraczać 70% prędkości linii. Który z nich ma rację, czy może oba są w błędzie?
Jeden samouczek powiedział, że zapomnisz o całej teorii. Bez względu na to, jak rzeczy naprawdę działają (harmonogramy i rozkład przepustowości), wyobraź sobie trzy krzywe zgodnie z następującym „uproszczonym modelem umysłu”: w czasie rzeczywistym jest gwarantowana przepustowość, którą ta klasa zawsze otrzyma. link-share to przepustowość, którą ta klasa chce w pełni usatysfakcjonować, ale satysfakcji nie można zagwarantować. W przypadku nadmiernej przepustowości klasa może nawet zaoferować większą przepustowość, niż jest to konieczne do spełnienia, ale nigdy nie może użyć więcej niż mówi górna granica. Aby to wszystko działało, suma wszystkich przepustowości w czasie rzeczywistym nie może przekraczać xx% prędkości linii (patrz pytanie powyżej, procent się zmienia). Pytanie: Czy jest to mniej lub bardziej dokładne lub całkowite nieporozumienie z HSFC?
A jeśli powyższe założenie jest naprawdę dokładne, gdzie jest ustalanie priorytetów w tym modelu? Np. Każda klasa może mieć przepustowość w czasie rzeczywistym (gwarantowana), przepustowość udostępniania łącza (nie gwarantowana) i być może górną granicę, ale niektóre klasy mają wyższy priorytet niż inne klasy. W takim przypadku nadal muszę jakoś ustalić priorytety, nawet wśród ruchu tych klas w czasie rzeczywistym. Czy ustaliłbym priorytet według nachylenia krzywych? A jeśli tak, to która krzywa? Krzywa w czasie rzeczywistym? Krzywa link-share? Krzywa górnego limitu? Wszyscy? Czy dałbym wszystkim z nich to samo nachylenie lub każde inne i jak znaleźć właściwe nachylenie?
Nadal nie straciłem nadziei, że na świecie istnieje przynajmniej ręka pełna ludzi, którzy naprawdę rozumieli HFSC i są w stanie dokładnie odpowiedzieć na wszystkie te pytania. A robienie tego bez sprzeczania się w odpowiedziach byłoby naprawdę fajne ;-)