【问题标题】:Non blocking CORBA C++ server: how to avoid 100% CPU utilization?非阻塞 CORBA C++ 服务器:如何避免 100% CPU 利用率?
【发布时间】:2014-07-29 15:09:21
【问题描述】:

我正在用 C++ 开发一个 CORBA 服务器。由于各种原因(主要是因为我在主线程中还有其他任务要执行),我想使用非阻塞 API work_pending()perform_work()

简单的 sn-p 代码是:

while ( !shutdown )
{
    if ( orb -> work_pending() )
        orb -> perform_work();
    if ( <other_requests> ) // my queue of non-corba activities
        <process_request>;
}

但是,此代码以 100% 使用 CPU。

我猜 100% 的 CPU 利用率是不可接受的,即使在 [多核] 服务器中也不行(您能确认一下吗?),所以我对这个问题的解决方案是使用 sleep_until 改进 while 循环:

while ( !shutdown )
{
    system_clock::time_point now = system_clock::now();

    while ( orb -> work_pending() )
        orb -> perform_work();

    while ( <other_requests> )
        <process_request>;

    std::this_thread::sleep_until( now + milliseconds( 10 ) );
}

使用此解决方案,我可以确保 10 毫秒的最大响应时间和空闲时的低 CPU 负载。
当然我可以调整 10ms 的值来平衡这两个参数。

我的问题是:

  1. 这是一个有效的解决方案吗?
  2. 在我的情况下,是否有解决 100% CPU 问题的“标准”方法?

注意:我已经知道我可以使用阻塞 ORB::run() + 多线程,但我的问题是关于非阻塞 API ORB::perform_work(),所以请不要浪费时间问我为什么我想使用单线程架构,请不要提出ORB::perform_work() 的替代方案。我只是在尝试不同的架构。谢谢。

【问题讨论】:

  • 如果你调用yield()而不是睡眠,会发生什么?
  • 第二种设计有一个潜在的缺陷,如果orb-&gt;work_pending()长时间没有变为false(例如因为工作复杂),那么在此期间其他请求将不会被处理。此外,在这种情况下,sleep_forsleep_until 更易于阅读。
  • @ElliottFrisch 不幸的是 yield() 我得到了同样高的 CPU 负载。
  • 看起来您采用的方法是使用所谓的轮询循环来轮询服务,以查看是否有工作要做。虽然肯定有轮询循环的应用程序,但它们往往具有一些不良特性,例如 100% CPU 利用率,除非使用像 sleep()yield() 这样的措施或其他措施来允许其他线程和进程访问 CPU。如果使用yield(),另一个建议是降低线程优先级。您可能还需要删除进程优先级。你真的应该使用阻塞或信号架构。
  • 多线程有什么问题?

标签: c++ architecture cpu-usage corba


【解决方案1】:

如果你使用会发生什么

CORBA::ORB::work_pending (ACE_Time_Value &tv)

改为?

我不确定我是否正确理解了文档。但看起来这最多等待某件事发生 tv 秒,然后返回。与 10 毫秒的睡眠相比,优势在于,如果在这 10 毫秒内 ORB 中发生了什么事情,您可以立即做出反应,没有任何延迟。当然,如果在其他请求中发生了一些事情,你仍然有 10 毫秒的延迟......

【讨论】:

  • +1 文档真的很糟糕,但您似乎已经挖出了一个很好的功能。到目前为止,这是实现它的首选方式。
  • 是的,这就是使用 TAO 的方式,使用将 ACE_Time_Value 作为参数的 work_pending/perform_work 操作来指定持续时间。
  • 不幸的是,您建议的功能不是标准的,而是您只能在特定 ORB 库(即“TAO”)中找到的专有扩展。恐怕我不能接受这是一个有效的答案。对不起。
  • 啊,我明白了......太糟糕了,我认为这将是一个非常好的解决方案:)
  • 在这种情况下,我认为您的解决方案与没有多个线程的情况一样好。 100% CPU 不是要走的路。但我猜你可能会在不到 10 毫秒的时间内侥幸逃脱,而 CPU 仍然几乎处于空闲状态。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-25
  • 1970-01-01
  • 2012-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多