Frage

In der Regel, was können wir für selbstverständlich halten, wenn wir in eine Datei in UNIX von mehreren Prozessen anhängen? Ist es möglich, Daten zu verlieren (ein Prozess des anderen Änderungen überschreiben)? Ist es möglich, Daten verstümmelt werden? (Zum Beispiel wird jeder Prozess eine Zeile pro append in eine Protokolldatei angehängt wird, ist es möglich, dass zwei Linien verstümmelt bekommen?) Wenn das Anfügen im obigen Sinne nicht atomar ist, was ist dann der beste Weg, gegenseitigen Ausschlusses der Gewährleistung?

War es hilfreich?

Lösung

Ein Schreib, die unter der Größe von ‚PIPE_BUF‘ ist soll atomar sein. Das sollte mindestens 512 Bytes sein, obwohl es leicht größer sein könnte (Linux zu haben scheint es auf 4096).

Dies wird vorausgesetzt, dass alle vollständig POSIX-konforme Komponenten sprechen. Zum Beispiel ist dies auf NFS nicht wahr.

Aber vorausgesetzt, Sie in eine Protokolldatei schreiben Sie in ‚O_APPEND‘ Modus geöffnet und halten Sie Ihre Linien (einschließlich Newline) unter ‚PIPE_BUF‘ Bytes lang, sollten Sie in der Lage sein, mehrere Autoren haben in einer Protokolldatei ohne Korruption Fragen. Jegliche Unterbrechungen kommen werden vor oder nach dem Schreiben, nicht in der Mitte. Wenn Sie Integrität Datei wollen einen Neustart überleben werden Sie auch fsync(2) anrufen müssen nach jedem schreiben, aber das ist schrecklich für die Leistung.

Klarstellung : lesen Sie die Kommentare und Oz Salomos Antwort . Ich bin nicht sicher, dass O_APPEND angenommen wird, dass PIPE_BUF Größe Unteilbarkeit haben. Es ist durchaus möglich, dass es nur wie Linux implementiert write(), oder es kann zu dem zugrunde liegenden Dateisystem des Blockgröße fällig.

Andere Tipps

Edit:. Aktualisiert August 2017 mit den neuesten Windows-Ergebnisse

Ich werde Ihnen eine Antwort mit Links geben Code und die Ergebnisse als Autor vorgeschlagen zu prüfen, Boost.AFIO , die eine asynchrone Dateisystem und Datei i / o C ++ Bibliothek implementiert.

Zum einem O_APPEND oder das äquivalent FILE_APPEND_DATA auf Windows bedeutet, dass Schritte des maximalen Datei Umfangs (Datei „Länge“) sind Atom unter gleichzeitigen Schriftsteller. Dies wird durch POSIX garantiert und Linux, FreeBSD, OS X und Windows alle es richtig umzusetzen. Samba implementiert es auch richtig, NFS vor v5 nicht, wie es den Draht-Format-Fähigkeit zu anhängen atomar fehlt. Also, wenn Sie Ihre Datei mit öffnen append-only, gleichzeitiges Schreiben reißt nicht gegeneinander auf jedem größeres O , es sei denn NFS beteiligt ist.

Allerdings gleichzeitige liest zu Atom Appends können zerrissen siehe schreibt auf OS abhängig, System-Archivierung und welche Flags geöffnet Sie die Datei mit - die Erhöhung der maximalen Datei Ausmaß atomar ist, aber die Sichtbarkeit der Schreibvorgänge in Bezug atomar liest kann oder nicht sein. Hier ist eine kurze Zusammenfassung von Flaggen, OS und Ablagesystem:


No O_DIRECT / FILE_FLAG_NO_BUFFERING:

Microsoft Windows 10 mit NTFS. Update Unteilbarkeit = 1 Byte bis einschließlich 10.0.10240, von 10.0.14393 mindestens 1 MB, wahrscheinlich unendlich (*)

Linux 4.2.6 mit ext4: update Unteilbarkeit = 1 Byte

FreeBSD 10.2 mit ZFS: update Unteilbarkeit = mindestens 1 MB, wahrscheinlich unendlich (*)

O_DIRECT / FILE_FLAG_NO_BUFFERING:

Microsoft Windows 10 mit NTFS: update Unteilbarkeit = bis einschließlich 10.0.10240 bis zu 4096 Byte nur dann, wenn Seite ausgerichtet ist, ansonsten 512 Bytes, wenn FILE_FLAG_WRITE_THROUGH weg, sonst 64 Byte. Beachten Sie, dass diese Unteilbarkeit wahrscheinlich eine Funktion von PCIe DMA ist nicht entworfen. Da 10.0.14393, mindestens 1 MB, wahrscheinlich unendlich (*).

Linux 4.2.6 mit ext4: update Unteilbarkeit = mindestens 1 MB, wahrscheinlich unendlich (*). Beachten Sie, dass frühere Linux-Versionen mit ext4 definitiv nicht 4096 Byte überschritten hat, XFS sicherlich verwendet Brauch haben Sperren aber es sieht so aus den letzten Linux hat dies schließlich festgelegt.

FreeBSD 10.2 mit ZFS: update Unteilbarkeit = mindestens 1 MB, wahrscheinlich unendlich (*)


Sie können die rohen empirischen Testergebnisse unter https: // Github .com / ned14 / afio / Baum / Master / Programme / fs-Sonde . Hinweis testen wir für zerrissene Offsets nur auf 512-Byte-Multiples, also kann ich nicht sagen, ob eine teilweise Aktualisierung eines 512-Byte-Sektor während der Lese-Modifikations-Schreibzyklus reißen würde.

Also, die OP Frage zu beantworten, schreibt O_APPEND wird nicht miteinander interferieren, sondern liest gleichzeitig zu O_APPEND schreibt wahrscheinlich abgerissen werden sehen, schreibt auf Linux mit ext4, es sei denn O_DIRECT an ist, worauf Ihr O_APPEND schreibt ein Sektor sein müssten Größe mehr.


(*) "Wahrscheinlich unendlich" ergibt sich aus diesen Klauseln in der POSIX-Spezifikation:

  

Alle folgenden Funktionen werden in Bezug auf jede atomare sein   andere in den in POSIX.1-2008 angegebenen Wirkungen, wenn sie auf operieren   normale Dateien oder symbolische Links ... [viele Funktionen] ... read () ...   jeweils write () ... Wenn zwei Fäden eine dieser Funktionen aufrufen, jeder Aufruf   werden entweder alle angegebenen Wirkungen des anderen Anruf sehen, oder   keines von denen. [Quelle]

und

  

Writes in Bezug serialisiert werden, um andere lesen und schreiben. Wenn ein   read () von Dateidaten können (durch ein beliebiges Mittel) nachgewiesen werden, nachdem ein aufzutreten   write () der Daten festzustellen, dass write () reflektieren, auch wenn die Anrufe   werden durch verschiedene Prozesse hergestellt. [Quelle]

aber umgekehrt:

  

Dieses Volumen von POSIX.1-2008 ist nicht festgelegt Verhalten konkurrierender   schreibt in eine Datei von mehreren Prozessen. Anwendungen sollten einige verwenden   Form der Gleichzeitigkeitssteuerung. [Quelle]

Sie können

in dieser Antwort mehr über die Bedeutung von diesen lesen

schrieb ich ein Skript, um empirisch die maximale Atom append Größe zu testen. Das Skript, in Bash geschrieben, laicht mehrere Worker-Prozesse, die alle Arbeiter spezifische Signaturen auf die gleiche Datei schreiben. Sie liest dann die Datei, für überlappende oder beschädigte Signaturen suchen. Sie können in dieser Blog-Post, die Quelle für das Skript sehen .

Die tatsächliche maximale Atom append Größe variiert nicht nur von OS, sondern durch Dateisystem.

Unter Linux + ext3 die Größe ist 4096, und auf Windows NTFS + die Größe ist 1024. die Kommentare unten für weitere Größen anzeigen.

Hier ist, was der Standard sagt: http://www.opengroup.org /onlinepubs/009695399/functions/pwrite.html .

  

Wenn der O_APPEND Flag des Dateistatusflags gesetzt ist, versetzte die Datei wird vor jedes Schreiben in das Ende der Datei gesetzt werden und keine intervenierenden Dateiänderungsoperation wird zwischen der Änderung der Dateioffset und der Schreiboperation auftreten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top