对于基准测试,我目前正在寻找一种方法来对一些似乎有问题的TCP连接进行基准测试。为此,我想在程序运行时记录一些性能指标。我已经记录了每个操作的时间,但是这只是告诉我传输对于用例来说太长了。
我需要的是一种简单的方法来跟踪定期读取/写入的字节数。通常我会手动添加基准测试,但是套接字是在库中使用的,所以我不能轻松地检测读/写调用。我的猜测是linux提供的一些现成的方法可以做到这一点,但我找不到它。
我已经研究了使用TCP_INFO标志的getsockopt()的可能性,但从文档中我只能看到如何从中获取窗口大小等信息,而不是读取/写入的字节数。
有没有办法从Linux上获取这些信息?
发布于 2014-02-21 22:33:55
尝试使用tcpdump,定义一个只监听您的程序正在通信的端口/地址的过滤器,并汇总打印的长度属性。
发布于 2018-07-30 21:55:10
我要说的是,目前最有趣的方式是使用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;
}希望它能帮上忙!
发布于 2014-02-21 22:38:32
使用Kernel Probes,您可以动态地“闯入”内核/系统调用,并读取/记录它们的参数。对read()/recv*()和/或write()/send*()执行此操作可能会对您有所帮助。
https://stackoverflow.com/questions/21937162
复制相似问题