c++ 在Linux Ubuntu中运行ACE库版本7.0.6时出现CPU问题

q5lcpyga  于 2023-03-05  发布在  Linux
关注(0)|答案(2)|浏览(144)

从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%

r9f1avp5

r9f1avp51#

这是因为Windows和Linux上底层Reactor实现的行为方式不同。完整的详细信息请参见"The ACE Programmer's Guide"第7.2.3节。Windows WFMO是“边缘触发”的,因此handle_output仅在套接字从不可写变为可写时触发。Linux是“级别触发”的因此只要handle_output返回0并且套接字几乎总是保持可写,它就将继续被回调。
处理这个问题的一种方法是只在应用有东西要写,已经尝试写,但无法完成时才注册输出。这是跨两个平台的可移植行为。本书有更完整的示例和解释。

e4eetjau

e4eetjau2#

对handle_output的返回值进行了更改,以返回-1。这似乎修复了Linux上的问题。我们尝试在handle_output中返回1或2,但没有成功。
如果书中记录了窗口和链接之间的其他区别,你知道吗?

相关问题