T tee slow down pipelines?

7

Eu estou querendo saber se o tee retarda os pipelines. Escrever dados no disco é mais lento do que canalizá-lo, afinal.

O tee espera com o envio de dados para o próximo canal até que tenha sido gravado no disco? (Se não, eu acho que o tee tem que enfileirar os dados que foram enviados, mas não gravados no disco, o que parece improvável para mim.)

$ program1 input.txt | tee intermediate-file.txt | program2 ...
    
por The Unfun Cat 15.04.2015 / 18:15

1 resposta

6

Sim, isso atrasa as coisas. E basicamente tem uma fila de dados não gravados, embora isso realmente seja mantido pelo kernel - todos os programas têm isso, a menos que solicitem explicitamente o contrário.

Por exemplo, aqui está um pipe trivial usando pv , o que é legal porque exibe a taxa de transferência:

$ pv -s 50g -S -pteba /dev/zero | cat > /dev/null 
  50GiB 0:00:09 [ 5.4GiB/s] [===============================================>] 100%

Agora, vamos adicionar um tee lá, nem mesmo escrever uma cópia extra - apenas encaminhá-lo:

$ pv -s 50g -S -pteba /dev/zero | tee | cat > /dev/null 
  50GiB 0:00:20 [2.44GiB/s] [===============================================>] 100%            

Então, isso é um pouco mais lento e não estava nem fazendo nada! Essa é a sobrecarga de tee internamente copiando STDIN para STDOUT. (Curiosamente, adicionar um segundo pv nele permanece em 5.19GiB / s, portanto pv é substancialmente mais rápido que tee . pv usa splice(2) , tee provavelmente não.)

De qualquer forma, vamos ver o que acontece se eu disser tee para gravar em um arquivo no disco. Ele começa razoavelmente rápido (~ 800MiB / s), mas à medida que continua, ele continua diminuindo - em última análise, para ~ 100MiB / s, que é basicamente 100% da largura de banda de gravação de disco. (O início rápido é devido ao cache do kernel na gravação do disco, e a lentidão na velocidade de gravação do disco é o kernel recusando deixar o cache crescer infinitamente.)

Isso importa?

O acima é o pior caso. O acima usa um pipe para liberar dados o mais rápido possível. O único uso do mundo real que eu posso pensar assim é a transmissão de dados YUV brutos para / de ffmpeg .

Quando você envia dados a taxas mais lentas (porque você os está processando etc.), isso terá um efeito muito menos significativo.

    
por 15.04.2015 / 20:44

Tags