Estou tentando entender como os pipes nomeados funcionam para que eu possa otimizar minha comunicação entre processos unidirecionais. Espero alguma sobrecarga devido à cópia de dados em um buffer circular, que eu pensava estar armazenado na RAM, e assim esperava que o pipe fosse muito mais rápido do que gravar em um arquivo (porque a RAM é maior que o disco).
Em vez disso, descobri que o pipe nomeado (ou pipe anônimo) tem aproximadamente a mesma velocidade de um arquivo. Esta é uma área de trabalho de 3 GHz com uma unidade de disco comum (não em estado sólido), executando o Ubuntu Linux. Aqui está um programa de teste simplificado em Python:
import sys
import time
import random
megabyte = "".join(random.choice("abcdefghijklmnopqrstuvwxyz") for x in range(1024**2))
while True:
before = time.time()
sys.stdout.write(megabyte)
after = time.time()
sys.stderr.write("{} microseconds\n".format(1e6 * (after - before)))
Direcionando diretamente para /dev/null
:
python test.py > /dev/null
produz 2,1 microssegundos (constante) para cada megabyte.
Piping para um arquivo:
python test.py > /tmp/testout.txt
salta entre 500 microssegundos e 930 microssegundos (o maior valor fica mais comum conforme o arquivo fica maior --- presumivelmente, ele está procurando por espaço em disco).
Em seguida, o pipe nomeado:
mkfifo testpipe
cat testpipe > /dev/null &
python test.py > testpipe
produz 640 microssegundos (constante) e um pipe sem nome:
python test.py | cat > /dev/null
também produz 650 microssegundos (constante).
Alguém pode explicar por que a velocidade do cano é mais parecida com a velocidade do arquivo do que a velocidade de /dev/null
? Posso ter um switch em algum lugar que diz: "execute pipes por meio de um buffer baseado em arquivo, em vez de um buffer baseado em RAM", e posso alterar esse switch? Pode ser uma opção de kernel ou uma variável de shell?
Outra interpretação: suponha que a saída do disco salte entre 500 e 930 microssegundos, porque o 500 é apenas um encanamento e o 930 está realmente escrevendo. Então o 500 ~ 640 para a tubulação nos dois casos é equivalente. No entanto, sob essa interpretação, por que há apenas um fator de dois entre o piping e realmente gravar no disco? Os sites que falam sobre os discos RAM dizem que os discos RAM são 50 a 200 vezes mais rápidos que os discos rígidos.