Как точно измерить битрейт, протекающий по именованной трубе? - PullRequest
1 голос
/ 17 июня 2011

если у меня есть proc1 | proc2, есть ли способ точно измерить битрейт, протекающий по трубе, без изменения поведения, как если бы измерительного устройства там не было? будет что-то вроде тройника работать хорошо? хотел бы я proc1 | tee proc2 > flow_measurement_thing или proc1 | tee flow_measurement_thing > proc2? Если я правильно понимаю каналы, Unix-каналы по умолчанию могут жевать 4096 байт и могут блокироваться, если приемник не считывает данные так быстро, как они поступают, поэтому я обеспокоен тем, что само измерительное устройство может вызвать «ламинарный» поток через труба, чтобы стать «турбулентной», если я не реализую ее правильно.

фактический вариант использования склеен в python с именованными каналами из os .. вот очень упрощенный пример

import os, subprocess
os.mkfifo('pipe')
subprocess.Popen(['convert', '-i', 'pipe', '-o', 'somewhere_else'])
subprocess.Popen(['capture', '-o', 'pipe'])

для простоты, давайте предположим, что преобразователь не изменяет битрейт, тогда я хочу быть в состоянии проверить, что capture | convert | /dev/null перекачивает биты с той же скоростью, что и capture | /dev/null

1 Ответ

2 голосов
/ 17 июня 2011

Как сказал Кори Голдберг, вы должны использовать pv. Это очень хороший инструмент, доступный в большинстве * nix систем. Вы могли бы сделать эти вещи:

capture | pv > /dev/null
capture | convert | pv > /dev/null

pv сообщит вам пропускную способность для каждого случая.

Или, если вывод capture является детерминированным, просто используйте таймер.

...