Warum verursacht der Memory-Mapped-Puffer in Java einen massiven unerwarteten Datenträger-IO?

8

Ich habe einige Posix-Programme geschrieben, die den gemappten Dateipuffer verwenden. Ein einfaches Szenario besteht darin, eine 1-GB-Datei in den Speicher zu mappen und die gesamte Datei mit Inhalt aufzufüllen.

Während der Programmausführung gab es wenig bis keine Festplatten-IO, bis msync oder munmap ruf passiert.

Auf genau demselben System habe ich das entsprechende Programm in Java geschrieben, das auf Oracle JDK 7 läuft, und festgestellt, dass während der gesamten Programmausführung eine große Menge von IO-Aktivitäten auf dem Datenträger auftauchen.

Wie wird der Memory-Mapped-Dateipuffer in JVM anders implementiert? Und gibt es überhaupt eine Verzögerung der massiven IO-Aktivitäten?

Das Betriebssystem ist ein Linux 3.2 x64.

Code:

%Vor%     
Peter Lawrey 13.02.2014, 07:45
quelle

1 Antwort

8

Die Speicherzuordnung ist vollständig im Betriebssystem implementiert. Die JVM hat keinen Einfluss darauf, wie sie auf die Festplatte geleert wird, außer durch die Optionen force() und "rws" , wenn Sie die Datei aktivieren.

Linux wird basierend auf den Kernel-Parametern, die in sysctl gesetzt sind, auf die Festplatte geschrieben.

%Vor%

Dies sind die Standardeinstellungen meines Laptops. Das Verhältnis 10 bedeutet, dass es beginnt, die Daten auf die Festplatte im Hintergrund zu schreiben, wenn 10% des Hauptspeichers verschmutzt sind. Das Zurückschreiben von 20% bedeutet, dass das Schreibprogramm stoppt, bis der schmutzige Prozentsatz unter 20% fällt. In jedem Fall werden die Daten nach 3000 Zenti-Sekunden oder 30 Sekunden auf die Festplatte geschrieben.

Ein interessanter Vergleich, um eine Datei auf einem tmpfs Dateisystem zu speichern. Ich habe /tmp gemounted als tmpfs, aber die meisten Systeme haben / dev / shm.

BTW Sie könnten diese Klasse interessant finden. MemoryStore ermöglicht Sie können jede Speichergröße abbilden, dh & gt; & gt; 2 GB und führen Sie eine thread-sichere Bedienung darauf durch. z.B. Sie können den Speicher über Prozesse hinweg freigeben. Es unterstützt Off-Heap-Sperren, flüchtiges Lesen / Schreiben, Ordered Write und CAS.

Ich habe einen Test, bei dem zwei Prozesse Datensätze sperren, umschalten und entsperren. Die Latenz beträgt im Durchschnitt 50 ns auf meinem Laptop.

BTW2: Linux verfügt über Sparse-Dateien, was bedeutet, dass Sie Regionen zuordnen können, die nicht nur größer als Ihr Hauptspeicher sind, sondern auch größer als Ihr freier Speicherplatz. z.B. Wenn Sie 8 TB zuordnen und nur zufällige Stücke von 4 GB verwenden, werden bis zu 4 GB im Speicher und 4 GB auf der Festplatte verwendet. Wenn Sie du {file} verwenden, können Sie den tatsächlich verwendeten Speicherplatz sehen. Hinweis: Die zu geringe Zuweisung von Festplattenspeicher kann zu stark fragmentierten Dateien führen, was ein Performance-Problem für die Festplatte darstellen kann.

    
Peter Lawrey 13.02.2014, 08:30
quelle