提升 scoped_lock 导致 CPU 消耗过多

Posted

技术标签:

【中文标题】提升 scoped_lock 导致 CPU 消耗过多【英文标题】:Too much CPU consumption by boost scoped_lock 【发布时间】:2011-10-26 11:00:30 【问题描述】:

我有一些代码等待共享内存上的写操作。 如果没有人写,它会继续等待。

    Test* Foo::Get() 
    
        boost::interprocess::scoped_lock<boost::interprocess::interprocess_mutex> lock ( mutex ) ; // mutex is boost::interprocess::interprocess_mutex
        if ( this->check == 0 )
            this->interprocessCondition.wait ( lock ) ; // interprocessCondition is boost::interprocess::interprocess_condition

...
    

当我进行采样时,我发现它消耗了大约 90% 的 CPU。

谁能帮我解决这个性能问题?请看附图。

【问题讨论】:

您是在做其他事情还是只是在分析锁? “其他”代码是什么样的? 它只是从其他的共享内存中读取。我分析了完整的可执行文件。 这没有多大帮助。与从共享内存中读取 int 相比,获取锁占用的 CPU 多 很多 是正常的。你可以通过减少锁的细粒度来解决它。 更多调试指向inline void sched_yield(),对于 Windows,它调用 Sleep(1),但我找不到 Mac 的任何定义? 90% CPU 是什么意思?它会在一段时间内创建一个繁忙的循环,还是实际上让给另一个进程? 【参考方案1】:

boost::interprocess,不幸的是,在许多平台(显然包括 OSX)上使用忙等待锁。您将需要使用您的平台本机的锁,该锁实际上处于休眠状态。

【讨论】:

或者幸运的是,这取决于你想要达到的目标。 我添加了 sleep(1) 代替 sched_yield();称呼?现在它非常漂亮。除了我必须注意提升更新而不干扰代码之外,它会不会有任何副作用? @MacGeek,这会大大增加唤醒延迟 但是,Boost 在 Windows 上使用 sleep(1) 吗?效果不应该一样吗? @MacGeek,在 OS X 上,sleep(1) 等待一秒钟。在 Windows 上,Sleep(1) 等待一 毫秒

以上是关于提升 scoped_lock 导致 CPU 消耗过多的主要内容,如果未能解决你的问题,请参考以下文章

错误使用 scoped_lock 导致的内存泄漏?

在持有 boost::interprocess::scoped_lock 时休眠会导致它永远不会被释放

排查linux下java应用cpu占用过高

面试官:如果MySQL引起CPU消耗过大,你会怎么优化?

如果是MySQL引起的CPU消耗过大,如何优化?

使用jstack分析cpu消耗过高的问题