免费注册 查看新帖 |

Chinaunix

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

[Linux] 将完成端口改为EPOLL(EPOLLONESHOT)模型后,处理消息效率没有之前高 [复制链接]

论坛徽章:
6
申猴
日期:2013-10-08 17:32:32金牛座
日期:2013-10-18 19:45:53天秤座
日期:2013-10-18 20:17:34处女座
日期:2014-02-11 10:10:29丑牛
日期:2014-02-15 10:44:15巳蛇
日期:2014-02-18 22:05:54
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-05-31 17:00 |只看该作者 |倒序浏览
如题,请大神们给点见意,折腾好几天了,没有思路

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
2 [报告]
发表于 2013-05-31 17:36 |只看该作者
本帖最后由 linux_c_py_php 于 2013-05-31 17:38 编辑

1, 原本多高, 后来多高.
2, IOCP不需要用户线程做I/O, 所有CPU都可以拿来做逻辑, 如果和epoll相比我打赌是要高效的, 这是reactor和proactor最本质的差别, epoll想快, 比如半同步半异步或者领导者追随者来发挥多线程的能力. IOCP做领导者追随者比epoll做要高效, 也因为proactor>reactor, 并且IOCP是操作系统的异步IO, 不是一个档次.

论坛徽章:
6
申猴
日期:2013-10-08 17:32:32金牛座
日期:2013-10-18 19:45:53天秤座
日期:2013-10-18 20:17:34处女座
日期:2014-02-11 10:10:29丑牛
日期:2014-02-15 10:44:15巳蛇
日期:2014-02-18 22:05:54
3 [报告]
发表于 2013-05-31 18:15 |只看该作者
是这样的,在windows下有一个测试工具,用机器人模拟玩家的发送消息,其中有一条消息是定时发送ping消息(当前发送时间),服务器接受到后原样返回该消息,客户端接受ping消息后,计算发送消息时和接收到消息之间的时间差值,一个机器人很正常,当100个机器人时,有的时间差值很大,相隔20秒左右,(没有消息丢失的情况),不知道有没有好的解决办法回复 2# linux_c_py_php


   

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
4 [报告]
发表于 2013-05-31 18:21 |只看该作者
helpstudy 发表于 2013-05-31 18:15
是这样的,在windows下有一个测试工具,用机器人模拟玩家的发送消息,其中有一条消息是定时发送ping消息(当 ...


啊, 20秒... 程序有错吗- -

论坛徽章:
6
申猴
日期:2013-10-08 17:32:32金牛座
日期:2013-10-18 19:45:53天秤座
日期:2013-10-18 20:17:34处女座
日期:2014-02-11 10:10:29丑牛
日期:2014-02-15 10:44:15巳蛇
日期:2014-02-18 22:05:54
5 [报告]
发表于 2013-05-31 18:32 |只看该作者
呵呵,说错了,是毫秒,跟了一下程序流程,没发现错误的地方,跟踪消息的数据内容和window下都相同,机器发送消息量很大,而且很平繁,回复 4# linux_c_py_php


void * ServerWorkProc(LPVOID lpParameter)
{
        CConnection *  pConnection = NULL;       
        CNetServer * pCPS = (CNetServer * )lpParameter;
        int iEpollHandle = pCPS->GetServerEpollfd(0);
        struct epoll_event event;
        struct epoll_event evReg;
        int numEvents ;
       
        while (true)
        {
                if(pCPS->m_bWorkProcExiting)
                        return NULL;
                numEvents = epoll_wait(iEpollHandle, &event, 1, MAX_EPOLL_WAIT_TIME);
                if( numEvents <= 0)
                {
                        continue;
                }

                pConnection = (CConnection*)event.data.ptr;
                if(pConnection == NULL|| !pConnection->IsConnected())
                        continue;
                if(event.events & EPOLLOUT)
                {
                        if(SendToConnection( pConnection) == FALSE)
                        {
                                epoll_ctl(iEpollHandle, EPOLL_CTL_DEL, pConnection->Socket(), &evReg);
                                pConnection->DisConnected();
                                Log(stderr,"epoll_ctl***SendToConnection fail!\n");                                       
                                continue;
                        }
                }
                else if (event.events & EPOLLIN)
                {
                        if(RecvFromConnection(pConnection) == FALSE)
                        {
                                epoll_ctl(iEpollHandle, EPOLL_CTL_DEL, pConnection->Socket(), &evReg);
                                pConnection->DisConnected();
                                Log(stderr,"epoll_ctl***RecvFromConnection fail!\n");
                                continue;
                        }
                }

                evReg.events = EPOLLIN | EPOLLONESHOT;
                evReg.data.ptr = (void*)pConnection;
                if(epoll_ctl(iEpollHandle, EPOLL_CTL_MOD, pConnection->Socket(), &evReg) != 0)
                {
                        pConnection->DisConnected();
                        Log(stderr,"ServerWorkProc epoll_ctl  fail!\n");       
                }

        }

        return NULL;
}

   

论坛徽章:
6
申猴
日期:2013-10-08 17:32:32金牛座
日期:2013-10-18 19:45:53天秤座
日期:2013-10-18 20:17:34处女座
日期:2014-02-11 10:10:29丑牛
日期:2014-02-15 10:44:15巳蛇
日期:2014-02-18 22:05:54
6 [报告]
发表于 2013-05-31 18:35 |只看该作者
由于代码量太大,无法全部贴出,服务器发送消息是每次发送 512个字节(手动触发的方式进行),从发送队列中取,回复 3# helpstudy


   

论坛徽章:
0
7 [报告]
发表于 2015-12-11 18:53 |只看该作者
楼主!!!
我有个问题想请教你
我看你加了EPOLLSHOT 那么可能你是多个线程使用同一个epfd进行epoll_wait,我的问题是在这种情况下我该在什么时候加EPOLLOUT呢 如果我在加EPOLLOUT的时候其他线程触发了epoll_wait怎么处理呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP