2016-10-11 5 views
2

私はPostgreSQLのパフォーマンスについてこの記事を読んでいます:http://akorotkov.github.io/blog/2016/05/09/scalability-towards-millions-tps/「キャッシュライン整列」とはどういう意味ですか?

最適化の1つは「キャッシュラインアライメント」でした。

これはなんですか?どのように役立ち、コードでこれを適用するのですか?

+1

をそのページからリンクされポストは非常によく、何が起こっているのかを説明します。https:// WWW。 postgresql.org/message-id/[email protected] – paddy

+1

@paddyはい、お気に入りの投稿では、パフォーマンスを向上させるのに役立つキャッシュラインの整列について説明していますが、それが何であり、どのように機能するのか説明していないと思います。 – guettli

+1

https://en.wikipedia.org/wiki/Data_structure_alignment問題は* unaligned *データ構造がより多くのキャッシュ*スロット*に広がり、バストラフィックの量が増加することです。 – joop

答えて

3

CPUキャッシュは、cache linesと呼ばれるチャンクでメインメモリとの間でデータを転送します。典型的なサイズは64バイトと思われます。

これより互いにより近くに位置するデータは、同じキャッシュライン上に終わる可能性があります。

これらのデータが異なるコアによって必要とされる場合、システムは、コアのキャッシュに存在するコピー間でデータの一貫性を維持するために、厳重に作業する必要があります。基本的に、一方のスレッドがデータを変更している間、他方のスレッドはデータにアクセスすることによるロックによってブロックされます。

あなたが参照している記事は、異なるプロセスによって頻繁に更新される共有メモリ内のデータ構造のPostgreSQLで見つかった問題の1つについて語っています。 64バイトに拡張するために構造体にパディングを導入することによって、そのようなデータ構造が2つあり、同じキャッシュラインに終わることはなく、アクセスするプロセスは絶対に必要以上にブロックされません。

プログラムが実行を並列化し、マルチスレッドまたは共有メモリを使用するマルチプロセッシングによって共有メモリ領域にアクセスする場合にのみ有効です。この場合、異なる実行スレッドによって頻繁にアクセスされるデータが、同じキャッシュラインで終了する可能性があるメモリ内に十分に近接して配置されていないことを確認することによって利益を得ることができます。
これを行う一般的な方法は、データ構造の末尾に“ dead ”のパディングスペースを追加することです。

私はあなたが読みたいと思うかもしれトピックに関するいくつかの興味深い記事が見つかりました:
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プログラミングは10年以上前に行われましたが、答えがうまく説明されています。ありがとうございます:-) – guettli

+0

ここで紹介した記事の極端なパフォーマンスの違いは、コア間のキャッシュ一貫性を維持するコストが特に高いマルチソケットサーバー上にあることに注意してください –

関連する問題