【问题标题】:What does "cacheline aligned" mean?“缓存线对齐”是什么意思?
【发布时间】:2023-03-25 08:52:01
【问题描述】:

我阅读了这篇关于 PostgreSQL 性能的文章:http://akorotkov.github.io/blog/2016/05/09/scalability-towards-millions-tps/

一种优化是“缓存线对齐”。

这是什么?它有什么帮助以及如何在代码中应用它?

【问题讨论】:

  • 链接到该页面的帖子很好地解释了正在发生的事情:postgresql.org/message-id/…
  • @paddy 是的,点赞的帖子解释了缓存行对齐有助于提高性能,但我认为它并没有解释它是什么以及它是如何工作的。
  • en.wikipedia.org/wiki/Data_structure_alignment 问题是 unaligned 数据结构将跨越更多缓存 slots 并且会增加总线流量。

标签: c performance postgresql memory-management


【解决方案1】:

CPU 缓存以称为cache lines 的块的形式将数据从主内存传输到主内存;典型的大小似乎是 64 字节。

彼此距离较近的数据可能最终位于同一缓存行上。

如果不同的核心需要这些数据,系统必须努力使驻留在核心缓存中的副本之间的数据保持一致。本质上,当一个线程修改数据时,另一个线程被锁阻止访问数据。

您参考的文章谈到了在 PostgreSQL 中发现的一个此类问题,该问题存在于共享内存中的数据结构中,该数据结构经常由不同的进程更新。通过在结构中引入填充以将其膨胀到 64 字节,可以保证没有两个这样的数据结构最终位于同一缓存行中,并且访问它们的进程不会被阻塞到绝对必要的程度。

仅当您的程序通过多线程或通过共享内存的多处理并行执行并访问共享内存区域时,这才有意义。在这种情况下,您可以确保不同执行线程频繁访问的数据在内存中的位置不够接近,以至于它们最终会出现在同一缓存行中。
执行此操作的典型方法是在数据结构的末尾添加“死”填充空间。

我发现了一些您可能想阅读的有关该主题的有趣文章:
http://www.drdobbs.com/parallel/maximize-locality-minimize-contention/208200273?pgno=3
http://www.drdobbs.com/tools/memory-constraints-on-thread-performance/231300494
http://www.drdobbs.com/parallel/eliminate-false-sharing/217500206

【讨论】:

  • 我上一次 C 编程是在十年前完成的,但您的回答很好地解释了这一点。谢谢:-)
  • 值得注意的是,参考文章中显示的极端性能差异发生在多插槽服务器上,其中维护内核之间缓存一致性的成本特别高
猜你喜欢
  • 2016-06-11
  • 2014-09-24
  • 2011-05-09
  • 2023-03-12
  • 2012-09-18
  • 1970-01-01
  • 2021-08-23
  • 1970-01-01
相关资源
最近更新 更多