我读过有关PostgreSQL性能的文章:http://akorotkov.github.io/blog/2016/05/09/scalability-towards-millions-tps/
一个优化是“cacheline aligment”。
这是什么?它如何帮助以及如何在代码中应用它?答案 0 :(得分:8)
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