c++ - tcmalloc 巨大的性能差异

标签 c++ tcmalloc gperftools

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

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

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

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

最佳答案

正如一些评论者所建议的那样,错误共享可能是问题所在。查找虚假共享很困难,而且当前工具也没有很好地支持它。我的研究小组发表了关于该主题的这些研究论文 - 至少,它们很好地介绍了虚假分享问题及其为何如此隐蔽。

GitHub 上提供了与这些研究论文对应的工具:Sheriff , Predator .

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

关于c++ - tcmalloc 巨大的性能差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32089808/

相关文章:

c++ - gperftools 使用brew 安装后在Mac 上未安装-lprofiler

c++ - “g++”在 Windows 8 上未被识别为内部或外部命令

c++ - 使用基类构造函数的子类构造函数的概述定义

C++ SFML 成员初始值设定项

c++ - 获取/释放通过 []-operator 访问的原子变量的语义

c++ - 当我使用共享库编译并运行该程序时,为什么 tcmalloc 会失败?

gcc - 与 libtcmalloc ubuntu 链接

c++ - tcmalloc:静态编译时如何覆盖我的 malloc 调用?

Go Profiler (pprof) 时间差异

c++ - gperftools cpuProfiler 在分析由 ARM 设备创建的文件时看不到符号