通过TCP发送随机数据一段时间,并计算发送了多少字节

Maw*_*ica 4 tcp timeout wc

为了测试数据吞吐量,我想 1) X 秒 2) 发送随机数据 3) 通过 TCP,以及 4) 之后确切知道传输了多少字节。

我最好的尝试(不多)

1) 超时 X
2) dd if=/dev/urandom count=65535 bs=1500
3) > /dev/tcp/<host>/<port>
4) ... ? 我可以用wc -c吗?如果失败,也许将我的随机数据通过管道传输tee到文件中/dev/tcp,然后,当超时结束时,计算文件的字节大小?

谁能提供一个优雅的 bash 命令来做到这一点?


[更新] 这是针对 Linux 的定制版本。对于安全鼠海豚,并非所有命令都可用。我会检查所有建议并尽快回复您。

Bra*_*ley 5

由于您要求解决方案,我将向您展示我提到的解决方案和@SatoKatsura 提到的解决方案。首先,生成随机网络负载通常不是进行负载测试的最有用方法。通常,您需要重新创建高工作负载的现实状态。但是,如果您只是想在任何类型的竞争负载下寻找与另一个工作负载的性能相关的东西,那么向管道中扔随机数据仍然有意义。

从您提到的内容中获得您想要的内容的最直接方式是我在评论中提到的nc. 设置接收端,使其侦听某个随机端口并将输出重定向到/dev/null

[root@listeningServerFQDN ~]# nc -l listeningServerFQDN 1023 >/dev/null
Run Code Online (Sandbox Code Playgroud)

然后在客户端nc再次使用将您的/dev/urandom数据发送到远程端:

[root@transmit ~]# dd if=/dev/urandom count=65535 bs=1500 | nc listeningServerFQDN 1023
Run Code Online (Sandbox Code Playgroud)

在此之后,您可以使用您想使用的任何工具。


这是一种可能的解决方案,另一种是iperf@SatoKatsura 提到的工具。这更适合于出于某种原因只需要某种负载在网络上运行的网络工程师。例如,如果他们想测试他们正在尝试实施的 QoS 策略。在这种情况下,他们并不关心它是否代表工作负载,他们只是在测试带宽是否受到适当限制。

基本iperf用法涉及设置服务器进程:

[root@listeningServerFQDN ~]# iperf -s
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

然后在客户端上运行您的测试:

[root@transmit ~]# iperf -c listeningServerFQDN -r
bind failed: Address already in use
------------------------------------------------------------
Client connecting to transmit.example.com, TCP port 5001
TCP window size: 2.50 MByte (default)
------------------------------------------------------------
[  4] local 10.762.40.95 port 54610 connected with 10.762.40.95 port 5001
[ ID] Interval       Transfer     Bandwidth
[  4]  0.0-10.0 sec  37.1 GBytes  31.8 Gbits/sec
Run Code Online (Sandbox Code Playgroud)

它在服务器实例上复制,将以下内容附加到我的输出中:

[  4] local 10.762.40.95 port 5001 connected with 10.762.40.95 port 54610
[ ID] Interval       Transfer     Bandwidth
[  4]  0.0-10.0 sec  37.1 GBytes  31.7 Gbits/sec
------------------------------------------------------------
Client connecting to 10.762.40.95, TCP port 5001
TCP window size: 4.00 MByte (default)
------------------------------------------------------------
[  4] local 10.762.40.95 port 54640 connected with 10.762.40.95 port 5001
[  5] local 10.762.40.95 port 5001 connected with 10.762.40.95 port 54640
[  4]  0.0-10.0 sec  37.4 GBytes  32.1 Gbits/sec
[  5]  0.0-10.0 sec  37.4 GBytes  32.1 Gbits/sec
Run Code Online (Sandbox Code Playgroud)

显然,您可以从那里分支出来,但您会了解总体思路,并且可以查看手册页了解其他所有内容。


我的两分钱:我真的与坚持nc解决办法,如果你的条件真的只是“随机发送数据向下管道”nc是一个普遍有用的工具,你可以用做不止这一件事情,我会怀疑使用情况因为iperf非常狭窄。

我会使用nc(或您更喜欢的任何工具)进行基本测试,然后逐渐模拟实际负载,而不是进行iperf另一个“管道中的随机数据”测试。

  • `iperf` 的一个用例是确定最佳窗口大小。然后相应地设置相应的`sysctl`s。FWIW。关于一个不相关的话题:你能保证从 `/dev/urandom` 读取根本不需要时间吗?总是,不管负载?:) (2认同)