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