{"id":98090,"date":"2020-10-24T02:42:38","date_gmt":"2020-10-24T00:42:38","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/ustojchivoe-hranenie-dannyh-i-fajlovye-api-linux"},"modified":"2020-11-18T00:58:48","modified_gmt":"2020-11-17T22:58:48","slug":"ustojchivoe-hranenie-dannyh-i-fajlovye-api-linux","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/ustojchivoe-hranenie-dannyh-i-fajlovye-api-linux","title":{"rendered":"Zuverl\u00e4ssige Datenspeicherung und Dateischnittstellen in Linux","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ich habe die Zuverl\u00e4ssigkeit der Datenspeicherung in Cloud-Systemen untersucht und wollte mich selbst pr\u00fcfen, um sicherzustellen, dass ich die Grundlagen verstehe. Ich <noindex><a rel=\"nofollow\" href=\"https:\/\/www.evanjones.ca\/durability-nvme.html\">begann mit dem Lesen der NVMe-Spezifikation<\/a><\/noindex> , um herauszufinden, welche Garantien in Bezug auf die zuverl\u00e4ssige Datenspeicherung (also die Garantien, dass Daten nach einem Systemausfall verf\u00fcgbar sind) uns NVMe-Laufwerke bieten. Meine wichtigsten Erkenntnisse waren: Man muss Daten als besch\u00e4digt betrachten, sobald der Befehl zur Datenaufnahme gegeben wird, und bis der Schreibvorgang auf dem Speichermedium abgeschlossen ist. In den meisten Datensatzprogrammen werden allerdings system calls ganz ungeniert verwendet.<\/p>\n<p>In diesem Material untersuche ich die Mechanismen der zuverl\u00e4ssigen Datenspeicherung, die die Dateisystem-APIs von Linux bereitstellen. Es scheint, als sollte das einfach sein: Das Programm ruft den Befehl <code>write(),<\/code>, und nachdem dieser Befehl ausgef\u00fchrt wurde, sollten die Daten sicher auf der Festplatte gespeichert sein. Aber <code>write(),<\/code> kopiert nur die Anwendungsdaten in den Kernel-Cache, der im Arbeitsspeicher liegt. Um das System dazu zu zwingen, die Daten auf die Festplatte zu schreiben, m\u00fcssen einige zus\u00e4tzliche Mechanismen verwendet werden.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/524172\/\"><img decoding=\"async\" alt=\"Zuverl\u00e4ssige Datenspeicherung und Dateischnittstellen in Linux\" src=\"\/wp-content\/uploads\/2020\/10\/b974dcb9fc546cae03ade4f3d8f5dc25.png\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p>Insgesamt handelt es sich bei diesem Material um eine Sammlung von Notizen zu dem, was ich \u00fcber das f\u00fcr mich interessante Thema gelernt habe. Um das Wichtigste kurz zusammenzufassen: F\u00fcr eine nachhaltige Datenspeicherung sollte man den Befehl verwenden <code>fdatasync()<\/code> oder Dateien mit dem Flag <code>O_DSYNC<\/code>. Wenn Sie mehr \u00fcber die Details erfahren m\u00f6chten, die mit den Daten auf dem Weg vom Programmcode zur Festplatte verbunden sind, werfen Sie einen Blick auf <noindex><a rel=\"nofollow\" href=\"https:\/\/lwn.net\/Articles\/457667\/\">dieses<\/a><\/noindex> den Artikel.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Eigenschaften der Funktion write()<\/h2>\n<p>\nSystemaufruf <code>write(),<\/code> wird im Standard <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/POSIX\">IEEE POSIX<\/a><\/noindex> als Versuch definiert, Daten in einen Dateideskriptor zu schreiben. Nach erfolgreichem Abschluss <code>write(),<\/code> sollten Leseoperationen genau die Bytes zur\u00fcckgeben, die zuvor geschrieben wurden, selbst wenn auf die Daten von anderen Prozessen oder Threads zugegriffen wird (<noindex><a rel=\"nofollow\" href=\"https:\/\/pubs.opengroup.org\/onlinepubs\/9699919799\/functions\/write.html#tag_16_685_08\">hier ist<\/a><\/noindex> entsprechender Abschnitt des POSIX-Standards). <noindex><a rel=\"nofollow\" href=\"https:\/\/pubs.opengroup.org\/onlinepubs\/9699919799\/functions\/V2_chap02.html#tag_15_09_07\">Hier<\/a><\/noindex>, im Abschnitt, der sich mit der Interaktion von Threads und herk\u00f6mmlichen Dateioperationen befasst, gibt es einen Hinweis, der besagt, dass, wenn jeder der beiden Threads diese Funktionen aufruft, jeder Aufruf entweder alle spezifizierten Nebenwirkungen des anderen Aufrufs sehen sollte oder \u00fcberhaupt keine Nebenwirkungen. Dies f\u00fchrt zu der Schlussfolgerung, dass alle Datei-Eingabe\/Ausgabe-Operationen die Ressource, mit der sie arbeiten, sperren sollten.<\/p>\n<p>Bedeutet das, dass die Operation <code>write(),<\/code> atomar ist? Technisch gesehen \u2013 ja. Lesevorg\u00e4nge sollten entweder alles oder nichts von dem zur\u00fcckgeben, was durch <code>write(),<\/code>geschrieben wurde. Aber die Operation <code>write(),<\/code>, gem\u00e4\u00df dem Standard, muss nicht unbedingt alles, was ihr angeboten wurde, aufgezeichnet werden. Es ist ihr erlaubt, nur einen Teil der Daten zu speichern. Zum Beispiel k\u00f6nnen wir zwei Streams haben, die jeweils 1024 Byte zu einer Datei hinzuf\u00fcgen, die durch denselben Descriptor beschrieben wird. Aus Sicht des Standards w\u00e4re das akzeptable Ergebnis, wenn jede der Schreiboperationen nur ein Byte an die Datei anh\u00e4ngen kann. Diese Operationen bleiben atomar, aber nachdem sie abgeschlossen sind, werden die von ihnen in die Datei geschriebenen Daten vermischt sein. <noindex><a rel=\"nofollow\" href=\"https:\/\/stackoverflow.com\/a\/42442926\/413438\">Hier<\/a><\/noindex> eine sehr interessante Diskussion zu diesem Thema auf Stack Overflow.<\/p>\n<h2>Die Funktionen fsync() und fdatasync()<\/h2>\n<p>\nDer einfachste Weg, Daten auf die Festplatte zu schreiben, besteht darin, die Funktion <noindex><a rel=\"nofollow\" href=\"https:\/\/man7.org\/linux\/man-pages\/man2\/fsync.2.html\">fsync()<\/a><\/noindex>aufzurufen. Diese Funktion fordert das Betriebssystem auf, alle modifizierten Bl\u00f6cke aus dem Cache auf die Festplatte zu \u00fcbertragen. Dazu geh\u00f6ren auch alle Metadaten der Datei (Zugriffszeit, \u00c4nderungszeit der Datei usw.). Ich glaube, dass der Bedarf an diesen Metadaten selten auftritt, daher k\u00f6nnen Sie die Funktion <code>fdatasync()<\/code>In <noindex><a rel=\"nofollow\" href=\"https:\/\/man7.org\/linux\/man-pages\/man2\/fdatasync.2.html\">nachschlagen<\/a><\/noindex> zum <code>fdatasync()<\/code> Es wird gesagt, dass bei der Ausf\u00fchrung dieser Funktion eine Menge an Metadaten auf die Festplatte gespeichert wird, die \"notwendig ist, um die folgenden Datenlesevorg\u00e4nge korrekt durchzuf\u00fchren\". Und das ist genau das, was die meisten Anwendungen betrifft.<\/p>\n<p>Ein Problem, das hier auftreten kann, besteht darin, dass diese Mechanismen nicht garantieren, dass die Datei nach einem m\u00f6glichen Ausfall gefunden werden kann. Insbesondere muss beim Erstellen einer neuen Datei <code>fsync()<\/code> auf das Verzeichnis, das sie enth\u00e4lt, aufgerufen werden. Andernfalls kann es nach einem Ausfall passieren, dass diese Datei nicht existiert. Der Grund daf\u00fcr ist, dass in UNIX, aufgrund von harten Verlinkungen, eine Datei in mehreren Verzeichnissen existieren kann. Daher gibt es beim Aufruf von <code>fsync()<\/code> keinen Weg zu erfahren, dass die Daten eines bestimmten Verzeichnisses ebenfalls auf die Festplatte geschrieben werden m\u00fcssen (<noindex><a rel=\"nofollow\" href=\"https:\/\/www.quora.com\/When-should-you-fsync-the-containing-directory-in-addition-to-the-file-itself\">hier<\/a><\/noindex> dar\u00fcber kann man n\u00e4her lesen). Anscheinend ist das Dateisystem ext4 f\u00e4hig, <noindex><a rel=\"nofollow\" href=\"https:\/\/lwn.net\/Articles\/799807\/\">automatisch<\/a><\/noindex> anzuwenden <code>fsync()<\/code> zu Verzeichnissen zu verlinken, die die entsprechenden Dateien enthalten, aber bei anderen Dateisystemen k\u00f6nnte dies anders sein.<\/p>\n<p>Dieser Mechanismus kann in verschiedenen Dateisystemen unterschiedlich implementiert sein. Ich habe verwendet <noindex><a rel=\"nofollow\" href=\"https:\/\/git.kernel.org\/pub\/scm\/linux\/kernel\/git\/axboe\/blktrace.git\/tree\/README\">blktrace<\/a><\/noindex> um herauszufinden, welche Diskoperationen in den Dateisystemen ext4 und XFS verwendet werden. Beide f\u00fchren normale Schreibbefehle auf die Festplatte sowohl f\u00fcr den Dateiinhalte als auch f\u00fcr das Dateisystemprotokoll aus, leeren den Cache und beenden den Vorgang, indem sie eine FUA-Aufzeichnung (Force Unit Access, das direkte Schreiben von Daten auf die Festplatte, um den Cache zu umgehen) im Protokoll durchf\u00fchren. Wahrscheinlich machen sie das, um den Abschluss der Operation zu best\u00e4tigen. Bei Festplatten, die FUA nicht unterst\u00fctzen, f\u00fchrt dies zu zwei Cache-Leerungen. Meine Experimente haben gezeigt, dass <code>fdatasync()<\/code> etwas schneller <code>fsync()<\/code>. Das Tool <code>blktrace<\/code> darauf hinweist, dass <code>fdatasync()<\/code> normalerweise weniger Daten auf die Festplatte schreibt (in ext4 <code>fsync()<\/code> werden 20 KiB geschrieben, w\u00e4hrend <code>fdatasync()<\/code> 16 KiB). Au\u00dferdem habe ich festgestellt, dass XFS etwas schneller ist als ext4. Dabei konnte ich <code>blktrace<\/code> herausfinden, dass <code>fdatasync()<\/code> weniger Daten auf die Festplatte leert (4 KiB in XFS).<\/p>\n<h2>Ambivalente Situationen, die bei der Verwendung von fsync() auftreten<\/h2>\n<p>\nIch kann mich an drei ambivalente Situationen erinnern, die ich in der Praxis erlebt habe. <code>fsync()<\/code>, mit denen ich konfrontiert wurde.<\/p>\n<p>Der erste solche Fall trat 2008 auf. Damals kam es bei der Benutzeroberfl\u00e4che von Firefox 3 zu Verz\u00f6gerungen, wenn eine gro\u00dfe Zahl von Dateien auf die Festplatte geschrieben wurde. Das Problem lag darin, dass bei der Implementierung der Benutzeroberfl\u00e4che zur Speicherung ihrer Zustandsinformationen eine SQLite-Datenbank verwendet wurde. Nach jeder \u00c4nderung in der Benutzeroberfl\u00e4che wurde eine Funktion aufgerufen <code>fsync()<\/code>, die gute Garantien f\u00fcr die zuverl\u00e4ssige Speicherung der Daten gab. Im damals verwendeten Dateisystem ext3 sorgte die Funktion <code>fsync()<\/code> daf\u00fcr, dass alle \"schmutzigen\" Seiten im System auf die Festplatte geschrieben wurden, und nicht nur die Seiten, die zu der betreffenden Datei geh\u00f6rten. Das bedeutete, dass ein Klick auf eine Schaltfl\u00e4che in Firefox das Schreiben von Megabyte an Daten auf die magnetische Festplatte ausl\u00f6sen konnte, was viele Sekunden in Anspruch nehmen konnte. Die L\u00f6sung des Problems, so wie ich das aus <noindex><a rel=\"nofollow\" href=\"http:\/\/shaver.off.net\/diary\/2008\/05\/25\/fsyncers-and-curveballs\/\">dieses Ergebnis herauskommt<\/a><\/noindex> dem Material verstanden habe, bestand darin, die Arbeit mit der Datenbank in asynchrone Hintergrundaufgaben zu verlagern. Das bedeutet, dass fr\u00fcher in Firefox strengere Anforderungen an die zuverl\u00e4ssige Speicherung der Daten umgesetzt wurden, als tats\u00e4chlich n\u00f6tig gewesen w\u00e4ren, und die Eigenschaften des Dateisystems ext3 dieses Problem nur versch\u00e4rften.<\/p>\n<p>Das zweite Problem trat im Jahr 2009 auf. Nach einem Systemausfall hatten Benutzer des neuen Dateisystems ext4 das Problem, dass viele neu erstellte Dateien eine Nulll\u00e4nge hatten, w\u00e4hrend bei dem \u00e4lteren Dateisystem ext3 dies nicht der Fall war. Im vorherigen Absatz erw\u00e4hnte ich, dass ext3 zu viele Daten auf die Festplatte schrieb, was die Leistung erheblich verlangsamte. <code>fsync()<\/code>Um die Situation zu verbessern, schreibt ext4 nur die \u201eschmutzigen\u201c Seiten auf die Festplatte, die sich auf eine bestimmte Datei beziehen. Die Daten anderer Dateien bleiben viel l\u00e4nger im Speicher als dies bei ext3 der Fall war. Dies wurde zur Leistungssteigerung eingef\u00fchrt (standardm\u00e4\u00dfig bleiben die Daten 30 Sekunden in diesem Zustand; dies kann mit Hilfe von <noindex><a rel=\"nofollow\" href=\"https:\/\/www.kernel.org\/doc\/Documentation\/sysctl\/vm.txt\">dirty_expire_centisecs<\/a><\/noindex>; <noindex><a rel=\"nofollow\" href=\"https:\/\/www.spinics.net\/lists\/linux-ext4\/msg68941.html\">hier<\/a><\/noindex> zus\u00e4tzlichen Materialien dar\u00fcber gefunden werden). Dies bedeutet, dass ein gro\u00dfer Datenumfang nach einem Ausfall unwiderruflich verloren gehen kann. Die L\u00f6sung dieses Problems liegt im Einsatz von <code>fsync()<\/code> Anwendungen, die eine dauerhafte Datenspeicherung sicherstellen und sie bestm\u00f6glich vor den Folgen von Ausf\u00e4llen sch\u00fctzen m\u00fcssen. Die Funktion <code>fsync()<\/code> arbeitet bei der Anwendung von ext4 deutlich effizienter als bei ext3. Der Nachteil dieses Ansatzes besteht darin, dass seine Anwendung, wie zuvor, die Ausf\u00fchrung bestimmter Operationen, wie die Installation von Programmen, verlangsamt. Weitere Einzelheiten dazu finden Sie <noindex><a rel=\"nofollow\" href=\"https:\/\/lwn.net\/Articles\/322823\/\">hier<\/a><\/noindex> \u0438 <noindex><a rel=\"nofollow\" href=\"https:\/\/thunk.org\/tytso\/blog\/2009\/03\/12\/delayed-allocation-and-the-zero-length-file-problem\/\">hier<\/a><\/noindex>.<\/p>\n<p>Das dritte Problem, das sich bezieht auf <code>fsync()<\/code>, trat im Jahr 2018 auf. Damals wurde im Rahmen des PostgreSQL-Projekts herausgefunden, dass wenn die Funktion <code>fsync()<\/code> auf einen Fehler st\u00f6\u00dft, sie \u00bbschmutzige\u00ab Seiten als \u00bbsauber\u00ab kennzeichnet. Infolgedessen f\u00fchren die folgenden Aufrufe <code>fsync()<\/code> nichts mit solchen Seiten durch. Aufgrund dessen verbleiben modifizierte Seiten im Speicher und werden nie auf die Festplatte geschrieben. Dies ist eine echte Katastrophe, da die Anwendung glauben wird, dass bestimmte Daten auf die Festplatte geschrieben wurden, in Wirklichkeit aber nicht. Solche Fehler <code>fsync()<\/code> sind selten, die Anwendung kann in solchen Situationen fast nichts tun, um das Problem zu bek\u00e4mpfen. Heutzutage, wenn dies passiert, beenden PostgreSQL und andere Anwendungen unerwartet. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.usenix.org\/conference\/atc20\/presentation\/rebello\">Hier<\/a><\/noindex>, im Artikel \u201eCan Applications Recover from fsync Failures?\u201c, wird dieses Problem ausf\u00fchrlich behandelt. Derzeit besteht die beste L\u00f6sung f\u00fcr dieses Problem in der Verwendung von Direct I\/O mit dem Flag <code>O_SYNC<\/code> oder mit dem Flag <code>O_DSYNC<\/code>. Bei diesem Ansatz wird das System \u00fcber Fehler informieren, die bei der Durchf\u00fchrung bestimmter Datenaufzeichnungsoperationen auftreten k\u00f6nnen, erfordert jedoch, dass die Anwendung die Puffer selbst verwaltet. Weitere Informationen dazu finden Sie <noindex><a rel=\"nofollow\" href=\"https:\/\/lwn.net\/Articles\/752063\/\">hier<\/a><\/noindex> \u0438 <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.postgresql.org\/wiki\/Fsync_Errors\">hier<\/a><\/noindex>.<\/p>\n<h2>\u00d6ffnen von Dateien mit den Flags O_SYNC und O_DSYNC<\/h2>\n<p>\nKehren wir zur Diskussion \u00fcber die Mechanismen von Linux zur\u00fcck, die eine zuverl\u00e4ssige Datenspeicherung gew\u00e4hrleisten. Insbesondere beziehen wir uns auf die Verwendung des Flags <code>O_SYNC<\/code> oder des Flags <code>O_DSYNC<\/code> beim \u00d6ffnen von Dateien mit einem Systemaufruf <noindex><a rel=\"nofollow\" href=\"https:\/\/man7.org\/linux\/man-pages\/man2\/open.2.html\">open(),<\/a><\/noindex>. Bei diesem Ansatz wird jede Datenaufzeichnungsoperation so ausgef\u00fchrt, als ob nach jedem Befehl <code>write(),<\/code> dem System entsprechend Befehle erteilt werden <code>fsync()<\/code> \u0438 <code>fdatasync()<\/code>In <noindex><a rel=\"nofollow\" href=\"https:\/\/pubs.opengroup.org\/onlinepubs\/009695399\/basedefs\/xbd_chap03.html#tag_03_373\">der POSIX-Spezifikation<\/a><\/noindex> wird dies als \u201eSynchronized I\/O File Integrity Completion\u201c und \u201eData Integrity Completion\u201c bezeichnet. Der Hauptvorteil dieses Ansatzes besteht darin, dass f\u00fcr die Gew\u00e4hrleistung der Datenintegrit\u00e4t lediglich ein Systemaufruf erforderlich ist, nicht zwei (zum Beispiel \u2014 <code>write(),<\/code> \u0438 <code>fdatasync()<\/code>). Der Hauptnachteil dieses Ansatzes besteht darin, dass alle Schreiboperationen, die den entsprechenden Dateideskriptor verwenden, synchronisiert werden, was die M\u00f6glichkeiten zur Strukturierung des Anwendungscodes einschr\u00e4nken kann.<\/p>\n<h2>Verwendung von Direct I\/O mit dem O_DIRECT-Flag<\/h2>\n<p>\nSystemaufruf <code>open(),<\/code> unterst\u00fctzt das Flag <code>O_DIRECT<\/code>, das dazu dient, Eingabe-\/Ausgabeoperationen direkt mit der Festplatte durchzuf\u00fchren, indem der Cache des Betriebssystems umgangen wird. Das bedeutet in vielen F\u00e4llen, dass die von der Software ausgegebenen Schreibbefehle direkt in Befehle f\u00fcr die Arbeit mit der Festplatte umgesetzt werden. Generally, this mechanism is not a replacement for the functions <code>fsync()<\/code> \u0438\u043b\u0438 <code>fdatasync()<\/code>. Das Problem ist, dass die Festplatte selbst <noindex><a rel=\"nofollow\" href=\"https:\/\/www.evanjones.ca\/durability-nvme.html\">Befehle zum Schreiben von Daten<\/a><\/noindex> verz\u00f6gern oder cachen kann. Und was noch schlimmer ist, in einigen speziellen F\u00e4llen werden die Eingabe-\/Ausgabeoperationen, die unter Verwendung des Flags <code>O_DIRECT<\/code>, <noindex><a rel=\"nofollow\" href=\"https:\/\/ext4.wiki.kernel.org\/index.php\/Clarifying_Direct_IO%27s_Semantics\">in traditionelle gepufferte Operationen umgewandelt.<\/a><\/noindex> Das Problem l\u00e4sst sich am einfachsten l\u00f6sen, indem man beim \u00d6ffnen von Dateien auch das Flag <code>O_DSYNC<\/code>verwendet, was bedeutet, dass jeder Schreiboperation ein Aufruf folgt <code>fdatasync()<\/code>.<\/p>\n<p>Es stellte sich heraus, dass in das XFS-Dateisystem k\u00fcrzlich ein 'schneller Pfad' f\u00fcr <code>O_DIRECT|O_DSYNC<\/code>zum Schreiben von Daten hinzugef\u00fcgt wurde. Wenn ein Block mit Verwendung von <code>O_DIRECT|O_DSYNC<\/code>, dann wird XFS anstelle des Cache-Flushs den FUA-Schreibbefehl ausf\u00fchren, sofern das Ger\u00e4t dies unterst\u00fctzt. Das habe ich mit dem Tool \u00fcberpr\u00fcft <code>blktrace<\/code> unter Linux 5.4\/Ubuntu 20.04. Dieser Ansatz sollte effizienter sein, da bei seiner Verwendung eine minimale Menge an Daten auf die Festplatte geschrieben wird und nur eine Operation verwendet wird, nicht zwei (Schreiben und Cache-Flush). Ich fand einen Link zu <noindex><a rel=\"nofollow\" href=\"https:\/\/patchwork.kernel.org\/patch\/10250257\/\">Patch<\/a><\/noindex> einem Kernel aus dem Jahr 2018, in dem dieser Mechanismus implementiert ist. Dort wird diskutiert, ob diese Optimierung auch in anderen Dateisystemen angewendet werden kann, aber soweit ich wei\u00df, ist XFS derzeit das einzige Dateisystem, das dies unterst\u00fctzt.<\/p>\n<h2>Die Funktion sync_file_range()<\/h2>\n<p>\nIn Linux gibt es einen Systemaufruf <noindex><a rel=\"nofollow\" href=\"https:\/\/man7.org\/linux\/man-pages\/man2\/sync_file_range.2.html\">sync_file_range()<\/a><\/noindex>, der es erm\u00f6glicht, nur einen Teil einer Datei auf die Festplatte zu schreiben, anstatt die gesamte Datei. Dieser Aufruf initiiert eine asynchrone Daten\u00fcbertragung und wartet nicht auf deren Abschluss. Aber in der Dokumentation zu <code>sync_file_range()<\/code> wird gesagt, dass dieser Befehl \"sehr gef\u00e4hrlich\" ist. Es wird nicht empfohlen, ihn zu verwenden. Die Besonderheiten und Gefahren <code>sync_file_range()<\/code> sind sehr gut beschrieben in <noindex><a rel=\"nofollow\" href=\"http:\/\/yoshinorimatsunobu.blogspot.com\/2014\/03\/how-syncfilerange-really-works.html\">diesem<\/a><\/noindex> In dem Material. Insbesondere scheint dieser Aufruf RocksDB zu verwenden, um zu steuern, wann der Kernel \"schmutzige\" Daten auf die Festplatte schreibt. Dabei wird jedoch auch f\u00fcr die dauerhafte Speicherung von Daten <code>fdatasync()<\/code>In <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/facebook\/rocksdb\/search?q=sync_file_range\">Code<\/a><\/noindex> Bei RocksDB gibt es interessante Kommentare zu diesem Thema. Zum Beispiel scheint es, dass der Aufruf <code>sync_file_range()<\/code> bei der Verwendung von ZFS nicht zu einem Schreiben von Daten auf die Festplatte f\u00fchrt. Die Erfahrung zeigt mir, dass seltener genutzter Code m\u00f6glicherweise Fehler enth\u00e4lt. Daher w\u00fcrde ich raten, diesen Systemaufruf nur im \u00e4u\u00dfersten Notfall zu verwenden.<\/p>\n<h2>Systemaufrufe, die die dauerhafte Speicherung von Daten unterst\u00fctzen<\/h2>\n<p>\nIch bin zu dem Schluss gekommen, dass f\u00fcr die Durchf\u00fchrung von Ein-\/Ausgabe-Operationen, die die dauerhafte Speicherung von Daten gew\u00e4hrleisten, drei Ans\u00e4tze verwendet werden k\u00f6nnen. Alle erfordern den Aufruf der Funktion <code>fsync()<\/code> f\u00fcr das Verzeichnis, in dem die Datei erstellt wurde. Hier sind diese Ans\u00e4tze:<\/p>\n<ol>\n<li>Der Aufruf der Funktion <code>fdatasync()<\/code> \u0438\u043b\u0438 <code>fsync()<\/code> nach der Funktion <code>write(),<\/code> (es ist besser, <code>fdatasync()<\/code>).<\/li>\n<li>Mit einem Dateideskriptor zu arbeiten, der mit der Flagge <code>O_DSYNC<\/code> \u0438\u043b\u0438 <code>O_SYNC<\/code> (besser \u2014 mit der Flagge <code>O_DSYNC<\/code>).<\/li>\n<li>Verwendung des Befehls <code>pwritev2()<\/code> das Flag <code>RWF_DSYNC<\/code> \u0438\u043b\u0438 <code>RWF_SYNC<\/code> (bevorzugt \u2014 mit der Flagge <code>RWF_DSYNC<\/code>).<\/li>\n<\/ol>\n<p><\/p>\n<h2>Leistungsnotizen<\/h2>\n<p>\nIch habe die Leistung der verschiedenen von mir untersuchten Mechanismen nicht sorgf\u00e4ltig gemessen. Die Unterschiede in der Geschwindigkeit, die mir aufgefallen sind, sind recht gering. Das bedeutet, dass ich mich irren k\u00f6nnte und dass unter anderen Bedingungen dasselbe zu anderen Ergebnissen f\u00fchren kann. Zuerst werde ich dar\u00fcber sprechen, was einen st\u00e4rkeren Einfluss auf die Leistung hat, und danach, was weniger Einfluss auf die Leistung hat.<\/p>\n<ol>\n<li>Das \u00dcberschreiben von Daten in einer Datei ist schneller als das Anh\u00e4ngen von Daten an eine Datei (der Leistungsgewinn kann 2-100% betragen). Das Anh\u00e4ngen von Daten an eine Datei erfordert zus\u00e4tzliche \u00c4nderungen an den Metadaten der Datei, selbst nach dem Systemaufruf <code>fallocate()<\/code>, aber das Ausma\u00df dieses Effekts kann variieren. Ich empfehle, um die beste Leistung zu gew\u00e4hrleisten, einen Aufruf zu t\u00e4tigen <code>fallocate()<\/code> zum vorherigen Reservieren des ben\u00f6tigten Speicherplatzes. Danach sollte dieser Speicherplatz ausdr\u00fccklich mit Nullen gef\u00fcllt und aufgerufen werden. <code>fsync()<\/code>. Dadurch werden die entsprechenden Bl\u00f6cke im Dateisystem als \u201eausgew\u00e4hlt\u201c und nicht als \u201enicht ausgew\u00e4hlt\u201c markiert. Dies erm\u00f6glicht eine geringe (etwa 2%) Leistungsverbesserung. Au\u00dferdem kann bei einigen Laufwerken die erste Zugriffsoperation auf einen Block langsamer sein als bei anderen. Das bedeutet, dass das Auff\u00fcllen des Speichers mit Nullen eine signifikante (von etwa 100%) Leistungsverbesserung zur Folge haben kann. Insbesondere kann dies bei Laufwerken auftreten. <noindex><a rel=\"nofollow\" href=\"https:\/\/n2ws.com\/blog\/how-to-guides\/pre-warm-ebs-volumes-on-aws\">AWS EBS<\/a><\/noindex> (dies sind inoffizielle Daten, die ich nicht best\u00e4tigen konnte). Dasselbe gilt f\u00fcr die Speicherl\u00f6sungen. <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/compute\/docs\/disks\/benchmarking-pd-performance\">GCP Persistent Disk<\/a><\/noindex> (dies ist bereits offizielle Information, die durch Tests best\u00e4tigt wurde). Andere Experten haben \u00e4hnliche <noindex><a rel=\"nofollow\" href=\"http:\/\/yoshinorimatsunobu.blogspot.com\/2009\/05\/overwriting-is-much-faster-than_28.html\">Beobachtungen<\/a><\/noindex>, die sich auf verschiedene Laufwerke beziehen.<\/li>\n<li>Je weniger Systemaufrufe \u2013 desto h\u00f6her die Leistung (die Verbesserung kann etwa 5% betragen). Es scheint, dass der Aufruf <code>open(),<\/code> das Flag <code>O_DSYNC<\/code> oder der Aufruf <code>pwritev2()<\/code> das Flag <code>RWF_SYNC<\/code> schneller ist als der Aufruf <code>fdatasync()<\/code>. Ich vermute, dass es daran liegt, dass bei einem solchen Ansatz die Rolle spielt, dass f\u00fcr die L\u00f6sung derselben Aufgabe weniger Systemaufrufe erforderlich sind (ein Aufruf anstelle von zwei). Aber der Leistungsunterschied ist sehr gering, sodass Sie ihn getrost ignorieren und in der Anwendung verwenden k\u00f6nnen, was die Logik nicht komplizierter macht.<\/li>\n<\/ol>\n<p>\nWenn Sie sich f\u00fcr das Thema der nachhaltigen Datenspeicherung interessieren \u2013 hier sind einige n\u00fctzliche Materialien:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.scylladb.com\/2017\/10\/05\/io-access-methods-scylla\/\">I\/O-Zugriffsmethoden<\/a><\/noindex> \u2013 eine \u00dcbersicht \u00fcber die Grundlagen der Eingabe-\/Ausgabemechanismen.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/lwn.net\/Articles\/457667\/\">Sicherstellen, dass Daten auf die Festplatte gelangen<\/a><\/noindex> \u2013 ein Bericht dar\u00fcber, was mit den Daten auf dem Weg von der Anwendung zur Festplatte passiert.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.quora.com\/When-should-you-fsync-the-containing-directory-in-addition-to-the-file-itself\">Wann sollte man das Verzeichnis fsync?<\/a><\/noindex> \u2013 eine Antwort auf die Frage, wann es notwendig ist, <code>fsync()<\/code> f\u00fcr Verzeichnisse anzuwenden. Zusammengefasst sollte dies beim Erstellen einer neuen Datei erfolgen, und der Grund f\u00fcr diese Empfehlung ist, dass es in Linux viele Verweise auf dieselbe Datei geben kann.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/bobsql.com\/sql-server-on-linux-forced-unit-access-fua-internals\/\">SQL Server auf Linux: FUA-Interna<\/a><\/noindex> \u2014 hier wird beschrieben, wie zuverl\u00e4ssige Datenspeicherung in SQL Server auf der Linux-Plattform implementiert ist. Es gibt einige interessante Vergleiche zwischen den Systemaufrufen von Windows und Linux. Ich bin mir fast sicher, dass ich durch dieses Material von der FUA-Optimierung von XFS erfahren habe.<\/li>\n<\/ul>\n<p>\nHaben Sie Daten verloren, von denen Sie dachten, sie seien sicher auf der Festplatte gespeichert?<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"http:\/\/ruvds.com\/ru-rub?utm_source=habr&amp;utm_medium=article&amp;utm_campaign=perevod&amp;utm_content=ustojchivoe_xranenie_dannyx_i_fajlovye_api_linux#order\"><img decoding=\"async\" alt=\"Zuverl\u00e4ssige Datenspeicherung und Dateischnittstellen in Linux\" src=\"\/wp-content\/uploads\/2020\/10\/8bea3fc2b65a5a683655d9c15e153c93.png\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"http:\/\/ruvds.com\/ru-rub\/news\/read\/123?utm_source=habr&amp;utm_medium=article&amp;utm_campaign=perevod&amp;utm_content=ustojchivoe_xranenie_dannyx_i_fajlovye_api_linux\"><img decoding=\"async\" alt=\"Zuverl\u00e4ssige Datenspeicherung und Dateischnittstellen in Linux\" src=\"\/wp-content\/uploads\/2020\/10\/d9fd0b1c09eb6e40944aee2d13ee4088.png\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<br \/>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/524172\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u042f, \u0438\u0441\u0441\u043b\u0435\u0434\u0443\u044f \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445, \u0440\u0435\u0448\u0438\u043b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441\u0435\u0431\u044f, \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u044e \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0432\u0435\u0449\u0438. \u042f \u043d\u0430\u0447\u0430\u043b \u0441 \u0447\u0442\u0435\u043d\u0438\u044f \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 NVMe \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u0442\u0435\u043c, \u043a\u0430\u043a\u0438\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438, \u043a\u0430\u0441\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 (\u0442\u043e \u0435\u0441\u0442\u044c \u2014 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043f\u043e\u0441\u043b\u0435 \u0441\u0431\u043e\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u044b), \u0434\u0430\u044e\u0442 \u043d\u0430\u043c NMVe-\u0434\u0438\u0441\u043a\u0438. \u042f \u0441\u0434\u0435\u043b\u0430\u043b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":98091,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-98090","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u042f, \u0438\u0441\u0441\u043b\u0435\u0434\u0443\u044f \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445, \u0440\u0435\u0448\u0438\u043b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441\u0435\u0431\u044f, \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u044e \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0432\u0435\u0449\u0438. \u042f \u043d\u0430\u0447\u0430\u043b \u0441 \u0447\u0442\u0435\u043d\u0438\u044f \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 NVMe \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u0442\u0435\u043c, \u043a\u0430\u043a\u0438\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438, \u043a\u0430\u0441\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 (\u0442\u043e \u0435\u0441\u0442\u044c \u2014 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043f\u043e\u0441\u043b\u0435 \u0441\u0431\u043e\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u044b), \u0434\u0430\u044e\u0442 \u043d\u0430\u043c NMVe-\u0434\u0438\u0441\u043a\u0438. \u042f \u0441\u0434\u0435\u043b\u0430\u043b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/ustojchivoe-hranenie-dannyh-i-fajlovye-api-linux\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0423\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0435 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0435 API Linux | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u042f, \u0438\u0441\u0441\u043b\u0435\u0434\u0443\u044f \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445, \u0440\u0435\u0448\u0438\u043b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441\u0435\u0431\u044f, \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u044e \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0432\u0435\u0449\u0438. \u042f \u043d\u0430\u0447\u0430\u043b \u0441 \u0447\u0442\u0435\u043d\u0438\u044f \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 NVMe \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u0442\u0435\u043c, \u043a\u0430\u043a\u0438\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438, \u043a\u0430\u0441\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 (\u0442\u043e \u0435\u0441\u0442\u044c \u2014 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043f\u043e\u0441\u043b\u0435 \u0441\u0431\u043e\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u044b), \u0434\u0430\u044e\u0442 \u043d\u0430\u043c NMVe-\u0434\u0438\u0441\u043a\u0438. \u042f \u0441\u0434\u0435\u043b\u0430\u043b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/ustojchivoe-hranenie-dannyh-i-fajlovye-api-linux\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-10-24T00:42:38+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-11-17T22:58:48+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Zuverl\u00e4ssige Datenspeicherung und File APIs f\u00fcr Linux | ProHoster","description":"Ich wollte meine Kenntnisse \u00fcber die Zuverl\u00e4ssigkeit der Datenspeicherung in Cloud-Systemen \u00fcberpr\u00fcfen und sicherstellen, dass ich die grundlegenden Aspekte verstehe. Ich begann damit, die NVMe-Spezifikation zu lesen, um herauszufinden, welche Garantien f\u00fcr die Zuverl\u00e4ssigkeit der Datenspeicherung (also daf\u00fcr, dass die Daten nach einem Systemausfall verf\u00fcgbar sind) uns NVMe-SSDs bieten. Ich stellte die folgenden wesentlichen Punkte fest","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/ustojchivoe-hranenie-dannyh-i-fajlovye-api-linux","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0423\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0435 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0435 API Linux | ProHoster","og:description":"\u042f, \u0438\u0441\u0441\u043b\u0435\u0434\u0443\u044f \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445, \u0440\u0435\u0448\u0438\u043b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441\u0435\u0431\u044f, \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u044e \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0432\u0435\u0449\u0438. \u042f \u043d\u0430\u0447\u0430\u043b \u0441 \u0447\u0442\u0435\u043d\u0438\u044f \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 NVMe \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u0442\u0435\u043c, \u043a\u0430\u043a\u0438\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438, \u043a\u0430\u0441\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 (\u0442\u043e \u0435\u0441\u0442\u044c \u2014 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043f\u043e\u0441\u043b\u0435 \u0441\u0431\u043e\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u044b), \u0434\u0430\u044e\u0442 \u043d\u0430\u043c NMVe-\u0434\u0438\u0441\u043a\u0438. \u042f \u0441\u0434\u0435\u043b\u0430\u043b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/ustojchivoe-hranenie-dannyh-i-fajlovye-api-linux","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-10-24T00:42:38+00:00","article:modified_time":"2020-11-17T22:58:48+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"98090","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 10:05:49","updated":"2022-09-28 03:22:19"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/98090","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=98090"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/98090\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/98091"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=98090"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=98090"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=98090"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}