Linux / Perl MMAP-Leistung

Ich versuche, den Umgang mit großen Datenmengen mit mmap zu optimieren. Ein Datensatz liegt im Gigabyte-Bereich. Die Idee war, die gesamte Datei in den Speicher zu mappen, sodass mehrere Prozesse gleichzeitig an dem Datensatz arbeiten können (schreibgeschützt). Es funktioniert jedoch nicht wie erwartet.

Als einfachen Test ordne ich die Datei einfach zu (mit Perls Sys :: Mmap-Modul, unter Verwendung des "mmap" -Unterteils, von dem ich glaube, dass es direkt der zugrunde liegenden C-Funktion zugeordnet ist) und lasse den Prozess schlafen. Dabei verbringt der Code mehr als eine Minute, bevor er vom mmap-Aufruf zurückkehrt, obwohl dieser Test nichts aus der mmap'ed-Datei unternimmt - nicht einmal einen Lesevorgang.

Vermutlich musste unter Linux die gesamte Datei beim ersten Mapping gelesen werden. Nachdem die Datei im ersten Prozess (im Ruhezustand) zugeordnet wurde, habe ich in einem anderen Prozess einen einfachen Test aufgerufen, bei dem versucht wurde, die Datei zu lesen ersten paar Megabyte der Datei.

Überraschenderweise scheint der zweite Prozess auch viel Zeit zu kosten, bevor er vom MMAP-Aufruf zurückkehrt, ungefähr zur selben Zeit, zu der die Datei das erste Mal gemappt wird.

Ich habe sichergestellt, dass MAP_SHARED verwendet wird und dass der Prozess, der die Datei zum ersten Mal zugeordnet hat, noch aktiv ist (dass sie nicht beendet wurde und dass die MMAP nicht aufgehoben wurde).

Ich hatte erwartet, dass eine mmap-Datei es mir ermöglichen würde, mehreren Arbeitsprozessen einen effektiven wahlfreien Zugriff auf die große Datei zu gewähren. Wenn jedoch bei jedem mmap-Aufruf zuerst die gesamte Datei gelesen werden muss, ist dies etwas schwieriger. Ich habe nicht mit lang laufenden Prozessen getestet, ob der Zugriff nach der ersten Verzögerung schnell ist, aber ich habe erwartet, dass MAP_SHARED und ein anderer separater Prozess ausreichen würden.

Meine Theorie war, dass mmap mehr oder weniger sofort zurückkehren würde und dass Linux die Blöcke mehr oder weniger nach Bedarf laden würde, aber das Verhalten, das ich sehe, ist das Gegenteil, was darauf hinweist, dass bei jedem Aufruf von mmap das Lesen der gesamten Datei erforderlich ist.

Irgendeine Idee, was ich falsch mache oder ob ich völlig falsch verstanden habe, wie mmap funktionieren soll?

Antworten auf die Frage(9)

Ihre Antwort auf die Frage