vmsplice é rápido demais
- Alguns programas usam uma chamada de sistema chamada
vmsplice para mover dados mais rapidamente por pipes
- Foi observado que os pipes do Linux são mais lentos do que o esperado quando
vmsplice não é usado
- Um programa para codificar/decodificar código Morse rapidamente está sendo desenvolvido, e ele usa pipes para isso
Escrevendo dados em um ambiente ideal
- O programa abaixo copia dados sem chamadas de sistema
- Usando AVX-512, ele roda a 167 GB/s
- Mesmo ao desativar o AVX-512 e testar com AVX2 e SSE2, foi registrada a mesma velocidade (167 GB/s)
- É possível atingir 167 GB/s desde que a vetorização seja usada
Escrevendo dados em um pipe de verdade
- Foi escrito e medido um programa que grava dados em um pipe, e o resultado foi uma velocidade de 17 GB/s
- Isso é 10 vezes mais lento do que gravar em um buffer
- O profiling mostrou que a maior parte do tempo é gasta nas chamadas
write
- Na função
pipe_write, muito tempo é gasto alocando páginas de memória
- A cópia de dados em si representa apenas 20% do tempo de CPU, mas ainda assim é duas vezes mais lenta que
__memset_avx512_unaligned_erms
A ajuda do vmsplice
vmsplice move buffers do espaço do usuário para o kernel sem copiá-los
- Com
vmsplice, é possível atingir 210 GB/s
vmsplice contorna a parte cara da chamada de sistema write
Conclusão
- Escrever em pipes é 10 vezes mais lento do que escrever em memória bruta
- Isso acontece por causa do custo de bloquear buffers e de salvar e restaurar o contexto SIMD
splice e vmsplice evitam esses custos e movem dados de forma eficiente
Resumo do GN⁺
- Este artigo explica como maximizar o desempenho de pipes no Linux usando
vmsplice
vmsplice melhora muito o desempenho ao mover os dados diretamente, sem copiá-los para o espaço do kernel
- É útil para programas de processamento de dados em alta velocidade, como codificação/decodificação de código Morse
- Outros projetos com funcionalidades parecidas incluem
splice e sendfile
1 comentários
Opiniões do Hacker News
O motivo de
JMPnão ser substituído porRETé a opção CONFIG_RETHUNKRETfoi substituído porJMP __x86_return_thunkAs instruções NOP no início e no fim da função permitem que o ftrace insira instruções de rastreamento
X86_FEATURE_SMAPfor detectado, em tempo de execução elas são preenchidas com as instruções CLAC e STACO side project de um usuário propõe uma system call que fornece um ring buffer para descritores de arquivo
Chamar os pipes do Linux de "lentos" é como chamar um Toyota Corolla de "lento"
Em CPUs modernas,
rep movsbé tão rápido quanto a versão vetorizada mais rápidaAVX512 consome muita energia e provoca escalonamento de frequência da CPU
Estamos vivenciando novamente o "hug of death" do Hacker News
Seria interessante ver uma versão usando io_uring
É uma afirmação ousada dizer que o blog leva cerca de 20 segundos para carregar
Quase toda forma de IPC é "lenta"
No começo eu não entendia por que o splice era tão lento