2016-10-11 87 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

值得注意的是,引用文章中顯示的極端性能差異在多路服務器上,其中維護內核之間高速緩存一致性的成本特別高 –