如何找出套接字的发送/接收字节数

时间:2014-02-21 14:29:35

标签: c linux sockets tcp benchmarking

对于基准测试,我目前正在寻找一种方法来对一些似乎有问题的TCP-Connections进行基准测试。为此,我想在程序运行时记录一些性能指标。我已经记录了每个操作的时间,但这只是告诉我传输对于用例来说太长了。

我需要的是一种简单的方法来跟踪以周期性间隔读/写的字节数。通常我会手动添加基准测试,但是套接字在库中使用,因此我无法轻松地检测读/写调用。我的猜测是linux提供了一些现成的方法,可以做到这一点,但我找不到它。

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

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

5 个答案:

答案 0 :(得分:1)

尝试tcpdump,定义一个过滤器,它只会监听程序正在进行通信的端口/地址,并总结打印长度属性。

答案 1 :(得分:1)

我要说,今天最有趣的方法是使用eBPF在tcp_sendmsg(用于发送)和tcp_cleanup_rbuf(用于接收)处注入KProbe。

有关示例(和工作代码),请从BCC projecthttps://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

请注意,对于我自己来说,接收的字节数实际上是唯一重要的值,如果需要,可以用作模板来提取已发送的字节。

将睡眠值更改为您需要的任何时间间隔(以秒为单位),如果需要,可以重定向到文件。