Como dizer o 'gargalo' em um comando muti-pipe

2

Digamos que eu tenha um comando usando vários canais. Este poderia ser qualquer comando, mas por exemplo, vamos usar este simples corte e ordenação. por exemplo

cat data.tsv | cut -f1,5,8,12 | sort | uniq -c | sed -e "s/cat/dog/g" | sort -k1nr > output.tsv

Como posso 'perfil' isso?

Existe alguma maneira que eu posso dizer que é o sed ou o uniq que está retardando meu tempo de execução?

No meu mundo ideal, adoraria ver algo como:

1- cat: 15 lines per second
2- cut: 13 lines per second
3- sort: 6 lines per second
4- uniq: 6 lines per second (Limited by input)
5- sed: 6 lines per second (Limited by input)
6- sort 6 lines per second (Limited by input)
7- write 6 lines per second (Limited by input)

Alguma idéia?

    
por TrewTzu 24.11.2016 / 06:04

1 resposta

2

Sugiro usar pv para contar linhas por meio de um pipe. Com pv você pode passo a passo encontrar o gargalo.

cat data.tsv | pv -lr > /dev/null

cat data.tsv | cut -f1,5,8,12 | pv -lr > /dev/null

cat data.tsv | cut -f1,5,8,12 | sort | pv -lr > /dev/null

cat data.tsv | cut -f1,5,8,12 | sort | uniq -c | pv -lr > /dev/null

...

Exemplo com a saída do pv:

timeout 10 yes | sed 's/yes/foo/' | rev | pv -lr >/dev/null
[ 120k/s] 
    
por 24.11.2016 / 07:25

Tags