Li o artigo original do SIGCOMM '97 PostScript sobre o HFSC, é muito tecnicamente, mas entendo o conceito básico. Em vez de fornecer uma curva de serviço linear (como em praticamente todos os outros algoritmos de agendamento), você pode especificar uma curva de serviço convexa ou côncava e, portanto, é possível desacoplar a largura de banda e o atraso. No entanto, mesmo que este documento mencione o tipo de algoritmo de agendamento utilizado (tempo real e compartilhamento de link), ele sempre menciona apenas UMA curva por classe de agendamento (o desacoplamento é feito especificando essa curva, apenas uma curva é necessária). )
Agora, o HFSC foi implementado para o BSD (OpenBSD, FreeBSD, etc.) usando a estrutura de agendamento ALTQ e foi implementado o Linux usando a estrutura de agendamento TC (parte do iproute2). Ambas as implementações adicionaram duas curvas de serviço adicionais, que NÃO estavam no documento original! Uma curva de serviço em tempo real e uma curva de serviço com limite superior. Novamente, observe que o documento original menciona dois algoritmos de agendamento (tempo real e compartilhamento de link), mas nesse documento ambos trabalham com uma única curva de serviço. Nunca houve duas curvas de serviço independentes para nenhuma delas, como você encontra atualmente no BSD e Linux.
Pior ainda, algumas versões do ALTQ parecem adicionar uma prioridade de fila adicional ao HSFC (também não existe prioridade no documento original). Eu encontrei vários HowTo do BSD mencionando essa configuração de prioridade (mesmo que a página de manual da versão mais recente do ALTQ não conheça esse parâmetro para o HSFC, então oficialmente ele nem existe).
Isso tudo torna o agendamento do HFSC ainda mais complexo do que o algoritmo descrito no artigo original e existem muitos tutoriais na Internet que muitas vezes se contradizem, um reivindicando o oposto do outro. Essa é provavelmente a principal razão pela qual ninguém parece realmente entender como o agendamento do HFSC realmente funciona. Antes que eu possa fazer minhas perguntas, precisamos de um exemplo de configuração. Vou usar um muito simples, como pode ser visto na imagem abaixo:
texto alternativo http://f.imagehost.org/0177/hfsc-test-setup.png
Aqui estão algumas perguntas que não posso responder porque os tutoriais se contradizem:
Para que eu preciso de uma curva em tempo real? Supondo que A1, A2, B1, B2 sejam todos os compartilhamentos de 128 kbit / s (sem curva em tempo real para qualquer um), cada um deles receberá 128 kbit / s se a raiz tiver 512 kbit / s para distribuir (e A e B são ambos 256 kbit / s, é claro), certo? Por que eu daria adicionalmente a A1 e B1 uma curva em tempo real com 128 kbit / s? Para que isso seria bom? Para dar a esses dois uma prioridade mais alta? De acordo com o artigo original, eu posso dar a eles uma prioridade mais alta usando uma curva , é disso que se trata o HFSC. Ao dar a ambas as classes uma curva de [256kbit / s 20ms 128kbit / s], ambas têm o dobro da prioridade que A2 e B2 automaticamente (ainda obtendo apenas 128 kbit / s em média)
A largura de banda em tempo real conta para a largura de banda de compartilhamento de link? Por exemplo, se A1 e B1 possuem apenas largura de banda de 64kbit / s em tempo real e de 64kbit / s de compartilhamento de link, isso significa que, uma vez que são atendidos 64kbit / s em tempo real, o requisito de compartilhamento de link também é atendido (eles podem obter excesso de largura de banda, mas vamos ignorá-lo por um segundo) ou isso significa que eles recebem outros 64 kbit / s via compartilhamento de link? Então, cada classe tem um "requisito" de largura de banda em tempo real mais compartilhamento de link? Ou uma classe possui apenas um requisito mais alto que a curva em tempo real se a curva de compartilhamento de link for maior que a curva em tempo real (o requisito atual de compartilhamento de link é igual ao requisito especificado de compartilhamento de link menos a largura de banda em tempo real já fornecida para este classe)?
A curva do limite superior também é aplicada em tempo real, apenas ao compartilhamento de link ou talvez a ambos? Alguns tutoriais dizem uma maneira, outros dizem a outra maneira. Alguns até afirmam que o limite superior é o máximo para largura de banda em tempo real + largura de banda de compartilhamento de link? O que é a verdade?
Supondo que A2 e B2 sejam 128 kbit / s, faz alguma diferença se A1 e B1 forem apenas compartilhamento de link de 128 kbit / s ou compartilhamento de link de 64 kbit / s em tempo real e compartilhamento de link de 128 kbit / s? , que diferença?
Se eu usar a curva separada em tempo real para aumentar as prioridades das classes, por que eu precisaria de "curvas"? Por que o tempo real não é um valor fixo e o compartilhamento de link também é um valor fixo? Por que ambas as curvas? A necessidade de curvas é clara no artigo original, porque há apenas um atributo desse tipo por classe. Mas agora, tendo três atributos (tempo real, compartilhamento de link e limite superior), para que eu ainda preciso de curvas em cada um? Por que eu gostaria que a forma das curvas (não a largura de banda média, mas suas inclinações) fosse diferente para o tráfego em tempo real e de compartilhamento de link?
De acordo com a pouca documentação disponível, os valores da curva em tempo real são totalmente ignorados para as classes internas (classes A e B), são aplicados apenas às classes foliares (A1, A2, B1, B2). Se isso é verdade, por que a configuração de amostra do ALTQ HFSC (pesquise 3.3 Configuração de amostra ) define curvas em tempo real nas classes internas e afirma que elas definem a taxa garantida dessas classes internas? Isso não é completamente inútil? (nota: pshare define a curva de compartilhamento de link no ALTQ e classifica a curva em tempo real; você pode ver isso no parágrafo acima da configuração de amostra).
Alguns tutoriais dizem que a soma de todas as curvas em tempo real não pode ser superior a 80% da velocidade da linha, outros dizem que não deve ser superior a 70% da velocidade da linha. Qual deles está certo ou ambos estão errados?
Um tutorial disse que você deve esquecer toda a teoria. Não importa como as coisas realmente funcionem (planejadores e distribuição da largura de banda), imagine as três curvas de acordo com o seguinte "modelo mental simplificado": em tempo real é a largura de banda garantida que essa classe sempre terá. link-share é a largura de banda que essa classe deseja tornar-se totalmente satisfeita, mas a satisfação não pode ser garantida. Caso haja excesso de largura de banda, a classe poderá até oferecer mais largura de banda do que o necessário para ficar satisfeita, mas nunca poderá usar mais do que o limite superior diz. Para que tudo isso funcione, a soma de todas as larguras de banda em tempo real pode não estar acima de xx% da velocidade da linha (veja a pergunta acima, a porcentagem varia). Pergunta: Isso é mais ou menos preciso ou um mal-entendido total do HSFC?
E se a suposição acima é realmente precisa, onde está a priorização nesse modelo? Por exemplo, toda classe pode ter uma largura de banda em tempo real (garantida), uma largura de banda de compartilhamento de link (não garantida) e talvez um limite superior, mas ainda assim algumas classes têm necessidades de prioridade mais altas do que outras classes. Nesse caso, ainda devo priorizar de alguma forma, mesmo entre o tráfego em tempo real dessas classes. Eu priorizaria pela inclinação das curvas? E se sim, qual curva? A curva em tempo real? A curva de compartilhamento de links? A curva do limite superior? Todos eles? Eu daria a todos eles a mesma inclinação ou cada uma diferente e como descobrir a inclinação correta?
Ainda não perdi a esperança de que exista pelo menos uma mão cheia de pessoas neste mundo que realmente entenderam o HFSC e sejam capazes de responder a todas essas perguntas com precisão. E fazer isso sem se contradizer nas respostas seria muito bom ;-)