免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5000 | 回复: 9
打印 上一主题 下一主题

[网络子系统] socket吞吐量和时延的困惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-12-18 19:39 |只看该作者 |倒序浏览
本帖最后由 remaper 于 2013-12-19 01:44 编辑

hi,各位好

请教一个问题,最近做了个测试,机器8core + 12G内存,两台机器,ping值0.1ms
一台部署client
一台部署server
数据包大小512bytes

同步模式下(发一个收一个,再发一个收一个),8线程,每个线程32个socket,
使用epoll来管理数据包的收发,总吞吐量可达5w个数据包每秒,数据包的平均时
延在2ms内。
而在异步模式下,每个线程一个socket,控制每秒内发送的频数F,每次发N个包,
例如每秒发F=1000次,每次N=10个数据包,通过nanosleep来实现时间间隔,但是
吞吐量一旦超过某指,时延非常大,5s,而且吞吐量超不过2w,什么原因?

大致看了一下,数据包在缓冲区的时间太长。为什么异步吞吐量提不上去?

贴一份临时代码:

server逻辑:

    while (1) {
        if (poller->Wait(ioev, toev, 1) < 0)
            continue;
        if (ee.happened & EPOLLIN) {
            cur = cli->Read(((char *)&req) + idx, nbytes - idx);
            if (cur > 0) {
                idx += cur;
                if (idx == nbytes) {
                    idx = 0;
                    rtt += rt_mstime() - req.sendstamp;
                    if (crc16(req.__padding, 1024) != req.checksum)
                        printf("fuck check\n");
                    memset(&req, 0, nbytes);
                    cnt++;
                    if (cnt % 1000 == 0 && cnt) {
                        printf("cur avg rtt: %ld\n", rtt/cnt);
                    }
                }
            }
        }
    }


client逻辑:
    while (rt_mstime() <= end_tt) {
        for (i = 0; i < g_pkgs; i++) {
            len = rand() % 512;
            req.sendstamp = rt_mstime();
            idx = 0;
            while (idx < nbytes) {
                ret = cli->Write((char *)&req + idx, nbytes - idx);
                if (ret < 0)
                    return -1;
                else if (ret == 0)
                    printf("fuck again\n");
                idx += ret;
            }
        }
        rt_usleep(intern_tt);
    }

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
2 [报告]
发表于 2013-12-18 21:23 |只看该作者
回复 1# remaper

nanosleep()也不一定能达到纳秒精度的睡眠,而且睡眠时间也不是完全精确的。


   

论坛徽章:
0
3 [报告]
发表于 2013-12-18 21:25 |只看该作者
回复 2# asuka2001


    请问这种差异的主要原因是什么。

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
4 [报告]
发表于 2013-12-18 21:38 |只看该作者
回复 3# remaper

比如你认为每个线程只睡1ms,但是实际上内核可能不能精确地让该线程1ms后就醒来,自然发的包就慢了,接收端也是同样!


   

论坛徽章:
0
5 [报告]
发表于 2013-12-18 21:39 |只看该作者
回复 4# asuka2001


    时间戳是在发送数据包的时候才打上的,所以不是你说的这个原因

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
6 [报告]
发表于 2013-12-18 22:44 |只看该作者
回复 5# remaper

睡眠造成的应该是吞吐量的下降,不过延迟达到5秒的确不清楚怎么回事。我猜测是不是大量的软中断或者高精度定时器带来的中断造成的影响,查查sirq,irq的占用怎么样?


   

论坛徽章:
0
7 [报告]
发表于 2013-12-19 00:05 |只看该作者
回复 6# asuka2001


    都很低。你可以这样测试下:
创建一个socket,一边不停的发1k大小的数据包,send的时候,在数据里面记录一个时间戳,然后另一边不停的读取1k的数据包,读出来后,就知道这个数据包传输花了多长时间了。

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
8 [报告]
发表于 2013-12-19 10:49 |只看该作者
回复 1# remaper
测试的tcp还是udp?

   

论坛徽章:
0
9 [报告]
发表于 2013-12-20 11:37 |只看该作者
回复 8# 瀚海书香


    tcp, 前辈

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
10 [报告]
发表于 2013-12-20 13:16 |只看该作者
回复 9# remaper
tcp的话怀疑是拥塞控制的原因。可否用netperf测试一下,看看吞吐量和延迟情况。

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP