我创建了一个基本的 TCP 服务器,它以协议缓冲区格式读取传入的二进制数据,并写入一个二进制 msg 作为响应。我想对往返时间进行基准测试。
我尝试了 iperf,但无法让它多次发送相同的输入文件。是否有其他基准工具可以重复发送二进制输入文件?
我创建了一个基本的 TCP 服务器,它以协议缓冲区格式读取传入的二进制数据,并写入一个二进制 msg 作为响应。我想对往返时间进行基准测试。
我尝试了 iperf,但无法让它多次发送相同的输入文件。是否有其他基准工具可以重复发送二进制输入文件?
如果您可以访问 linux 或 unix 机器1,则应使用tcptrace。您需要做的就是在使用wireshark或tcpdump文件捕获时循环通过二进制流量测试。
获得该.pcap
文件2后,使用tcptrace -xtraffic <pcap_filename>
3进行分析。这将生成两个文本文件,该 pcap 中所有连接的平均 RTT 统计数据显示在名为traffic_stats.dat
.
[mpenning@Bucksnort tcpperf]$ tcptrace -xtraffic willers.pcap
mod_traffic: characterizing traffic
1 arg remaining, starting with 'willers.pcap'
Ostermann's tcptrace -- version 6.6.1 -- Wed Nov 19, 2003
16522 packets seen, 16522 TCP packets traced
elapsed wallclock time: 0:00:00.200709, 82318 pkts/sec analyzed
trace file elapsed time: 0:03:21.754962
Dumping port statistics into file traffic_byport.dat
Dumping overall statistics into file traffic_stats.dat
Plotting performed at 15.000 second intervals
[mpenning@Bucksnort tcpperf]$
[mpenning@Bucksnort tcpperf]$ cat traffic_stats.dat
Overall Statistics over 201 seconds (0:03:21.754962):
4135308 ttl bytes sent, 20573.672 bytes/second
4135308 ttl non-rexmit bytes sent, 20573.672 bytes/second
0 ttl rexmit bytes sent, 0.000 bytes/second
16522 packets sent, 82.199 packets/second
200 connections opened, 0.995 conns/second
11 dupacks sent, 0.055 dupacks/second
0 rexmits sent, 0.000 rexmits/second
average RTT: 67.511 msecs <------------------
[mpenning@Bucksnort tcpperf]$
.pcap
此示例中使用的文件是我在循环执行expect
从我的一台服务器中提取数据的脚本时生成的捕获。这就是我生成循环的方式......
#!/usr/bin/python
from subprocess import Popen, PIPE
import time
for ii in xrange(0,200):
# willers.exp is an expect script
Popen(['./willers.exp'], stdin=PIPE, stdout=PIPE, stderr=PIPE)
time.sleep(1)
您可以根据服务器的accept()
性能和测试的持续时间调整循环之间的睡眠时间。
tcptrace
如果您使用其他选项,则能够获得非常详细的每个套接字统计信息...================================= [mpenning@Bucksnort tcpperf]$ tcptrace -lr willers.pcap 剩余 1 个 arg,以“willers.pcap”开头 Ostermann 的 tcptrace——6.6.1 版——2003 年 11 月 19 日,星期三 看到 16522 个数据包,跟踪了 16522 个 TCP 数据包 经过的挂钟时间:0:00:00.080496, 205252 pkts/sec 分析 跟踪文件经过时间:0:03:21.754962 TCP连接信息: 跟踪 200 个 TCP 连接: TCP连接1: 主机 c: myhost.local:44781 主持人 d:willers.local:22 完成连接:RESET(SYN:2)(FIN:1) 第一个数据包:2011 年 5 月 31 日星期二 22:52:24.154801 最后一包:2011 年 5 月 31 日星期二 22:52:25.668430 经过时间:0:00:01.513628 总包数:73 文件名:willers.pcap c->d: d->c: 总数据包:34 总数据包:39 已发送重置:4 已发送重置:0 发送的确认包:29 发送的确认包:39 发送的纯确认:11 发送的纯确认:2 发送的麻袋 pkts:0 发送的麻袋 pkts:0 dsack pkts 发送:0 dsack pkts 发送:0 最大袋数/确认:0 最大袋数/确认:0 发送的唯一字节数:2512 发送的唯一字节数:14336 实际数据包:17 实际数据包:36 实际数据字节:2512 实际数据字节:14336 rexmt 数据包:0 rexmt 数据包:0 rexmt 数据字节:0 rexmt 数据字节:0 zwnd 探测 pkts: 0 zwnd 探测 pkts: 0 zwnd 探测字节:0 zwnd 探测字节:0 乱序包:0 乱序包:0 推送数据包:17 推送数据包:33 发送的 SYN/FIN pkts:1/1 发送的 SYN/FIN pkts:1/0 请求 1323 ws/ts:是/是 请求 1323 ws/ts:是/是 adv 风级:6 adv 风级:1 请求麻袋:是 请求麻袋:是 发送的麻袋:0 发送的麻袋:0 紧急数据包:0 包 紧急数据包:0 包 紧急数据字节:0字节紧急数据字节:0字节 请求的毫秒数:1460 字节请求的毫秒数:1460 字节 最大段大小:792 字节最大段大小:1448 字节 最小 segm 大小:16 字节 最小 segm 大小:32 字节 平均段大小:147 字节 平均段大小:398 字节 最大获胜广告:40832 字节最大获胜广告:66608 字节 最小获胜广告:5888 字节最小获胜广告:66608 字节 零赢 adv:0 次 零赢 adv:0 次 平均获胜广告:14035 字节 平均获胜广告:66608 字节 初始窗口:32 字节初始窗口:40 字节 初始窗口:1 pkts 初始窗口:1 pkts ttl 流长度:2512 字节 ttl 流长度:NA 丢失数据:0 字节 丢失数据:NA 截断数据:0 字节 截断数据:0 字节 截断数据包:0 pkts 截断数据包:0 pkts 数据传输时间:1.181 秒数据传输时间:1.236 秒 最大空闲时间:196.9 毫秒最大空闲时间:196.9 毫秒 吞吐量:1660 Bps 吞吐量:9471 Bps RTT 样本:18 个 RTT 样本:24 个 RTT 最小值:43.8 毫秒 RTT 最小值:0.0 毫秒 RTT 最大值:142.5 毫秒 RTT 最大值:7.2 毫秒 RTT 平均:68.5 毫秒 RTT 平均:0.7 毫秒 RTT 标准偏差:35.8 毫秒 RTT 标准偏差:1.6 毫秒 3WHS 的 RTT:80.8 毫秒 3WHS 的 RTT:0.0 毫秒 RTT full_sz smpls:1 RTT full_sz smpls:3 RTT full_sz min:142.5 ms RTT full_sz min:0.0 ms RTT full_sz 最大值:142.5 毫秒 RTT full_sz 最大值:0.0 毫秒 RTT full_sz 平均:142.5 毫秒 RTT full_sz 平均:0.0 毫秒 RTT full_sz 标准偏差:0.0 毫秒 RTT full_sz 标准偏差:0.0 毫秒 损失后确认:0 损失后确认:0 segs cum acked: 0 segs 暨 acked: 9 重复确认:0 重复确认:1 三重包装:0 三重包装:0 max # retrans: 0 max # retrans: 0 最小回退时间:0.0 ms 最小回退时间:0.0 ms 最大回退时间:0.0 毫秒 最大回退时间:0.0 毫秒 平均回退时间:0.0 毫秒 平均回退时间:0.0 毫秒 sdv 回退时间:0.0 毫秒 sdv 回退时间:0.0 毫秒 =================================
你总是可以在像 iperf 这样的程序周围加上一个 shell 循环。此外,假设 iperf 可以从文件(因此是标准输入)或 ttcp 之类的程序中读取,可能允许 shell 循环将文件 N 次转换为 iperf/ttcp。
如果您想要一个发送文件的程序,等待您的二进制响应,然后发送该文件的另一个副本,您可能需要自己编写代码。
您将需要测量客户端应用程序中往返时间的时间,或监控进出客户端的网络流量以获得完整的时间间隔。在服务器上测量时间将排除服务器中的任何内核级延迟和所有网络传输时间。
请注意,随着负载的增加,TCP 性能会下降。如果您要在高负载下进行测试,您需要可以扩展到数千(甚至在某些情况下甚至数百万)新连接/秒或并发建立的 TCP 连接的专业工具。
我在我的博客上写了一篇关于这个的文章(如果这被认为是广告,请随意删除,但我认为它与这个线程相关):http ://synsynack.wordpress.com/2012/04/09/realistic-latency-应用层测量
作为一个非常简单的高级工具 netcat 浮现在脑海中......所以time (nc hostname 1234 < input.binary | head -c 100)
假设响应是 100 字节长。