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?
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
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