如何测量我的服务器代码的性能和TCP RTT?

5
我创建了一个基本的TCP服务器,以协议缓冲区格式读取传入的二进制数据,并编写二进制消息作为响应。我想要测试往返时间。
我尝试使用iperf,但无法使其多次发送相同的输入文件。是否有其他基准测试工具可以重复发送二进制输入文件?
5个回答

9
如果您可以访问Linux或Unix机器1,建议使用tcptrace。 您只需循环执行二进制流量测试,同时使用wiresharktcpdump文件进行捕获即可。
在获得.pcap文件2后,使用tcptrace -xtraffic <pcap_filename>3进行分析。这将生成两个文本文件,并在名为traffic_stats.dat的文件底部显示所有连接的平均RTT统计信息。
[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() 性能和测试持续时间来调整循环之间的睡眠时间。


注:

  1. 使用Knoppix Live-CD即可。
  2. 过滤只捕获测试流量。
  3. tcptrace能够提供非常详细的每个套接字的统计信息,如果您使用其他选项...
================================
[mpenning@Bucksnort tcpperf]$ tcptrace -lr willers.pcap
剩余1个参数: 'willers.pcap'
Ostermann's 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 (SYNs: 2) (FINs: 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 发送的纯ACK包数: 11 发送的纯ACK包数: 2 发送的SACK包数: 0 发送的SACK包数: 0 发送的DSACK包数: 0 发送的DSACK包数: 0 最大SACK块/确认包: 0 最大SACK块/确认包: 0 唯一发送字节数: 2512 唯一发送字节数: 14336 实际数据包数: 17 实际数据包数: 36 实际数据字节: 2512 实际数据字节: 14336 重传数据包数: 0 重传数据包数: 0 重传数据字节数: 0 重传数据字节数: 0 ZWND探针包数: 0 ZWND探针包数: 0 ZWND探针字节数: 0 ZWND探针字节数: 0 乱序数据包数: 0 乱序数据包数: 0 推送的数据包数: 17 推送的数据包数: 33 发送的SYN/FIN包数: 1/1 发送的SYN/FIN包数: 1/0 请求1323 WS / TS: Y/Y 请求1323 WS / TS: Y/Y 广告窗口规模: 6 广告窗口规模: 1 要求SACK: Y 要求SACK: Y 发送的SACK数: 0 发送的SACK数: 0 紧急数据包数: 0个包 紧急数据包数: 0个包 紧急数据字节数: 0字节 紧急数据字节数: 0字节 MSS请求: 1460字节 MSS请求: 1460字节 最大段大小: 792字节 最大段大小: 1448字节 最小段大小: 16字节 最小段大小: 32字节 平均段大小: 147字节 平均段大小: 398字节 最

2
你可以将一个shell循环包装在类似iperf这样的程序周围。此外,假设iperf可以从文件中读取(因此是stdin)或类似ttcp的程序,则可以允许shell循环将文件cat N次到iperf / ttcp中。
如果你想要一个程序来发送文件、等待二进制响应,然后再发送另一份文件副本,那么你可能需要自己编写代码。

1

您需要在客户端应用程序中测量往返时间,或监视从客户端发送到服务器以及返回客户端的网络流量,以获取完整的时间间隔。在服务器上测量时间将排除服务器中任何内核级别的延迟和所有网络传输时间。


0
作为一个非常简单的高级工具,netcat是首选...所以可以使用类似这样的命令:time (nc hostname 1234 < input.binary | head -c 100),假设响应长度为100字节。

0
请注意,随着负载的增加,TCP性能将下降。如果您要在重负载下进行测试,则需要专业工具,这些工具可以扩展到每秒数千个(甚至在某些情况下为数百万个)新连接/秒或并发的已建立TCP连接。

我在我的博客上写了一篇关于此的文章(如果这被认为是广告,请随意删除,但我认为它与本主题相关):http://synsynack.wordpress.com/2012/04/09/realistic-latency-measurement-in-the-application-layers


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接