我们的多线程服务器具有数百个连接线程,这些线程负责IO处理和回复传入的请求。

还有另一个异步线程可以运行相对繁重的任务,并时不时地进行许多分配(例如每隔几秒钟)。

一旦我将该线程转换为一个小的线程池(即,这些任务现在每次都从不同的线程运行),我们的服务器通常具有相同的CPU使用率,但它可能突然达到这样的状态:所有操作之间的分配需要更多的时间并且整个CPU服务器的使用率从2核增加到3.7核,几乎翻了一番。

到目前为止,我的主要理论是,我以某种方式更改了tcmalloc库的访问模式,这会导致CPU随机提升。为了确认该理论,我应该在tcmalloc统计信息中查看什么?难道是现在从不同线程(但不是同时)运行的同一代码导致tcmalloc从中央高速缓存分配的内容比从线程高速缓存分配的更多吗?

最佳答案

正如一些评论者所建议的那样,虚假共享可能是问题所在。寻找虚假共享非常困难,目前的工具还没有很好的支持。我的研究小组已就该主题发表了这些研究论文-至少,它们为错误共享问题以及它为什么如此阴险提供了出色的介绍。


Predator: Predictive False Sharing Detection
Sheriff: Precise Detection and Automatic Mitigation of False Sharing


可以在GitHub上找到与这些研究论文相对应的工具:SheriffPredator

尽管您可以尝试使用这些工具之一来查找问题,但最简单的方法是尝试Hoard。 Hoard是一种快速,可扩展的malloc替代产品,其设计降低了分配器引起的错误共享的风险。如果用Hoard代替tcmalloc不能解决您的问题,那么寻求其他途径可能是有意义的。

07-24 14:16