如何准确测量命名管道中的比特率?

1 投票
1 回答
876 浏览
提问于 2025-04-16 19:44

如果我有一个命令组合 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的输出是确定的,那就直接用计时器就行了。

撰写回答