Estou canalizando a saída de um programa para algum Perl que escrevi. Esse é um processo demorado, às vezes dias, então quero descobrir onde estão meus gargalos e tentar abri-los. Quero saber se os dados estão sendo canalizados para o meu script mais rapidamente do que meu script pode processá-los. Se for esse o caso, tentarei ajustar meu script, mas não se não precisar. Eu vejo falar sobre um sinalizador sendo definido quando o buffer está cheio que impede mais gravações nele, mas como verifico se ou com que frequência esse sinalizador é definido? Alguma ideia?
11
pv
lugar ao longo da corrente do tubo.Respostas:
Eu rastrearia seu script Perl com uma ferramenta de rastreamento de chamada do sistema:
strace
(Linux),dtruss
(OS X),ktrace
(FreeBSD),truss
(Solaris) etc. O objetivo seria ver quanto tempo seu script Perl gasta esperando a leitura de seu stdin e quanto tempo o outro programa gasta aguardando a gravação em seu stdout.Aqui estou testando isso com o escritor como gargalo:
O primeiro número aqui é o tempo desde o início do syscall anterior e o último número é o tempo gasto no syscall. Para que possamos pós-processar um pouco o Perl para agregá-lo ... [*]
Você pode ficar mais sofisticado e criar um script SystemTap ou DTrace que rastreie ambos os lados de uma só vez, rastreie apenas o descritor de arquivo correto e imprima uma boa atualização de status a cada segundo com a porcentagem de tempo que cada um estava esperando pelo outro.
[*] - Aviso: minha agregação bruta não está correta se a leitura / gravação estiver sendo chamada em outros descritores de arquivo; subestimará o tempo de trabalho nesse caso.
A versão do dtrace é bem legal, na verdade.
E a versão SystemTap:
fonte
Você pode inserir um
pv -TC
comando em sua linha de tubulação:pv
usa seu próprio buffer e-T
informa como está cheio, em média, em períodos de 1 segundo (por padrão).Se é sempre 100%, isso significa que
cmd1
é mais rápido produzir do quecmd2
consumi-lo. Caso contrário, é o contrário. Cuidado que os próprios tubos podem conter 64kB.Veja também
-B
para especificarpv
o tamanho do buffer. Você pode usar váriospv
s como em:fonte