【问题标题】:why sendto cost much more than recvfrom为什么 sendto 的成本远高于 recvfrom
【发布时间】:2016-05-09 18:00:56
【问题描述】:

我编写了一个非常简单的程序,一台 PC 执行 udp sendto,另一台 PC 执行 recvfrom。在 1Gbps 以太网链路上,发送端消耗 13% 的 CPU,而接收端只消耗 5%。
任何人都知道为什么 sendto 的成本比 recvfrom 高这么多,以及任何降低发件人成本的好主意,非常感谢!
主要代码:

while (1)
{
    static int sendLen = 0;
    sendLen = sendto(socketfd, buffer, buflen, 0, (struct sockaddr *)&dest, sizeof(dest));

    totalSize += sendLen;
    ++loopcnt;
    totalsend++;

    if (loopcnt == COUNTNUM)
    {
        clock_gettime(0, &end);
        unsigned int timecost = 1000 * (end.tv_sec - start.tv_sec) + (end.tv_nsec - start.tv_nsec) / 1000000; //ms
        double timecost_double = 1000 * (end.tv_sec - start.tv_sec) + ((double)(end.tv_nsec - start.tv_nsec)) / 1000000;

        printf("UDP APP TX %.1f M bps. PPS %.1f pps  packet size:%d, timecost=%.lf\n", (float)(totalSize * 8) / (timecost_double * 1000),
            (float)(loopcnt*1000) / (timecost), buflen, timecost_double);                     //timecost ms

        start = end;
        totalSize = 0;
        loopcnt = 0;

    }


}

【问题讨论】:

  • 你是如何分析这个来获取 CPU 使用率的,你是如何调整相对于持续时间的总使用率的?这可能是本地缓存的情况,允许您在发送之前更快地写入,而您的 CPU 并没有那么忙,因为它必须等待收到的每个数据包。此外,如果根据您管理连接的方式有其他原因,发布代码可能会有所帮助。
  • 我只是使用'top -H'来检查CPU使用率。

标签: performance udp sendto recvfrom


【解决方案1】:

如果您不在发送方中调用connect,则每次调用sendto 都必须执行隐式临时连接操作,从而使其成本更高。在发送方中添加connect 调用,观察 CPU 使用率下降。

【讨论】:

  • 我添加了一个连接并使用 send 而不是 sendto,现在 CPU 使用率从 13% 下降到 11%,但仍然比 recvfrom 高很多
  • 我使用 'perf top' 来展示热门函数,tops 是:13.90% [kernel] [k] csum_partial_copy_generic 9.97% [kernel] [k] __ticket_spin_lock 3.97% [kernel] [k] fib_table_lookup 3.56% [tg3] [k] tg3_start_xmit
猜你喜欢
  • 2019-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-07
  • 2015-06-09
相关资源
最近更新 更多