使用 iperf3 测量网络吞吐量
你好,我是无能。
前言
我曾尝试使用Elasticsearch接收指标数据并使用kibana进行可视化,但这对于家庭使用来说太不经济了。尽管它是一个分布式系统,但它消耗的资源实在太多,我的精神和我的弱小的家用服务器都无法承受,所以我正在寻找其他方法。
毕竟,触发OOM Killer对电脑来说太可怜了。
虽然我已经准备了其他替代方案,但如果只需要发送指标,那么我将考虑一下要发送的数据本身。
首先,从应用层之下的低层开始。
安装 iperf3
这次,我将使用我的 ThinkPad X1C@Artix Linux 作为发送方,家用服务器@Devuan 作为接收方进行操作。
ThinkPad X1C@Artix Linux
$ sudo pacman -S iperf3
家用服务器@Devuan
$ sudo apt install iperf3
$ sudo ufw allow 5201/tcp
$ sudo ufw reload
apt包的iperf3会弹出一个TUI,询问是否作为守护进程启动,这次我选择n。
这样准备工作就完成了。
测量
在服务器端进行监听。
家用服务器@Devuan
$ iperf -s
在客户端发送。
由于是隔着墙的 Wi-Fi 环境,请多多包涵……反过来说,能够获取到低质量的数据,这是否也算是一种成功呢?
ThinkPad X1C@Artix Linux
$ iperf3 -c DevuanSrvIP
Connecting to host DevuanSrvIP, port 5201
[ 5] local 192.168.10.118 port 41000 connected to DevuanSrvIP port 5201
[ ID] Interval Transfer Bitrate Retr Cwnd
[ 5] 0.00-1.00 sec 10.8 MBytes 90.1 Mbits/sec 0 406 KBytes
[ 5] 1.00-2.00 sec 9.00 MBytes 75.5 Mbits/sec 0 484 KBytes
[ 5] 2.00-3.00 sec 9.38 MBytes 78.6 Mbits/sec 1 485 KBytes
[ 5] 3.00-4.00 sec 7.25 MBytes 60.8 Mbits/sec 0 167 KBytes
[ 5] 4.00-5.00 sec 8.25 MBytes 69.2 Mbits/sec 0 494 KBytes
[ 5] 5.00-6.00 sec 8.62 MBytes 72.3 Mbits/sec 0 496 KBytes
[ 5] 6.00-7.00 sec 9.38 MBytes 78.6 Mbits/sec 1 499 KBytes
[ 5] 7.00-8.00 sec 9.50 MBytes 79.7 Mbits/sec 0 501 KBytes
[ 5] 8.00-9.00 sec 7.62 MBytes 64.0 Mbits/sec 1 505 KBytes
[ 5] 9.00-10.00 sec 7.62 MBytes 63.9 Mbits/sec 0 508 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-10.00 sec 87.4 MBytes 73.3 Mbits/sec 3 sender
[ 5] 0.00-10.02 sec 85.3 MBytes 71.5 Mbits/sec receiver
iperf Done.
仅凭这些,就可以通过 TCP 通信时窗口控制下的重传 (Retr) 和窗口大小 (Cwnd) 来评估网络质量,此外,似乎也可以通过波动差异来评估质量。
如果想简单操作,只需提取sender行即可
$ iperf3 -c DevuanSrvIP | grep "sender"
[ 5] 0.00-10.00 sec 83.8 MBytes 70.2 Mbits/sec 1 sender
从这里通过管道传递给awk,然后将所需信息作为指标数据发送出去,这种方式似乎也是可行的。
结语
此外,我还对磁盘 I/O 的指标数据感兴趣,但定期进行剧烈的磁盘吞吐量测量只会造成麻烦,所以我希望能尽可能小规模地收集到足够的信息。虽然平时不太在意,但如果能看到何时会异常地发生 I/O 等待,那会很有趣。
总觉得应用程序的指标数据到底应该收集到什么程度呢?我感觉需要关注的范围相当广泛。
每种软件都有其设计理念,因此需要从那里入手,弄清楚能输出到什么程度。从外部收集信息的话,似乎是引入模块并让它吐出数据?但如果主要收集仅通过操作系统就能获取的数据,可能会更灵活。
话说回来,如果系统调用是向 CPU 发出指令,那么似乎可以通过某种方式进行追踪,但这又是另一个话题了……
顺便说一下,我过去也曾因为各种原因安装过Elasticsearch,但它对资源消耗很大,如果不是在“随便用多少资源都行!”的环境下,会相当吃力,所以如果将来有那样的环境,我还会再尝试。
但是,这类融入了内存数据库元素的开源软件实在太优秀了,如果使用它,就必须正确判断其是否与目的和代价相符,否则我可能会变成一个只会旁观 RAM 被大量消耗的人,所以我会注意的。
那么,下次再见。请多关照。