如何查找套接字传输/接收字节数的数量

4

为了进行基准测试,我目前正在寻找一种方法来基准测试一些似乎存在问题的TCP连接。为此,我希望在程序运行时记录一些性能指标。虽然我已经记录了每个操作的时间,但这只告诉我传输对于使用情况来说太长。

我需要的是一种简单的方式,在定期间隔内跟踪读/写字节数。通常我会手动添加基准测试,但套接字在库中使用,因此我无法轻松地检测读/写调用。我猜测Linux提供了一些方便的方法来完成这项任务,但我找不到它。

我已经查看了getsockopt()TCP_INFO标志的可能性,但从文档中我只能看到如何从中获取窗口大小等信息,而无法获取读/写字节数。

有没有办法从Linux获取此信息?

5个回答

1
我认为目前最有趣的方法是使用eBPF在tcp_sendmsg(用于传输)和tcp_cleanup_rbuf(用于接收)上注入KProbe。
例如(并且有工作代码),请查看BCC项目tcptop工具: https://github.com/iovisor/bcc/blob/master/tools/tcptop.py#L160 从引用的代码中,忽略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;
}

希望它有所帮助!

1
尝试使用 tcpdump,定义一个过滤器,仅监听程序通信的端口/地址,并总结打印的长度属性。

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

请注意,对于我来说,接收的字节数是唯一重要的值,如果需要,可以使用模板提取发送的字节数。
将睡眠值更改为所需的任何间隔(以秒为单位),如果需要,可以重定向到文件。

0
使用 内核探针,您可以在运行时“打入”内核/系统调用并读取/记录它们的参数。对于 read()/recv*() 和/或 write()/send*() 进行此操作可能会有所帮助。

0

你可以查看 /proc/net/tcp 文件的内容,读取一些接收/发送统计信息。大多数 Linux 系统上的 netstat 实用程序也可以以更清晰的方式执行相同的操作。

在你的程序中,在不同时间点解析此文件,以收集有关套接字接收/发送的字节数的信息,尽管我不确定它是否可以将字节映射到特定的 TCP 套接字。


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