首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何找出套接字的发送/接收字节数

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

Stack Overflow用户
提问于 2014-02-21 22:29:35
回答 5查看 2.7K关注 0票数 3

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

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

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

有没有办法从Linux上获取这些信息?

EN

回答 5

Stack Overflow用户

发布于 2014-02-21 22:33:55

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

票数 1
EN

Stack Overflow用户

发布于 2018-07-30 21:55:10

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

有关示例(和工作代码),请查看BCC projecthttps://github.com/iovisor/bcc/blob/master/tools/tcptop.py#L160中的tcptop工具

从引用的代码中,忽略IPV6如下所示:

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2014-02-21 22:38:32

使用Kernel Probes,您可以动态地“闯入”内核/系统调用,并读取/记录它们的参数。对read()/recv*()和/或write()/send*()执行此操作可能会对您有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21937162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档