2016-10-11 85 views
2

我读过这篇关于PostgreSQL性能的文章:http://akorotkov.github.io/blog/2016/05/09/scalability-towards-millions-tps/什么意思是“缓存线对齐”?

一个优化是“cacheline aligment”。

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

+1

的交联关闭该页面解释发生了什么事情相当不错:https://开头WWW。 postgresql.org/message-id/[email protected] – paddy

+1

@paddy是的,喜欢的帖子解释说,缓存线对齐有助于提高性能但我认为它不能解释它是什么以及它是如何工作的。 – guettli

+1

https://en.wikipedia.org/wiki/Data_structure_alignment问题是*未对齐*数据结构将跨越更多缓存*插槽*,并且会增加总线流量。 – joop

回答

3

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

+0

我上一次的C编程是在十年前完成的,但是你的回答很好地解释了它。谢谢:-) – guettli

+0

值得注意的是,引用文章中显示的极端性能差异在多路服务器上,其中维护内核之间高速缓存一致性的成本特别高 –