Existe uma maneira de dividir o processo de criptografia / descriptografia em vários núcleos com o SFTP?

2

Estou em um caso em que o processo de criptografia em uma transferência de SFTP maximiza um núcleo da CPU. No entanto, minha largura de banda de E / S (discos, barramentos e rede) está longe de ser maximizada.

Dito isso, o sistema em questão tem vários núcleos: gostaria de aproveitá-los no processo de criptografia / descriptografia.

Isso é possível? Se sim, como?

NB: se for possível, gostaria de evitar conjuntos de patches com modificação não considerada boa o suficiente para serem incluídos no upstream OpenSSH .

    
por JohnW 01.10.2016 / 15:16

1 resposta

3

Não. O protocolo SFTP não deixa muitas oportunidades de paralelização. O protocolo original requer algoritmos de codificação e MAC que não podem ser paralelizados em um pacote. O OpenSSH suporta o GCM , que pode ser paralelizado, mas o OpenSSH não tenta paralelizar dentro de um pacote. Embora o protocolo permita paralelizar o processamento de pacotes sucessivos, o OpenSSH não faz isso.

Por que o OpenSSH não faz paralelismo? Porque a paralelização é complicada para fazer o certo, e só é benéfico para o desempenho em cenários específicos:

  • Na maioria dos cenários, a rede é o gargalo, portanto, otimizar o tempo de CPU não faz sentido.
  • Se o sistema está fazendo outras coisas (incluindo a execução de várias conexões SSH em paralelo), então, a parelização do processamento de SSH é prejudicial ao desempenho de outros processos.
  • A paralelização tem um custo: a carga de trabalho deve ser transmitida aos processadores participantes e os dados devem ser montados quando todos os processadores tiverem terminado. A sincronização tem um custo bastante alto, portanto, a paralelização só é benéfica se cada item de trabalho for suficientemente grande. Para o SSH, a paralelização dentro de um pacote provavelmente não será benéfica.
  • Paralelizar o processamento de vários pacotes seria possível, mas teria um enorme impacto no design do software: teria que haver uma interface complexa entre a camada de dados e a camada de criptografia, em vez de simples fluxo de dados.

O OpenSSH é projetado com a segurança em mente, e a complexidade é inimiga da segurança, por isso seria muito fora do padrão considerar a paralelização. Alguém fez, no entanto: HPN-SSH é um conjunto de correções para OpenSSH que permitem o processamento paralelo. Ainda é mantido a partir de hoje.

O ARMv8 introduz aceleração de hardware para AES, SHA-1 e SHA-256. Se você tiver uma placa ARMv8 (esteja executando um sistema de 32 bits ou 64 bits), certifique-se de que sua biblioteca de criptografia (OpenSSL for OpenSSH) seja compilada com aceleração ARMv8. Alguns pré-ARMv8 possuem aceleração de criptografia proprietária que pode ser exposta pelo kernel Linux, mas o OpenSSL não suporta isto fora da caixa (houve patches do kernel e OpenSSL, mas eles têm um histórico de falhas de manutenção).

Se você não quiser usar as correções HPN, poderá fazer a paralelização acima da camada SSH. Se você tiver muitos arquivos pequenos para transferir, copie-os em lotes e faça o paralelismo dos lotes. Se você tiver um arquivo grande para transferir, copie-o em partes e faça o paralelismo dos blocos.

    
por 03.10.2016 / 00:57