Os Os desenvolvedores do Cloudflare lançaram informações sobre o trabalho que estão fazendo para otimizar o desempenho de criptografia de disco no kernel Linux, para o qual eles mencionam que prepararam patches para os subsistemas dm-crypt e Crypto API.
Com ele, o teste sintético foi autorizado a dobrar a largura de banda para leitura e escrita, bem como reduzir a latência pela metade. Ao testar em máquinas reais, a sobrecarga de criptografia foi reduzida a quase o nível visto ao trabalhar com um disco sem usar criptografia de dados.
Interesse em melhorar a criptografia dados no disco é porque Cloudflare usa dm-crypt para criptografar dados em unidades usadas para armazenar conteúdo em cache em um CDN. O Dm-crypt funciona no nível do dispositivo de bloco e criptografa as solicitações de E / S para gravar e descriptografar as solicitações de leitura, agindo como uma camada entre o dispositivo de bloco e o driver do sistema de arquivos.
Para avaliar o desempenho dm-crypt usando o pacote de teste de E / S flexível, se medimos a velocidade de trabalho com partições criptografadas e não criptografado em um disco RAM localizado na RAM para eliminar flutuações no desempenho do disco.
Para partições não criptografadas, o desempenho de leitura e gravação permaneceu em 1126 MB / s, mas quando a criptografia foi ativada, a velocidade caiu 7 vezes para 147 MB / s.
No princípio, o uso de algoritmos ineficientes foi suspeitado no sistema criptográfico do kernel. Mas os testes usaram o algoritmo aes-xts mais rápido com 256 chaves de criptografia, cujo desempenho ao executar o "benchmark cryptsetup" é mais de duas vezes superior ao resultado obtido ao testar o disco RAM.
Os experimentos com sinalizadores dm-crypt ajustar o desempenho não funcionou: Quando o sinalizador –perf-same_cpu_crypt foi usado, o desempenho até diminuiu para 136 MB / s, e quando o sinalizador –perf-submit_from_crypt_cpus foi usado, ele aumentou apenas para 166 MB / s.
Uma análise mais profunda da lógica do trabalho mostrou que dm-crypt não é tão simples como parece
Quando uma solicitação de gravação é recebida do controlador FS, dm-crypt não a processa imediatamente, mas em vez disso a coloca na fila "kcryptd", que não é imediatamente entendida, mas quando ocorre um bom momento. Da fila, a solicitação é enviada para a API Linux Crypto para criptografia.
Ao ler primeiro, dm-crypt enfileira "kcryptd_io" um pedido para receber dados da unidade. Depois por um tempo, os dados estão disponíveis e eles são enfileirados "kcryptd" para descriptografia.
Kcryptd envia uma solicitação para a API Linux Encryption, que descriptografa as informações de forma assíncrona. As solicitações nem sempre passam por todas as filas, mas no pior dos casos, a solicitação de gravação é definida em filas até 4 vezes e a solicitação de leitura até 3 vezes. Cada golpe na cauda leva a atrasos, que são a principal razão para uma diminuição significativa no desempenho do dm-crypt.
Considerando que as unidades modernas tornaram-se mais rápidas e inteligentes, o sistema de alocação de recursos no kernel Linux foi revisado e alguns subsistemas foram redesenhados, Os engenheiros da Cloudflare adicionaram um novo modo operacional ao dm-crypt, eliminando o uso de filas adicionais e chamadas assíncronas.
O modo é habilitado por um sinalizador "force_inline" separado e traz dm-crypt na forma de um proxy simples que criptografa e descriptografa solicitações de entrada. A interação com a Crypto API foi otimizada por meio de uma escolha explícita de algoritmos de criptografia Eles operam em modo síncrono e não usam filas de solicitações.
Ao testar a carga em servidores reais, a nova implementação apresentou desempenho muito próximo da configuração que funciona sem criptografia e a inclusão de criptografia em servidores com cache Cloudflare não afetou a velocidade de resposta.
No futuro, Cloudflare planeja transferir os patches preparados para o kernel Linux principal, mas antes terão que ser modificados, pois são otimizados para uma determinada carga e não cobrem todas as áreas de aplicação.
fonte: https://blog.cloudflare.com