【问题标题】:Will dynamic allocations on a different thread slow down my main processing thread?不同线程上的动态分配会减慢我的主处理线程吗?
【发布时间】:2014-08-11 15:34:05
【问题描述】:

我有一个关键线程在一个紧密的循环中处理数据。它具有亲和力,适用于高性能处理。它没有动态分配。

我有另一个线程在不同的核心上运行,它不做任何关键工作,但做动态分配。它也有亲和力。

执行动态分配的其他线程的存在会影响我的关键线程吗?

【问题讨论】:

  • 不同的内核很可能会共享缓存,因此非关键线程可能会导致缓存未命中甚至thrashing。但任何其他过程也可以。
  • 好点。我的猜测是动态分配的内存对缓存的影响比对象在堆栈上的影响更大。
  • 此外,有时预测动态分配何时(以及在哪个线程上)实际发生并不明显。可能值得仔细检查关键线程是否实际上没有动态分配(例如写入时复制字符串)
  • 两个线程仍然共享同一个堆。动态分配会导致堆碎片化,从而减慢分配/释放速度。
  • 动态分配的必须在分配时锁定保护堆的全局锁,但如果您的关键线程没有争用该锁,则不应减慢速度。

标签: c++ multithreading performance low-latency


【解决方案1】:

当然,是的。
不仅对于内存布局和 L3 垃圾处理的间接影响,而且偶尔也会立即产生影响。
当调用 malloc 时,它会尝试重用已分配和释放的内容,但有时必须扩展进程内存空间,它通过调用 mmapbrk
我不是 100% 确定 brk,但 mmap 肯定会使 TLB 无效,因此您应该期望在这些调用之后对页面错误的处理速度较慢。
如果您在 Linux 或 *BSD 上,您可以尝试修改内核代码以在所有情况下都不会失效,但不要期望它很简单。

【讨论】:

  • 系统调用效果是一次性效果:一旦虚拟内存空间达到最大大小,将不再有TLB刷新。由于使用了处理器亲和性,因此不会出现比任何其他线程创建的更严重的 L3 垃圾。由于 OP 声明时间关键线程不分配任何内存,因此不会通过 malloc() 调用引入直接延迟。但与性能一样,真理只是在衡量中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-26
  • 2020-06-16
  • 1970-01-01
  • 1970-01-01
  • 2020-02-03
  • 2017-11-16
相关资源
最近更新 更多