tcmalloc巨大的性能差异

时间:2015-08-19 08:03:51

标签: c++ tcmalloc gperftools

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

还有另一个异步线程运行相对繁重的任务,不时有很多分配(比如说每隔几秒)。

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

到目前为止,我的主要理论是,我以某种方式更改了tcmalloc库的访问模式,并导致随机CPU提升。为了证实这一理论,我应该在tcmalloc统计数据中看一下什么?现在从不同的线程(但不是同时)运行的相同代码是否会导致tcmalloc从中央缓存分配而不是从线程缓存中分配?

1 个答案:

答案 0 :(得分:0)

正如一些评论者所说,虚假分享可能是问题所在。发现错误共享很困难,并且目前的工具不能很好地支持。我的研究小组已经发表了关于这个主题的这些研究论文 - 至少,它们提供了一个关于错误共享问题及其如此阴险的原因的精彩介绍。

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

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