Wenn wir am NUMA-System arbeiten, kann der Speicher relativ zum aktuellen NUMA-Knoten lokal oder remote sein. Um den Speicher lokaler zu machen, gibt es eine "first-touch" -Richtlinie (die Standardspeicher-zu-Knoten-Bindungsstrategie): Ссылка
Standardspeicherbindung Es ist wichtig, dass der Speicher der Benutzerprogramme auf einem Knoten zugewiesen wird, der dem Knoten nahe ist, der die CPU enthält, auf der sie ausgeführt werden. Daher werden Seitenfehler standardmäßig durch den Speicher von dem Knoten erfüllt, der die seitenfehlerverursachende CPU enthält. Da die erste CPU, die die Seite berührt, die CPU ist, die die Seite fehlerhaft macht, wird diese Standardrichtlinie "first touch" genannt.
Die Standardrichtlinie heißt first-touch. Gemäß dieser Richtlinie bewirkt der Prozess, der eine Seite des Speichers zuerst berührt (dh auf eine Seite des Speichers schreibt oder von dieser liest), dass diese Seite in dem Knoten zugeordnet wird, auf dem der Prozess ausgeführt wird. Diese Richtlinie funktioniert gut für sequentielle Programme und für viele parallele Programme.
Es gibt auch einige andere nicht lokale Richtlinien. Außerdem gibt es eine Funktion, die eine explizite Verschiebung des Speichersegments zu einem NUMA-Knoten erfordert.
Aber manchmal (im Zusammenhang mit vielen Threads von einzelnen Anwendungen) kann es nützlich sein, die "nächste Berührung" -Richtlinie zu haben: eine Funktion aufrufen, um einige Speicherbereiche (bis zu 100s MB) mit einigen Daten zu "lösen" und den " Berühren Sie zuerst den "ähnlichen" Handler in dieser Region, der die Seite bei der nächsten Berührung (Lesen oder Schreiben) auf den NUMA-Knoten des zugreifenden Threads migriert.
Diese Richtlinie ist nützlich, wenn große Datenmengen von vielen Threads verarbeitet werden sollen und verschiedene Zugriffsmuster auf diese Daten vorhanden sind (z. B. erste Phase - Aufteilung der 2D-Anordnung nach Spalten über Threads; zweite - Aufteilung der gleichen Daten nach Reihen).
Eine solche Richtlinie wurde in Solaris seit 9 über madvice mit MADV_ACCESS_LWP Flag
unterstütztMADV_ACCESS_LWP Sagen Sie dem Kernel, dass der nächste LWP zu Berühren Sie den angegebenen Adressbereich wird es am stärksten zugreifen, so dass die Kernel sollte versuchen, die zuzuteilen Speicher und andere Ressourcen dafür Bereich und der LWP entsprechend.
Es gab (Mai 2009) das Patch zum Linux-Kernel namens "affinity-on-next-touch", Ссылка ( thread ), aber wie ich es verstehe, wurde es nicht in die Hauptleitung aufgenommen, nicht wahr?
Außerdem gab es Lee Schermerhorns "migrate_on_fault" -Patches Ссылка .
Also, die Frage: Gibt es für NUMA im aktuellen Vanilla-Linux-Kernel oder in irgendeinem Major-Fork, wie dem RedHat-Linux-Kernel oder dem Oracle-Linux-Kernel, einen Next-Touch?
Nach meinem Verständnis gibt es im Vanilla-Kernel nichts Ähnliches. numactl hat Funktionen, um Seiten manuell zu migrieren, aber es ist wahrscheinlich nicht hilfreich in Ihrem Fall. (Die NUMA-Richtlinienbeschreibung befindet sich in Dokumentation / vm / numa_memory_policy, wenn Sie sich selbst überprüfen möchten)
Ich denke, dass diese Patches nicht zusammengeführt werden, da ich keine der relevanten Code-Snippets im aktuellen Kernel sehe.
Tags und Links memory linux-kernel numa