如何准确测量命名管道中的比特率?
如果我有一个命令组合 proc1 | proc2
,有没有办法准确测量通过这个管道的数据传输速率,而不影响它的正常运行,就像测量设备不存在一样?使用像 tee 这样的工具可以吗?我应该用 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
正如Corey Goldberg所说,你应该使用pv
。这是一个非常好用的工具,几乎在所有的*unix系统上都能找到。你可以用它做这些事情:
capture | pv > /dev/null
capture | convert | pv > /dev/null
pv
会告诉你每种情况的处理速度。
或者,如果capture
的输出是确定的,那就直接用计时器就行了。