Input/Output FileChannel writes / werden diese gecached vom OS und dann erst geschrieben?

miasma

Aktives Mitglied
Hallo,

mir stellt sich die Frage, ob es ausreicht FileChannel.write(ByteBuffer) mit mehreren "kleinen" ByteBuffern aufzurufen, bspw. wenn sagen wir mal 500* FileChannel::write aufgerufen wird mit zwischen 500 und 55_000 Bytes im ByteBuffer und am Ende FileChannel::force aufzurufen. Wird das von den gängigen Betriebssystemen gecached und dann erst geschrieben oder sollte ich eher schauen, dass ich einen großen ByteBuffer akkumuliere und dann erst in den FileChannel schreibe? Letzteres ist irgendwie grade etwas tricky in meinem Fall, aber würde es hoffentlich schon hinbekommen. Es geht hier auch Code, der richtig performant sein sollte...

Beste Grüße
Johannes
 

KonradN

Super-Moderator
Mitarbeiter
Ich bin auf dem Gebiet kein Experte, aber ich will mal meine Gedanken dazu weitergeben. Aber da kann ich durchaus auch falsch mit liegen.

Erst einmal ist hier das Betriebssystem und die Einstellungen wichtig. Die gängigen Betriebssysteme haben alle einen Cache gegenüber den Filesystemen. Bei Schreibvorgängen ist aber immer die Frage, ob dies gewollt ist: Bei kritischen Daten möchte die Applikation, dass Daten auch wirklich geschrieben sind, wenn z.B. das flush() erfolgreich war. Ein "write-back" Cache kann böse sein: Die zB. Transaktionsdaten einer geschlossenen Transaktion sind noch im Speicher und nicht auf der Platte und dann kommt der Stromausfall. Dann sind die Daten evtl. inkonsistent.

Daher wäre hier wirklich auch bei jedem System die Konfiguration des Caches wichtig. Bei Microsoft ist dies aber in der Regel aktiviert. Über die Policy "Enable write caching on disk" kann dies aber z.B. gesetzt werden.
Bei Linux kann dies z.B. mit hdparm gesetzt werden.

Unabhängig davon ist tatsächlich die Frage, ob es etwas verändert, wenn man unterschiedliche Blockgrößen schreibt (in Java). Daher wäre hier meine Herangehensweise, dass ich dies einfach testen würde: Also eine Applikation erstellen, die dann entsprechend Daten in diversen Größen sendet. Dann kann man ausprobieren, wie es sich verhält bei unterschiedlichen Größen.
Hier kann es aber auch durchaus zu Unterschieden kommen je nach Betriebssystem, Konfiguration, verwendeter Java Runtime. Die Tests wären also entsprechend groß. Aber man würde dann Erfahrungen sammeln und könnte dann Ratschläge geben bezüglich Software-Auswahl als auch Konfiguration (So man relevante Unterschiede findet).
Hier sehe ich auch zusätzlich das Risiko von Software Updates. Die Erkenntnisse können mit jedem Update hinfällig sein.

Aber hier ist auch die Frage nach dem Aufwand: Ist das heutzutage gerechtfertigt? Spielt das eine Rolle zu Zeiten von schnellen SSDs ... Die Zugriffszeiten und auch Übertragungsraten sind ja extrem bei modernen NVMe und da sind die Kosten ja nicht mal mehr so hoch. Daher kann es durchaus sein, dass da diese Aufwände evtl. gar nicht getrieben werden sondern einfach entsprechende Hardware verwendet wird.
 

miasma

Aktives Mitglied
Auf meinem Notebook scheint es sogar schneller zu sein, FileChannel::write direkt aufzurufen:


Was ich momentan per YourKit direkt sehe ist, dass der Shenandoah GC m.E. zu lange braucht, aber zumindest noch eine schöne Zickzack-"Kurve", so dass kein memory leak vorhanden sein sollte.

Ich hab mal die neue Klasse des `FileChannelWriter`s mit angehängt. Eventuell fällt euch direkt was auf -- bin eigentlich der Meinung, dass Shenandoah bei einer 3,8 Gb JSON-Testdatei als Import lediglich 10ms peak gebraucht hat.

Was jetzt auch nicht so ideal ist, dass vermutlich 0-bytes geschrieben werden, wenn ich die Schreib-Position von Chronicle Bytes (Bytes<ByteBuffer>) erhöhe (und zwischendrin Löcher lasse). Bisher hatte ich immer word-aligned bzw. so dass eine Datenbank-Seite bei muliplen von 64 byte anfängt und die RevisionRootPages nochmal auf 256 byte Granularität. Jetzt steigt die file-size dahingehend auch bei meinem kleinen Test von 2,4 auf knapp 3 Gb, was auch nicht so toll ist.

Aber irgendwie finde ich die Architektur mit dem Bytes akkumulieren eigentlich ganz gut, naja. Mittlerweile überprüfe ich aber doch lieber alles mit Profiler und wenn ich das nicht schneller bekomme muss ichs lokal wohl reverten oder mal in einen eigenen branch committen.

Eventuell lohnt es sich auch das mal auf einer Oracle/JDK Mailingliste zu fragen!?
 

Anhänge

  • Screenshot from 2022-07-22 21-42-01.png
    Screenshot from 2022-07-22 21-42-01.png
    92,9 KB · Aufrufe: 1
  • FileChannelWriter.java
    12 KB · Aufrufe: 0

miasma

Aktives Mitglied
Ok, scheint als ob ein FileChannel::force nach den 16 Mb, wenn ich in den FileChannel direkt davor schreibe etwas bessere Performance zu haben. Ich glaube ungefähr wie im Repo ohne das akkumulieren oder sogar minimal schneller. Die GC-Pause Zeiten sind allerdings immernoch um die 200ms oft, was recht komisch ist mit Shenandoah.
 

miasma

Aktives Mitglied
Ich hab mal einen Screenshot von den "Garbage Objects" angehängt.

IndexLogKey wird hier halt als Key einer Map verwendet um den korrekten Subbaum usw. zu traversieren.

Das kommt aus folgender Methode: https://github.com/sirixdb/sirix/bl...g/sirix/access/trx/page/NodePageTrx.java#L499 Die Funktion scheint hier recht viel Garbage zu erzeugen, kann ich aber ja leider auch nicht static machen. Habt ihr irgendwelche Tipps?

Ansonsten sind möglicherweise noch die 2 Sets und das Array in

Da hilfts aber auch nicht, die in einer clear-Methode zu clearen bzw. die Array-indexes auf null zu setzen.

Ein weiteres Problem dürfte diese Methode sein: https://github.com/sirixdb/sirix/bl...cess/trx/node/json/JsonNodeTrxImpl.java#L1314

Scheinbar erzeugt supplyLocked garbage oder ist das was anderes?

Code:
protected <T> T supplyLocked(final Supplier<T> supplier) {
  if (lock != null) {
    lock.lock();
  }
  try {
    return supplier.get();
  } finally {
    if (lock != null) {
      lock.unlock();
    }
  }
}
 

Anhänge

  • Screenshot from 2022-07-23 16-50-41.png
    Screenshot from 2022-07-23 16-50-41.png
    228,3 KB · Aufrufe: 2
Zuletzt bearbeitet:

miasma

Aktives Mitglied
Also supplyLocked könnte ich wieder rausnehmen und halt jeder Methode wieder das eventuelle Lock aquiren an den Anfang stellen und freigeben an den Schluss, wäre aber recht hässlich irgendwie. Mir gehts jetzt aber wirklich um gute Performance in erster Linie, da das ja ein data store ist und m.E. beim Einlesen eines JSON files schon an MongoDB mindestens rankommen sollte, auch wenn GSON wahrscheinlich als JSON parser recht langsam ist. Aber ansonsten auch single writer und append-only usw. und halt in-process statt über Netzwerk, wenn man die REST-API nicht nutzt, also wie SQLite oder DuckDB.

Somit bin ich für jeden Performance-Tipp mehr als dankbar :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Z Input/Output Dateiausgabe mit FileChannel merkwürdig Allgemeine Java-Themen 5
S Exklusive Sperre auf Dateien: FileChannel, FileLock Allgemeine Java-Themen 0
kodela Problem mit Kopieren über FileChannel Allgemeine Java-Themen 4
reibi File über FileChannel locken Allgemeine Java-Themen 5
A FileChannel: Mitten in eine Datei was einfügen Allgemeine Java-Themen 2
P FileChannel - NonWritableChannelException ? Allgemeine Java-Themen 12
P Fehler: Hauptklasse Main konnte nicht gefunden oder geladen werden Ursache: java.lang.ClassNotFoundException: Main Allgemeine Java-Themen 24
berserkerdq2 Weiß jemand wie ich im Scenebuilder das Fenster so darstellen kann, dass beim Vollbildmodus die Objekte so angezeigt werden? Allgemeine Java-Themen 1
D Erste Schritte Mp3 Datei kann nicht von der Festplatte geöffnet werden - mit ChatGPT erstellt Allgemeine Java-Themen 7
I OpenPDF erzeugt riesige PDFs, wenn Grafiken über PdfGraphics2D#drawImage gezeichnet werden Allgemeine Java-Themen 1
kodela String kann nicht zu Pfad konvertiert werden Allgemeine Java-Themen 16
Momo16 Brauche Hilfe - Java Projekt kann nicht erstellt werden Allgemeine Java-Themen 12
Tiago1234 Hauptklasse konnte nicht gefunden oder geladen werden Allgemeine Java-Themen 38
W Bilder werden in App mit Jar-Datei nicht angezeigt Allgemeine Java-Themen 15
Z macOS java konnte nicht entfernt werden xpc verbindungsfehler Allgemeine Java-Themen 4
AleXusher Hauptklasse startlösung konnte nicht gefunden oder geladen werden Allgemeine Java-Themen 1
ReinerCoder auskommentierte Messages werden trotzdem benutzt Allgemeine Java-Themen 53
MiMa Wie sollte am besten ein Datum gespeichert werden? Allgemeine Java-Themen 8
J Hilfe, Jar Datei kann nicht ausgeführt werden Allgemeine Java-Themen 2
Elyt Compiler-Fehler Datei kann nicht erstellt werden. Die Syntax für den Dateinamen etc. ist falsch. Allgemeine Java-Themen 2
W Dateien werden nicht gelöscht - warum? Allgemeine Java-Themen 12
A Eclipse Hauptklasse konnte nicht gefunden oder geladen werden Allgemeine Java-Themen 7
Drachenbauer Wie kann eine vorgegebene Farbe über einen String erkannt werden? Allgemeine Java-Themen 11
I Modelio kann nicht geöffnet werden Allgemeine Java-Themen 3
J Message Box soll bei bestimmter Zeit angezeigt werden Allgemeine Java-Themen 19
ReinerCoder Klasse kann nicht public deklariert werden Allgemeine Java-Themen 2
MiMa Datei kann nicht umbenannt oder verschoben werden ?? Allgemeine Java-Themen 17
M JDBC DATE 0000-00-00 kann nicht ausgegeben werden Allgemeine Java-Themen 3
The Pi NetBeans Bilder in Jar Datei werden nicht angezeigt Allgemeine Java-Themen 7
J Bei einer Zufallsausgabe werden zu viel Ergebnisse ausgegeben Allgemeine Java-Themen 16
Asphorm Datentypen Datentypen werden nicht ordnungsgemäß umgewandelt Allgemeine Java-Themen 1
C Eclipse einstellen, dass eine bestimmte JDK benutzt werden soll Allgemeine Java-Themen 3
P Datentypen Bilder werden in ausführbarer JAR nicht angezeigt Allgemeine Java-Themen 6
I nach Image Load in ListView, kann Ordner nicht mehr gelöscht werden Allgemeine Java-Themen 1
B Bild aus Jar kann nach Export nicht mehr gefunden werden Allgemeine Java-Themen 13
B AES kann nicht entschlüsselt werden Allgemeine Java-Themen 5
J .exe Dateien werden nicht gestartet obwohl Pfad richtig Allgemeine Java-Themen 6
N Anwendungsfehler(kann nicht gestartet werden...) Allgemeine Java-Themen 30
E Hauptklasse konnte nicht gefunden werden Allgemeine Java-Themen 13
J beans.instantiate(): Klasse kann nicht instanziiert werden Allgemeine Java-Themen 2
G Methoden Aus einem Event, wo ich weiß, dass es ausgeführt werden wird, eine Get-Methode basteln Allgemeine Java-Themen 8
D Java Permutationen werden zu lange berechnet Allgemeine Java-Themen 3
D Java Error String kann nicht in Int umgewandelt werden Allgemeine Java-Themen 2
ms_cikar Java Excel bearbeiten spalten werden überschrieben. Allgemeine Java-Themen 4
M Ein Programm das nur von einem bestimmten Programm geöffnet werden kann Allgemeine Java-Themen 7
T Umlaute werden falsch gedruckt Allgemeine Java-Themen 2
M Windows 98 - Mit welchem JDK (Version) kann noch Programm dafür erstellt werden Allgemeine Java-Themen 6
B Eclipse Nach Export einer .jar Fehler: Hauptklasse konnte nicht gefunden oder geladen werden Allgemeine Java-Themen 5
M Eclipse - Fehler: Hauptklasse de.xyz.init.MeineKlasse konnte nicht gefunden oder geladen werden Allgemeine Java-Themen 2
M Methoden werden in falscher Reihenfolge bearbeitet Allgemeine Java-Themen 10
L Nullpointer Exceptions werden nicht angezeigt Allgemeine Java-Themen 5
Thallius Serialisiertes File kann auf anderem Rechner nicht geladen werden Allgemeine Java-Themen 12
S Threads Threads werden nicht beendet Allgemeine Java-Themen 2
D Input/Output Zeilen werden "ignoriert" beim Einlesen aus einer Textdatei Allgemeine Java-Themen 3
B Input/Output version.cfg konnte nicht im Klassenpfad gefunden werden, ist aber dort. Allgemeine Java-Themen 0
O Klassen Programm in Klassen unterteilt, werte werden nicht mehr übernommen Allgemeine Java-Themen 3
T Static kann nicht verändert werden Allgemeine Java-Themen 3
L iText PDF Form-Felder werden nach Bearbeitung mit iText nicht mehr richtig erkannt. Allgemeine Java-Themen 2
J Datei kann nicht geladen werden... Allgemeine Java-Themen 18
Zettelkasten JAR-Datei kann bei Freund auch nicht mit CMD ausgeführt werden Allgemeine Java-Themen 4
S OOP Apache Commons Math - Verwendung von Genetics - Wie werden Daten in Chromosomen gespeichert? Allgemeine Java-Themen 4
O Klassen werden nicht importiert Allgemeine Java-Themen 3
C .Ini-Datei Wert Änderungen werden nicht angenommen Allgemeine Java-Themen 3
M Startdatei konnte nicht geparst werden. Fehler in Zeile 0 Allgemeine Java-Themen 5
R Bild offenbar zu groß um geladen zu werden? Allgemeine Java-Themen 12
C Prozesssteuerung - Speicherhungrige externe Programme werden blockiert Allgemeine Java-Themen 2
A Input/Output generiertes PDF kann nicht geöffnet werden Allgemeine Java-Themen 2
U Fehler: Hauptklasse org.junit.runner.JUnitCore konnte nicht gefunden oder geladen werden Allgemeine Java-Themen 2
F Kompilierfehler - Hauptklasse konnte nicht gefunden werden Allgemeine Java-Themen 4
O Gucken, ob bereits Töne (von wild fremden Programmen) ausgegeben werden Allgemeine Java-Themen 5
N verdeckte Fenster werden im Vordergrund gezeichnet Allgemeine Java-Themen 6
Dit_ ThreadPoolExecutor | Die Aufgaben sollen reihe nach bearbeitet werden Allgemeine Java-Themen 6
S Swing JPanel werden nicht angezeigt Allgemeine Java-Themen 6
J Welche Informationen werden beim Kompilieren gespeichert? Allgemeine Java-Themen 3
Z Java kann nicht installiert werden Allgemeine Java-Themen 30
C Drag & Drop, Icons sollen getauscht werden Allgemeine Java-Themen 4
L Entscheiden, welcher Code ausgeführt werden soll Allgemeine Java-Themen 7
U DLLs werden nicht gefunden trotz Pfad: Allgemeine Java-Themen 4
D JVM kann nicht über die jvm.dll gestartet werden? Allgemeine Java-Themen 1
M Nach Programmdurchlauf werden Zeichen falsch dargestellt + Anderes Verhalten unter Windows Allgemeine Java-Themen 6
K Von SD-Card-Einschub unterrichtet werden - wie? Allgemeine Java-Themen 2
D NetBeans Bibliothek kann nicht genutzt werden Allgemeine Java-Themen 5
T JConsole: Klassen werden geladen aber nicht wieder entladen Allgemeine Java-Themen 3
T Threads werden nicht beendet Allgemeine Java-Themen 22
R in .jar werden files nicht gefunden!!! Allgemeine Java-Themen 5
dayaftereh JPG Kann nicht geladen werden! Allgemeine Java-Themen 9
C Kopieren von Dateien die von einem anderen Programm verwendet werden? Allgemeine Java-Themen 7
O Backslashes werden in der Ausgabe nicht übernommen Allgemeine Java-Themen 5
E Bitcode liegt vor und soll gespiegelt werden Allgemeine Java-Themen 4
S Mittels eines Applets Bilder generieren die in einer Webseite angezeigt werden..? Allgemeine Java-Themen 8
D Wie werden Regex-Gruppen kompiliert? Allgemeine Java-Themen 2
A Beim Kopieren werden Bilder verfälscht Allgemeine Java-Themen 3
C Eingegebene Werte werden nicht gezeichnet Allgemeine Java-Themen 2
Developer_X JButtons werden nicht angezeigt Allgemeine Java-Themen 26
M Nach export in jar datei werden Datein nicht eingelesen Allgemeine Java-Themen 7
B Klassen werden nicht gefunden Allgemeine Java-Themen 6
J Wo werden die System properties gespeichert Allgemeine Java-Themen 12
B Access-Befehle werden in der falschen Reiehnfolge ausgeführt Allgemeine Java-Themen 4
J double 3.0 soll ohne Nachkommastelle ausgegeben werden Allgemeine Java-Themen 12
E Warum kann Math nicht instanziert werden? Allgemeine Java-Themen 17

Ähnliche Java Themen

Neue Themen


Oben