Barramento PCIe: as limitações físicas afetam a taxa de transferência?

Vou começar de longe. No inverno passado, fiz um dispositivo USB com um núcleo hospedado no FPGA. Claro, eu realmente queria verificar a largura de banda real deste barramento. Afinal, no controlador - há muito o que fazer. Você sempre pode dizer que há um atraso ou por lá. No caso de FPGAs, vejo um bloco bombeando dados, então ele me disse que há dados nele. Mas defino que tudo foi processado e estou pronto para aceitar uma nova parte (ao mesmo tempo, ele já recebe dados no segundo buffer do mesmo ponto de extremidade). Ótimo, defina a prontidão desde o primeiro compasso e veja o que acontece quando o USB pode "martelar" sem parar.



Mas acontece uma coisa incrível. Se o dispositivo USB 2.0 estiver preso no conector "azul" (que é USB 3.0), a velocidade será de uma. Se em "preto" - outro. Aqui está o meu gráfico da velocidade de gravação USB versus o comprimento dos dados. USB3 e USB2 são o tipo de conector; o dispositivo é sempre USB 2.0 HS.



Eu tentei em máquinas diferentes. O resultado está próximo. Ninguém poderia explicar esse fenômeno para mim. Mais tarde, encontrei o motivo mais provável. E a razão é muito simples. Aqui estão as propriedades do controlador USB 2.0:



Os controladores que controlam o conector "azul" não. E a diferença é de apenas 20%.

A partir disso, concluímos que as limitações de largura de banda nem sempre são determinadas pelas propriedades físicas do barramento. Às vezes, outras coisas são sobrepostas. Hoje passamos com esse conhecimento.

Experiência primária


Então Tudo começou bastante mundano. Houve uma verificação de um programa. O processo de gravação de dados em vários discos simultaneamente foi verificado. O hardware é simples: há uma placa-mãe com quatro slots PCIe. Placas absolutamente idênticas com controladores AHCI são inseridas em todos os slots, cada um dos quais suporta exclusivamente PCIe x1.



Cada placa serve 4 unidades.
E então o seguinte efeito é revelado. Pegamos um disco e começamos a gravar dados nele. Temos uma velocidade de 180 a 220 megabytes por segundo (a seguir, megabytes são 1024 * 1024 bytes):



Tomamos o segundo caminho. A velocidade de gravação é de 170 a 190 MB / s:



Escrevemos imediatamente para ambos - obtemos uma redução de velocidade:



A velocidade total é de cerca de 290 MB / s. Mas o mais incrível é que depuramos (pelo que aconteceu) esse programa nas mesmas unidades, mas em outros canais. E estava tudo bem lá. Transferimos rapidamente para esses canais (eles passarão por outro cartão), obtemos um excelente trabalho:



Vou comprar um slot em uma boa área


Devo dizer imediatamente que não vale a pena culpar tudo pelos componentes de outras pessoas. Tudo aqui é escrito por nós, a partir do próprio programa, terminando com os drivers. Portanto, todo o caminho dos dados pode ser monitorado. O desconhecido vem somente quando a solicitação foi para o hardware.

Após a análise inicial, verificou-se que a velocidade não é limitada nos slots PCIe “longos” e é limitada nos slots “curtos”. Os longos são onde você pode inserir cartões x16 (embora um deles funcione no modo não superior a x4), e os curtos são apenas para cartões x1.



Tudo ficaria bem, mas os controladores nas placas atuais, em princípio, não podem funcionar em um modo diferente do PCIex1. Ou seja, todos os controladores devem estar em condições absolutamente idênticas, independentemente do comprimento do slot! Mas não. Quem vive no "longo" - trabalha rápido, quem no "curto" - lentamente. Bom E rápido - quão rápido? Adicione uma terceira unidade, escreva para as três.

Nos slots "curtos", o limite ainda é de cerca de 290 MB / s:



No "longo" - na região de 400 MB / s:





Eu procurei na Internet inteira. Em primeiro lugar, depois de algum tempo, eu já ri de artigos nos quais diz que o rendimento do PCIe gen 1 e gen 2 para x1 é de 250 e 500 MB / s. Estes são megabytes brutos. Devido à sobrecarga (eu uso essa palavra não russa para indicar uma troca de serviços que segue as mesmas linhas que os dados principais) para a geração 2, obtemos exatamente 400 megabytes por segundo de fluxo útil. Em segundo lugar, teimosamente não consegui encontrar nada sobre o número mágico 290 (olhando para o futuro - ainda não o encontrei).

Ótimo. Tentando examinar a topologia da inclusão de nossos controladores. Aqui está (013-015 - estes são os sufixos do nome do dispositivo pelos quais eu os combinei para distinguir de alguma forma). Verde é rápido, vermelho é lento.



O controlador "015" nem sequer consideramos. Ele mora em um slot privilegiado projetado para uma placa de vídeo. Mas o 013rd está conectado ao mesmo switch que o 012nd de 014th. Como ele é diferente?

Alguns artigos dizem que cartões diferentes podem diferir nas configurações de Max Payload. Estudei o espaço de configuração de todas as placas - esse parâmetro é para todos no mesmo valor mínimo possível. Além disso, a documentação para o chipset desta placa-mãe diz que não pode haver outro significado.



Em geral, vasculhei tudo no espaço de configuração - tudo é configurado de forma idêntica. E a velocidade é diferente! Releia a documentação repetidamente para o chipset - sem configurações de largura de banda. Prioridades - sim, algo foi escrito sobre elas, mas os testes são realizados na completa ausência de carga em outros canais! Ou seja, não está neles.

Por precaução, desliguei o programa de interrupção. A carga do processador aumentou para quantidades insanas, porque agora constantemente lê estupidamente o bit de prontidão, mas as leituras de velocidade não mudaram. Portanto, é impossível culpar este subsistema por problemas.

E quanto a outras placas?


Tentamos mudar a placa-mãe exatamente para o mesmo. Nenhuma mudança. Eles tentaram substituir o processador (havia razões para acreditar que ele estava inutilizando). Além disso, nenhuma alteração na velocidade (mas o processador antigo é realmente inútil). Instalamos uma placa-mãe de nova geração - tudo funciona em todos os slots. Além disso, a velocidade máxima não é mais de 400, mas de 418 megabytes por segundo, mesmo em slots "longos", mesmo em "curtos":



Mas aqui - sem milagres. Com o movimento manual usual (já usado até hoje), lemos o espaço de configuração e vemos que o parâmetro Max Payload está definido não para 128, mas para 256 bytes.

Tamanho de pacote maior - menos pacotes. Menos despesas gerais para enviá-las - dados mais úteis conseguem ser executados ao mesmo tempo. Isso mesmo.

Então, quem é o culpado?


Não darei uma resposta exata para a pergunta do título, com referência aos documentos. Mas meu pensamento foi no seguinte caminho: digamos que a restrição de fluxo esteja definida dentro do chipset. Não pode ser programado, está bem ajustado, mas está. Por exemplo, é igual a 290 megabytes por segundo para cada diff. um casal Mais - ele já está cortado em algum lugar dentro do chipset em seus mecanismos internos. Portanto, no slot "long" (onde você pode colar cartões de até x4), nada é cortado para o cartão dentro do chipset, e descansamos contra o limite físico do barramento x1. No conector "curto", encontramos essa limitação.

De fato, verificar isso não é fácil, mas muito simples. Ficamos no slot 013rd, não no AHCI, mas no controlador SAS, que serve 8 unidades de uma só vez e pode funcionar nos modos PCIe de até x4. Nós conectamos 4 unidades SSD inteligentes a ele. Observamos a velocidade de gravação - tanto quanto a alma se alegra:



Agora, adicionamos os 4 discos que apareceram nos primeiros testes. O desempenho do SSD caiu previsivelmente:



Calculamos a velocidade total que passa pelo controlador SAS, obtemos 1175 megabytes por segundo. Divida por 4 (tantas linhas vão para o slot "longo"), obtemos ... Rolo de tambor ... 293 megabytes por segundo. Em algum lugar eu já vi esse número!

Portanto, dentro da estrutura deste projeto, ficou provado que o problema não está em nosso programa ou driver, mas nas estranhas limitações do chipset, que provavelmente estão "conectadas" firmemente. Foi desenvolvida a metodologia de seleção de placas-mãe que podem ser utilizadas no projeto. Mas, em geral, tiramos as seguintes conclusões.

Conclusão


  • Frequentemente, na vida real, o equipamento tem menos desempenho do que teoricamente possível. As restrições podem até ser impostas pelos drivers, como mostrado no caso do USB. Às vezes é possível pegar equipamentos que (ou cujos drivers) não possuem essas restrições.
  • As limitações podem até não ser documentadas, mas claramente expressas.
  • Muitos artigos dizem que um par diferencial de PCIe gen. 1 e gen 2 fornece aproximadamente 250 e 500 megabytes por segundo, estão errados. Eles copiam o mesmo erro um do outro - um megabyte de dados brutos por segundo. A sobrecarga se acumula em vários níveis da interface. Com uma carga útil máxima de 128 bytes, o PCIe gen2 recebe cerca de 400 megabytes por segundo. Nas gerações mais recentes do PCIe, tudo deve ficar um pouco melhor, pois a codificação física não é 8b / 10b, mas é mais econômica, mas até agora não foi encontrado nenhum controlador de unidade para testar isso na prática.

Source: https://habr.com/ru/post/pt414753/


All Articles