找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 6418|回复: 10

ACE 收数 cpu 占用率高

[复制链接]
发表于 2009-6-30 11:13:39 | 显示全部楼层 |阅读模式
int ClientService::handle_input(ACE_HANDLE fd)
    {
        //printf("服务器连接上了");
        const size_t INPUT_SIZE = 4096;
        char buffer[INPUT_SIZE];
        int i;
        ssize_t recv_cnt;
        if ((recv_cnt = this->sock_.recv(buffer, sizeof (buffer)),100) <= 0)
        {
        
            //接受到的数据为0个字节,表明对端已关闭其socket。
            //返回-1,表示工作已完成。
           return -1;
        }
       for(i=0;i<recv_cnt;i++)
       {
           printf("%d",buffer);
       }
       //将数据插入链表   
       for(i=0;i<recv_cnt;i++)
       {
        listTT2000.InsertNode(listTT2000.m_listLength+1,buffer);
       }     
     
        return 0;
    }
我需要做的事:链接成功,接收服务器端接收过来的数据,放入链表中坐解析。我使用的是reactor 模型。
现在的问题是:我如果使用超时,sock_.recv(buffer, sizeof (buffer)),100),则基本处于超时状态,返回值一直为-1.这里,超时和退出分不开。
如果我不使用超时,sock_.recv(buffer, sizeof (buffer)),则当一批数据来时,cpu 使用率爆增。这种问题该怎样来解决呢,谢谢了

[ 本帖最后由 jj601 于 2009-6-30 11:16 编辑 ]
发表于 2009-6-30 13:20:41 | 显示全部楼层
你的意思是sock_.recv(buffer, sizeof (buffer))导致的cpu暴增,
还是 listTT2000.InsertNode(listTT2000.m_listLength+1,buffer);导致的数据暴增呢?

如果是前者,把接收缓存区设置大一点试一下,
如果是后者,那么将所有recv之后的代码都注释掉,
判断是否是自己处理链表的时候出的问题、、
 楼主| 发表于 2009-6-30 13:43:12 | 显示全部楼层

回复 #2 modern 的帖子

谢谢了,确实是其他引起的
 楼主| 发表于 2009-6-30 14:01:57 | 显示全部楼层
那可以怎么来处理我的数据呢,我需要在另外一个线程中处理我的数据
发表于 2009-6-30 14:17:04 | 显示全部楼层
使用消息队列进行缓冲。让另外一个线程进行处理即可。
 楼主| 发表于 2009-6-30 16:09:51 | 显示全部楼层
我数据解析这一块,需要所有的数据是相关联的。我每次只取用其中的156byte做解析。如果采用消息队列的话,那每次取出来的数据我如果要保持连贯性的话,还不是一样要把数据取出来,串成链表,这样不回到原来的问题上去了么?
或者ace 的消息队列有其他的处理方法,能不能给个提示呢,我再看
谢谢了
发表于 2009-6-30 23:19:26 | 显示全部楼层
你的问题和刚才看到的一个有点类似,
“现在的问题是:我如果使用超时,sock_.recv(buffer, sizeof (buffer)),100),则基本处于超时状态,返回值一直为-1.这里,超时和退出分不开。”
在reactor的回教handle_input中,一定是select或waitformultiobjects返回,所以,recv一定不用延时。

“如果我不使用超时,sock_.recv(buffer, sizeof (buffer)),则当一批数据来时,cpu 使用率爆增。这种问题该怎样来解决呢,谢谢了”
recv一般不会导致CPU问题,可能你有大量的内存拷贝,好像不应该loop吧?
//for(i=0;i<recv_cnt;i++) //Why?
       {
              listTT2000.InsertNode(listTT2000.m_listLength+1,buffer);

       }



"ace 的消息队列有其他的处理方法,能不能给个提示呢,我再看'
更好的办法是使用ACE_Message_block来避免内存拷贝。
 楼主| 发表于 2009-7-1 09:38:47 | 显示全部楼层

回复 #7 steven99ca 的帖子

现在我已经发现内存爆增的情况是由于我将数据插入链表造成的。
我需要的数据是顺序解析,每次来的数据放到前一次收到数据的后面,使用message block 的话,我每次发送一次message 到解析线程,也需要将其中的data block 串行起来,这不是仍然要耗资源么,或者说,message block 还有其他的使用方法我不知道的
发表于 2009-7-1 09:44:09 | 显示全部楼层
解析的线程,可以使用ACE_Task,
ACE_Task自身提供的ACE_Message_Quene可以无缝的
与ACE_Message_Block结合起来。
看书C++NPV2第6.2节,有详细的而介绍与使用例子。
发表于 2009-7-1 14:09:48 | 显示全部楼层
原帖由 jj601 于 2009-7-1 09:38 发表
现在我已经发现内存爆增的情况是由于我将数据插入链表造成的。
我需要的数据是顺序解析,每次来的数据放到前一次收到数据的后面,使用message block 的话,我每次发送一次message 到解析线程,也需要将其中的data block 串行 ...

是内存暴增还是cpu暴增?
现在确认问题是由于insert操作,而不是解析操作么?
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-23 03:53 , Processed in 0.023642 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表