0

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

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

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

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

4

1 回答 1

1

正如几位评论者所建议的那样,虚假分享可能是问题所在。发现虚假共享很困难,并且当前工具没有很好的支持。我的研究小组已经发表了这些关于该主题的研究论文——至少,它们很好地介绍了虚假共享问题以及它为何如此阴险。

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

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

于 2015-09-25T12:12:18.593 回答