从Windows迁移到Linux Ubuntu,Linux Ubuntu中的ACE库版本为7.0.6。
正在侦听通信的服务器套接字:
1.接收套接字连接并接受连接
1.应用程序正在接收过多的handle_output(),其中我们的应用程序继承自Event_Handler.cpp中的ACE_Event_Handler。从ACE对output_handler的过多调用导致CPU问题。
1.我们运行了分析器,我们看到对ACE_handle_Set::Reset()(125,000次调用)和ACE_Event_Handler::set_max(87,000次调用)的大量调用,不确定吗?
我的问题是,是否有一种方法可以停止ACE handle_output()的回调?是什么触发了ACE_handle_Set::Reset()?
在Linux VM或ec2中运行应用程序时,CPU问题相同,高达100%
2条答案
按热度按时间r9f1avp51#
这是因为Windows和Linux上底层Reactor实现的行为方式不同。完整的详细信息请参见"The ACE Programmer's Guide"第7.2.3节。Windows WFMO是“边缘触发”的,因此
handle_output
仅在套接字从不可写变为可写时触发。Linux是“级别触发”的因此只要handle_output
返回0并且套接字几乎总是保持可写,它就将继续被回调。处理这个问题的一种方法是只在应用有东西要写,已经尝试写,但无法完成时才注册输出。这是跨两个平台的可移植行为。本书有更完整的示例和解释。
e4eetjau2#
对handle_output的返回值进行了更改,以返回-1。这似乎修复了Linux上的问题。我们尝试在handle_output中返回1或2,但没有成功。
如果书中记录了窗口和链接之间的其他区别,你知道吗?