linux高吞吐量socket接收,socket吞吐量和时延的困惑

本帖最后由 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);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值