对于基准测试,我目前正在寻找一种方法来对一些似乎有问题的TCP-Connections进行基准测试。为此,我想在程序运行时记录一些性能指标。我已经记录了每个操作的时间,但这只是告诉我传输对于用例来说太长了。
我需要的是一种简单的方法来跟踪以周期性间隔读/写的字节数。通常我会手动添加基准测试,但是套接字在库中使用,因此我无法轻松地检测读/写调用。我的猜测是linux提供了一些现成的方法,可以做到这一点,但我找不到它。
我已经查看getsockopt()
带TCP_INFO
标志的可能性,但是从文档中我只能看到如何从中获取窗口大小等,但不是读取的字节数/写入。
有没有办法从Linux获取此信息?
答案 0 :(得分:1)
尝试tcpdump
,定义一个过滤器,它只会监听程序正在进行通信的端口/地址,并总结打印长度属性。
答案 1 :(得分:1)
我要说,今天最有趣的方法是使用eBPF在tcp_sendmsg
(用于发送)和tcp_cleanup_rbuf
(用于接收)处注入KProbe。
有关示例(和工作代码),请从BCC project:https://github.com/iovisor/bcc/blob/master/tools/tcptop.py#L160
中检出tcptop
工具
从引用的代码中,忽略IPV6看起来像这样:
int kprobe__tcp_sendmsg(struct pt_regs *ctx, struct sock *sk,
struct msghdr *msg, size_t size)
{
u32 pid = bpf_get_current_pid_tgid();
u16 dport = 0, family = sk->__sk_common.skc_family;
u64 *val, zero = 0;
if (family != AF_INET) {
return 0;
}
struct ipv4_key_t ipv4_key = {.pid = pid};
ipv4_key.saddr = sk->__sk_common.skc_rcv_saddr;
ipv4_key.daddr = sk->__sk_common.skc_daddr;
ipv4_key.lport = sk->__sk_common.skc_num;
dport = sk->__sk_common.skc_dport;
ipv4_key.dport = ntohs(dport);
// pick the entry in the map
val = ipv4_send_bytes.lookup_or_init(&ipv4_key, &zero);
// write to the entry in the map
(*val) += size;
return 0;
}
希望有帮助!
答案 2 :(得分:0)
使用Kernel Probes,你可以“闯入”内核/系统调用,并读取/记录他们的参数。为read()
/ recv*()
和/或write()
/ send*()
执行此操作可能会对您有所帮助。
答案 3 :(得分:0)
你可以查看/proc/net/tcp
文件的内容来阅读一些 recv / send statistics netstat
实用程序,在大多数Linux系统上做同样的事情,但是在更干净的方式。
在你的程序中,在不同的时间点解析这个文件以收集关于套接字上接收/发送的字节的信息,虽然我不确定它是否可以映射特定TCP套接字的字节。
答案 4 :(得分:0)
不确定您是否正在查看套接字或需要计算给定接口上的全部RX / TX字节数。我需要解决后一个问题,掀起了可能对您有用的以下脚本:
while true; do MARKER=$(ifconfig eth0 | grep "[RT]X bytes" | awk '{print $2}' | cut -c 7-); sleep 10; NEWMARKER=$(ifconfig eth0 | grep "[RT]X bytes" | awk '{print $2}' | cut -c 7-); expr ${NEWMARKER} - ${MARKER}; set $MARKER=$NEWMARKER; done
请注意,对于我自己来说,接收的字节数实际上是唯一重要的值,如果需要,可以用作模板来提取已发送的字节。
将睡眠值更改为您需要的任何时间间隔(以秒为单位),如果需要,可以重定向到文件。