12

首先,有点背景。分布式版本控制系统(DVCS)的许多比较比较了存储库的大小或运行的基准速度。我没有发现任何能够测试各种DVCS的网络性能,以及使用的各种协议......除了测量涉及网络的操作(命令)速度(如“克隆”,“拉取”/“取出”或“推送”)之外。如何测量网络性能(如何基准网络协议)

我想知道那你怎么做这样的比较;如何测量应用程序的网络性能,或如何基准网络协议。我在这里想到的还包括测量性能对网络带宽和网络延迟(ping时间)的依赖性;一些协议以更多往返交换(协商)的形式牺牲延迟来发送最少的所需最终“包”。

如果可能,我宁愿只涉及一台计算机的解决方案。我希望看到开源解决方案,在Linux上工作。但我也欢迎更通用的答案。

优选OS: Linux的
优选的语言: C,Perl中,外壳脚本


可能的测量:

  • 的总字节数从服务器传送到客户端,从客户端到服务器裂变;这也可以用来测量协议(带宽)
  • 数往返(连接)在一个事务(等待时间)的网络操作的速度(时间花费克隆的
  • 依赖性/开销(ping时间)

如何进行这样的测量(如基准测试)?


添加2009年2月6日:
甲简单的基准(测量)。将time命令的网络版本,即,命令运行该会给我传输的字节数,并数往返/给定命令执行期间的网络连接。


添加2009年9月6日:上面的time命令的网络版本溶液提到
假想输出可能看起来像以下:

$ ntime git clone -q git://git.example.com/repo.git 
... 
bytes sent: nnn (nn kiB), bytes received: nnn (nn kiB), avg: nn.nn KB/s 
nn reads, nn writes 

注意,这是只是一个示例输出,详细描述了人们可能想要获得的信息。


新增2009年9月6日:
看起来有些什么,我想可以使用测试网络协议Dummynet在,工具(原来)来来达到的......

+0

你问,如何获得所需的数据,以便为任意的网络程序提出这样的基准? – none 2009-06-05 21:27:12

回答

15

如果我正确理解你,对于网络特定的系统调用,你基本上对Linux 'strace'Introduction)感兴趣?

对于网络应用程序(即'ntrace'),可能是探查器和调试器的组合,提供各种可选测量的详细分析?

在Linux下,strace效用很大程度上基于由Linux内核提供的功能,即ptrace (process tracing) API:

使用ptrace的,它应该是能够获得大多数您感兴趣的数据。

在Windows上,你可能会想看看detours为了拦截/重定向Winsock API调用以进行检查/基准测试。

如果你真的不需要那么多低级信息,你可能也可以直接使用strace(在linux上)并且只用它来跟踪某些系统调用,例如考虑下面这行只跟踪调用到开放系统调用(使用附加-o FILE参数,可以将所有输出到输出文件重定向):

strace -e trace=open -o results.log

通过传递一个额外的-v标志与strace,可以增加其详细程度得到更多的信息(当使用由许多小型shell工具和独立工具组成的git等SCM时,您可能还需要考虑使用-f标志以便也遵循分叉过程)。

所以,你会是什么兴趣,是涉及到sockets所有的系统调用,即:

  • 接受
  • 结合
  • 连接
  • getpeername
  • getsockname
  • getsockopt
  • 的recv
  • recvfrom的
  • 发送
  • SENDTO
  • setsockopt的
  • 关机
  • 插座
  • socketpair

(在开始的时候,你可能只需要不过,请考虑处理send .../recv ...调用)

为了简化这个,你也可以使用“网络”作为参数跟踪,这将跟踪所有网络相关的呼叫:

-e跟踪=网络:跟踪所有网络相关的系统调用。

所以,相应的strace的调用看起来是这样的:

strace -v -e trace=accept,bind,connect,getpeername,getsockname,getsockopt,listen,recv,recvfrom,send,sendto setsockopt,shutdown,socket,socketpair -o results.log -f git pull

当程序运行完毕后,你会那么主要是想检查日志文件,以评估数据,这然后可以通过使用正则表达式轻松实现。

例如,在运行时,在一个linux壳以下: strace -v -o wget.log -e trace=connect,recv,recvfrom,send,sendto wget http://www.google.com

所得日志文件包含这样的信息:

  • 的recv(3,“HTTP/1.0 302实测值\ r \ nLocation:htt“...,511,MSG_PEEK)= 511
  • sendto(4,”\ 24 \ 0 \ 0 \ 0 \ 26 \ 0 \ 1 \ 3^\ 206 * J \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0“...,20,0,{sa_family = AF_NETLINK,pid = 0,groups = 00000000},12)= 20

查看这两个系统调用的手册页,显然511和20分别是传输的字节数。如果您还需要具体的时序信息,你可以通过-T标志与strace:

-T - 在每个系统调用花费了打印时间

此外,你可以通过得到一些统计数据-c标志:

-c:计算每个系统调用的时间,调用和错误并报告程序 exit的摘要。在Linux上,这会尝试显示独立于挂钟时间的系统时间(花费在内核中的CPU时间) 。如果-c与-f或-F(如下)一起使用,则仅保留所有跟踪进程的总计 总计。

如果你还需要检查处理的实际数据,你可能要考虑读/写说明符:

-e读=集:执行所有的全十六进制和ASCII转储从指定集中列出的文件 描述符中读取的数据。例如,要查看文件 描述符3和5上的所有输入活动,请使用-e read = 3,5。请注意,这与通过选项-e trace = read控制的read(2)系统调用的正常 跟踪无关。 -e write = set:对写入到指定集中列出的文件 描述符的所有数据执行完整的十六进制和ASCII转储。例如,要查看文件 描述符3和5上的所有输出活动,请使用-e write = 3,5。请注意,这与通过选项-e trace = write控制的write(2)系统调用的正常跟踪 无关。

您还可以自定义字符串的最大长度:

-s了strsize:指定最大字符串大小打印(默认为32)。需要注意的是 文件名不被视为字符串,并且始终打印全

或者字符串转储为十六进制:

-XX:打印十六进制字符串格式的所有字符串。

因此,使用strace的大部分如此,似乎是一个很好的混合方法,因为它是很容易做到的,但还是有水平低一个很好的信息可用数量,如果你发现你需要额外的低您可能需要考虑扩展strace,或者使用strace project on sourceforge提交相应的功能请求。

但是,想一想更多的内容,实现一个相当简单的网络流量基准测试的一个较少涉及和更平台不可知的方式将是在客户端和实际服务器之间使用某种形式的中间层:a服务器基本上是测量,分析和重定向到真实服务器的流量。

非常像代理服务器(例如SOCKS),因此所有流量都通过分析器进行隧道传输,从而可以累积统计数据和其他指标。

这样的基本版本可能很容易通过使用netcat和一些shell脚本放在一起,但更复杂的版本可能会受益于使用perl或python。

对于SOCKS服务器的python实现,您可能需要查看pysocks

此外,还有当然twisted为蟒蛇:

Twisted是用Python写的 并授权在MIT许可下的事件驱动的网络引擎。

如果您确实需要更多的低级信息,那么您可能真的需要考虑拦截系统调用。

如果您还需要协议特定的效率数据,则可能需要查看tcpdump

5

可能回答将使用SystemTap。在示例脚本中,有nettop,它以“顶级”方式显示(一些)所需的网络信息,并且有iotime脚本以所需的形式显示I/O信息。