我们的多线程服务器有数百个连接线程,负责 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 上提供了与这些研究论文对应的工具:Sheriff , Predator .
虽然您可以尝试使用其中一种工具来查找问题,但最简单的方法是提供 Hoard一试。 Hoard 是一种快速、可扩展的 malloc 替代品,其设计降低了分配器引起的错误共享的风险。如果用 Hoard 替换 tcmalloc 不能解决您的问题,那么寻求其他途径可能是有意义的。
关于c++ - tcmalloc 巨大的性能差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32089808/