Was bedeutet “Cacheline-ausgerichtet”?

Lesezeit: 2 Minuten

Benutzeravatar von guettli
Güttli

Ich habe diesen Artikel über die Leistung von PostgreSQL gelesen: http://akorotkov.github.io/blog/2016/05/09/scalability-towards-millions-tps/

Eine Optimierung war “Cacheline-Ausrichtung”.

Was ist das? Wie hilft es und wie wendet man es im Code an?

  • Der von dieser Seite verlinkte Beitrag erklärt ziemlich gut, was los ist: postgresql.org/message-id/…

    – Reisfeld

    11. Oktober 2016 um 6:47 Uhr

  • @paddy ja, der gemochte Beitrag erklärt, dass die Cacheline-Ausrichtung zur Verbesserung der Leistung beigetragen hat. Aber ich denke, es erklärt nicht, was es ist und wie es funktioniert.

    – Güttli

    11. Oktober 2016 um 8:01 Uhr

  • en.wikipedia.org/wiki/Data_structure_alignment Das Problem ist, dass nicht ausgerichtet Datenstrukturen werden mehr Cache umfassen Schlüssel und erhöht den Busverkehr.

    – joop

    11. Oktober 2016 um 8:46 Uhr

CPU-Caches übertragen Daten vom und zum Hauptspeicher in sogenannten Chunks Cache-Zeilen; eine typische Größe dafür scheint 64 Bytes zu sein.

Daten, die näher beieinander liegen, können auf derselben Cache-Zeile landen.

Wenn diese Daten von verschiedenen Kernen benötigt werden, muss das System hart arbeiten, um die Daten zwischen den Kopien, die sich in den Caches der Kerne befinden, konsistent zu halten. Während ein Thread die Daten modifiziert, wird der andere Thread im Wesentlichen durch eine Sperre daran gehindert, auf die Daten zuzugreifen.

Der Artikel, auf den Sie verweisen, spricht über ein solches Problem, das in PostgreSQL in einer Datenstruktur im gemeinsam genutzten Speicher gefunden wurde, die häufig von verschiedenen Prozessen aktualisiert wird. Durch die Einführung von Padding in die Struktur, um sie auf 64 Bytes aufzublähen, wird garantiert, dass keine zwei solcher Datenstrukturen in derselben Cache-Zeile landen und die Prozesse, die darauf zugreifen, nicht mehr als unbedingt notwendig blockiert werden.

Dies ist nur relevant, wenn Ihr Programm die Ausführung parallelisiert und auf einen gemeinsam genutzten Speicherbereich zugreift, entweder durch Multithreading oder durch Multiprocessing mit gemeinsam genutztem Speicher. In diesem Fall können Sie davon profitieren, indem Sie sicherstellen, dass Daten, auf die häufig von verschiedenen Ausführungsthreads zugegriffen wird, nicht nahe genug im Speicher liegen, dass sie in derselben Cache-Zeile landen können.
Der typische Weg, dies zu tun, besteht darin, am Ende einer Datenstruktur „toten“ Füllraum hinzuzufügen.

Ich habe einige interessante Artikel zu diesem Thema gefunden, die Sie vielleicht lesen möchten:
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

  • Meine letzte C-Programmierung wurde vor mehr als zehn Jahren durchgeführt, aber Ihre Antwort erklärt es gut. Vielen Dank 🙂

    – Güttli

    12. Oktober 2016 um 7:47 Uhr

  • Bemerkenswert ist, dass der extreme Leistungsunterschied, der im Artikel, auf den verwiesen wird, gezeigt wird, auf einem Multi-Socket-Server auftritt, wo die Kosten für die Aufrechterhaltung der Cache-Konsistenz zwischen den Kernen besonders hoch sind

    – Nick Barnes

    12. Oktober 2016 um 7:55 Uhr

1432600cookie-checkWas bedeutet “Cacheline-ausgerichtet”?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy