Ho letto l'articolo SIGCOMM '97 PostScript originale su HFSC, è molto tecnico, ma capisco il concetto di base. Invece di fornire una curva di servizio lineare (come praticamente con qualsiasi altro algoritmo di pianificazione), è possibile specificare una curva di servizio convessa o concava e quindi è possibile disaccoppiare la larghezza di banda e il ritardo. Tuttavia, anche se questo documento menziona il tipo di algoritmi di pianificazione in uso (tempo reale e link-share), menziona sempre solo UNA curva per classe di pianificazione (il disaccoppiamento viene effettuato specificando questa curva, per tale motivo è necessaria solo una curva ).
Ora HFSC è stato implementato per BSD (OpenBSD, FreeBSD, ecc.) Usando il framework di pianificazione ALTQ ed è stato implementato Linux usando il framework di pianificazione TC (parte di iproute2). Entrambe le implementazioni hanno aggiunto due curve di servizio aggiuntive, che NON erano nel documento originale! Una curva di servizio in tempo reale e una curva di servizio con limite superiore. Ancora una volta, si noti che il documento originale menziona due algoritmi di pianificazione (in tempo reale e link-share), ma in quel documento entrambi funzionano con una singola curva di servizio. Non ci sono mai state due curve di servizio indipendenti per nessuno dei due come si trova attualmente in BSD e Linux.
Ancora peggio, alcune versioni di ALTQ sembrano aggiungere una priorità di coda aggiuntiva a HSFC (non esiste nemmeno una priorità nel documento originale). Ho trovato diversi BST HowTo che menzionano questa impostazione di priorità (anche se la pagina man dell'ultima versione ALTQ non conosce tale parametro per HSFC, quindi ufficialmente non esiste nemmeno).
Tutto ciò rende la programmazione HFSC ancora più complessa dell'algoritmo descritto nel documento originale e ci sono tonnellate di tutorial su Internet che spesso si contraddicono a vicenda, sostenendo il contrario dell'altro. Questo è probabilmente il motivo principale per cui nessuno sembra davvero capire come funziona davvero la programmazione HFSC. Prima di poter porre le mie domande, abbiamo bisogno di una configurazione di esempio di qualche tipo. Ne userò uno molto semplice come mostrato nell'immagine qui sotto:
testo alternativo http://f.imagehost.org/0177/hfsc-test-setup.png
Ecco alcune domande alle quali non posso rispondere perché i tutorial si contraddicono a vicenda:
Per cosa ho bisogno di una curva in tempo reale? Supponendo che A1, A2, B1, B2 siano tutti 128 kbit / s link-share (nessuna curva in tempo reale per uno dei due), ognuno di questi otterrà 128 kbit / s se il root ha 512 kbit / s da distribuire (e A e B sono entrambi 256 kbit / s ovviamente), giusto? Perché dovrei fornire ad A1 e B1 una curva in tempo reale con 128 kbit / s? Per cosa sarebbe utile? Per dare a quei due una priorità più alta? Secondo il documento originale, posso dare loro una priorità più alta usando una curva , dopo tutto questo è l'HFSC. Assegnando ad entrambe le classi una curva di [256kbit / s 20ms 128kbit / s] entrambe hanno una priorità doppia rispetto a A2 e B2 automaticamente (ottenendo comunque solo 128 kbit / s in media)
La larghezza di banda in tempo reale conta ai fini della larghezza di banda di link-share? Ad esempio, se A1 e B1 hanno entrambi solo 64 kbit / s in tempo reale e 64 kbit / s di larghezza di banda per la condivisione dei collegamenti, ciò significa che una volta che vengono serviti a 64 kbit / s in tempo reale, anche il loro requisito di condivisione dei collegamenti è soddisfatto (potrebbero ottenere una larghezza di banda in eccesso, ma ignoriamolo per un secondo) o significa che ottengono altri 64 kbit / s tramite link-share? Quindi ogni classe ha un "requisito" di larghezza di banda in tempo reale più link-share? Oppure una classe ha un requisito più elevato rispetto alla curva in tempo reale se la curva di condivisione del collegamento è superiore alla curva in tempo reale (il requisito di condivisione del collegamento corrente è uguale al requisito di condivisione del collegamento specificato meno la larghezza di banda in tempo reale già fornita a questo classe)?
La curva del limite superiore viene applicata anche in tempo reale, solo al link-share o forse ad entrambi? Alcuni tutorial dicono in un modo, altri dicono nell'altro modo. Alcuni sostengono addirittura che il limite superiore sia il massimo per larghezza di banda in tempo reale + larghezza di banda di condivisione link? Qual'è la verità?
Supponendo che A2 e B2 siano entrambi 128 kbit / s, fa differenza se A1 e B1 sono solo 128 kbit / s link-share o 64 kbit / s in tempo reale e 128 kbit / s link-share, e in tal caso , che differenza?
Se uso la curva separata in tempo reale per aumentare le priorità delle classi, perché avrei bisogno di "curve"? Perché il real-time non è un valore fisso e la condivisione link anche un valore fisso? Perché entrambe le curve? La necessità di curve è chiara nel documento originale, perché esiste un solo attributo di quel tipo per classe. Ma ora, avendo tre attributi (tempo reale, link-share e limite superiore), per cosa ho ancora bisogno di curve su ognuno? Perché dovrei desiderare che la forma delle curve (non la larghezza di banda media, ma le loro pendenze) sia diversa per il traffico in tempo reale e per la condivisione dei collegamenti?
Secondo la scarsa documentazione disponibile, i valori della curva in tempo reale vengono totalmente ignorati per le classi interne (classe A e B), vengono applicati solo alle classi foglia (A1, A2, B1, B2). Se questo è vero, perché la configurazione di esempio ALTQ HFSC (cerca la configurazione di esempio 3.3 ) imposta curve in tempo reale su classi interne e afferma che quelle impostano il tasso garantito di quelle classi interne? Non è del tutto inutile? (nota: pshare imposta la curva di condivisione del collegamento in ALTQ e gratta la curva in tempo reale; puoi vederla nel paragrafo sopra la configurazione di esempio).
Alcuni tutorial dicono che la somma di tutte le curve in tempo reale potrebbe non essere superiore all'80% della velocità della linea, altri sostengono che non deve essere superiore al 70% della velocità della linea. Qual è quello giusto o forse entrambi hanno torto?
Un tutorial ha detto che dovresti dimenticare tutta la teoria. Non importa come funzionano veramente le cose (programmatori e distribuzione della larghezza di banda), immagina le tre curve secondo il seguente "modello mentale semplificato": il tempo reale è la larghezza di banda garantita che questa classe otterrà sempre. link-share è la larghezza di banda che questa classe vuole diventare pienamente soddisfatta, ma la soddisfazione non può essere garantita. Nel caso in cui vi sia una larghezza di banda in eccesso, la classe potrebbe persino ricevere più larghezza di banda del necessario per accontentarsi, ma potrebbe non usare mai più di quanto dice il limite superiore. Perché tutto ciò funzioni, la somma di tutte le larghezze di banda in tempo reale potrebbe non essere superiore al xx% della velocità della linea (vedere la domanda sopra, la percentuale varia). Domanda: è più o meno accurato o un equivoco totale di HSFC?
E se il presupposto di cui sopra è davvero accurato, dov'è la priorità in quel modello? Ad esempio, ogni classe potrebbe avere una larghezza di banda in tempo reale (garantita), una larghezza di banda di condivisione link (non garantita) e forse un limite superiore, ma alcune classi hanno esigenze di priorità più elevate rispetto ad altre. In tal caso, devo comunque dare la priorità in qualche modo, anche al traffico in tempo reale di quelle classi. Darei la priorità in base alla pendenza delle curve? E se sì, quale curva? La curva in tempo reale? La curva di link-share? La curva del limite superiore? Tutti loro? Darei a tutti loro la stessa pendenza o ognuna una diversa e come scoprire la pendenza giusta?
Non ho ancora perso la speranza che esista almeno una mano piena di persone in questo mondo che hanno veramente capito HFSC e sono in grado di rispondere a tutte queste domande in modo accurato. E farlo senza contraddirsi a vicenda nelle risposte sarebbe davvero bello ;-)