如果我正确理解你,对于网络特定的系统调用,你基本上对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。
你问,如何获得所需的数据,以便为任意的网络程序提出这样的基准? – none 2009-06-05 21:27:12