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

Posted

技术标签:

【中文标题】如何准确测量流经命名管道的比特率?【英文标题】:how to acurately measure the bitrate flowing through a named pipe? 【发布时间】:2011-06-17 01:16:53 【问题描述】:

如果我有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 相同的速率抽取比特

【问题讨论】:

pv(管道查看器)有帮助吗? ivarch.com/programs/pv.shtml 是的,这就是诀窍。谢谢! 【参考方案1】:

正如 Corey Goldberg 所说,您应该使用 pv。这是一个非常好的工具,可在大多数 *nix 系统上使用。你可以做这些事情:

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

pv 会告诉您每个案例的吞吐量。

或者,如果capture 的输出是确定性的,则只需使用计时器。

【讨论】:

如何强制pv 以b/s 表示吞吐量?我正在尝试使用netcat 测量不同位置的 WLAN 吞吐量。目前我只是使用 Gnome System Monitor 来测量 WiFi 接口的吞吐量,但将来我想使用像 pv 这样的命令行工具。 @JamesHaigh:在我的系统上(带有 MacPorts 的 Mac OS,使用 port install pv), pv 打印 B/s(每秒字节数)。如果您说需要位而不是字节,那么只需乘以 8。;) @JohnZwinck:我希望它以 b/s 的形式 实时。是否有一些命令行魔法可以切碎 stderr,将值乘以 8,并重建输出以与pv 的正常输出相同的方式工作?我喜欢 pv 刷新到位的方式,但现在我将使用我知道如何以 b/s 表示值的工具来监视网络接口。 @JamesHaigh:我不知道,我认为您最好按照您所说的使用网络监控工具来监控网络。 pv 对我来说更像是一个快速而肮脏的工具来增强我的交互式 CLI 工作。

以上是关于如何准确测量流经命名管道的比特率?的主要内容,如果未能解决你的问题,请参考以下文章

如何避免并行命名管道的死锁?

SIGPIPE 如何影响命名管道中的作者?

如何将命名管道c#服务器连接到命名管道php客户端

如何写入命名管道而不等待读取管道

如何在 perl 中读/写命名管道?

如何阻止在 Ruby 中读取命名管道?