{"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\/no\/blog\/administrirovanie\/ustojchivoe-hranenie-dannyh-i-fajlovye-api-linux","title":{"rendered":"B\u00e6rekraftig datalagring og fil-API for Linux","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Jeg, mens jeg unders\u00f8ker b\u00e6rekraften til datalagring i skytjenester, bestemte meg for \u00e5 teste min forst\u00e5else av de grunnleggende prinsippene. Jeg <noindex><a rel=\"nofollow\" href=\"https:\/\/www.evanjones.ca\/durability-nvme.html\">begynte med \u00e5 lese spesifikasjonen for NVMe<\/a><\/noindex> for \u00e5 forst\u00e5 hvilke garantier for b\u00e6rekraftig datalagring (det vil si garantier for at dataene vil v\u00e6re tilgjengelige etter et systemfeil) NVMe-disker gir oss. Jeg kom til f\u00f8lgende hovedkonklusjoner: man m\u00e5 anse data som skadet fra det \u00f8yeblikket skrivekommandoen er gitt, og frem til skriveprosessen er fullf\u00f8rt p\u00e5 lagringsenheten. Imidlertid brukes systemanrop i de fleste dataskrivingsprogrammer helt uten problemer.<\/p>\n<p>I dette materialet unders\u00f8ker jeg mekanismene for b\u00e6rekraftig datalagring som tilbys av Linux-fil-APIene. Det virker som om dette b\u00f8r v\u00e6re enkelt: programmet kaller kommandoen <code>write()<\/code>, og etter at arbeidet med denne kommandoen er fullf\u00f8rt, vil dataene v\u00e6re p\u00e5litelig lagret p\u00e5 disken. Men <code>write()<\/code> den bare kopierer applikasjonsdata inn i kjernebufferet, som ligger i RAM. For \u00e5 tvinge systemet til \u00e5 skrive dataene til disken, m\u00e5 man bruke noen ekstra mekanismer.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/524172\/\"><img decoding=\"async\" alt=\"B\u00e6rekraftig datalagring og fil-API for Linux\" src=\"\/wp-content\/uploads\/2020\/10\/b974dcb9fc546cae03ade4f3d8f5dc25.png\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p>Generelt sett er dette materialet et sett med notater om hva jeg har l\u00e6rt om det emnet som interesserer meg. Hvis jeg kort oppsummerer det viktigste, kan jeg si at for \u00e5 organisere b\u00e6rekraftig datalagring m\u00e5 man bruke kommandoen <code>fdatasync()<\/code> eller \u00e5pne filer med flagget <code>O_DSYNC<\/code>. Hvis du \u00f8nsker \u00e5 vite mer detaljert om hva som skjer med dataene fra programkoden til disken, se p\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/lwn.net\/Articles\/457667\/\">denne<\/a><\/noindex> artikkelen.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>S\u00e6rtrekk ved bruk av funksjonen write()<\/h2>\n<p>\nSystemanropet <code>write()<\/code> er definert i standarden <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/POSIX\">IEEE POSIX<\/a><\/noindex> som et fors\u00f8k p\u00e5 \u00e5 skrive data til en filbeskrivelse. Etter en vellykket fullf\u00f8ring av arbeidet <code>write()<\/code> b\u00f8r leseoperasjoner returnere akkurat de bytene som ble skrevet tidligere, ogs\u00e5 selv om dataene blir aksessert fra andre prosesser eller tr\u00e5der (<noindex><a rel=\"nofollow\" href=\"https:\/\/pubs.opengroup.org\/onlinepubs\/9699919799\/functions\/write.html#tag_16_685_08\">her<\/a><\/noindex> er den relevante delen av POSIX-standarden). <noindex><a rel=\"nofollow\" href=\"https:\/\/pubs.opengroup.org\/onlinepubs\/9699919799\/functions\/V2_chap02.html#tag_15_09_07\">Her<\/a><\/noindex>, i seksjonen som omhandler samhandling mellom tr\u00e5der og vanlige filoperasjoner, finnes det en merknad som sier at hvis hver av de to tr\u00e5dene kaller disse funksjonene, m\u00e5 hvert kall se enten alle de angitte konsekvensene som f\u00f8lge av utf\u00f8relsen av det andre kallet, eller ikke se noen konsekvenser i det hele tatt. Dette medf\u00f8rer at alle filoperasjoner for inn- og ut-data m\u00e5 opprettholde l\u00e5sing av ressursen de jobber med.<\/p>\n<p>Betyr dette at operasjonen <code>write()<\/code> er atom\u00e6r? Tekniskt sett \u2013 ja. Data lesingsoperasjoner m\u00e5 returnere enten alt, eller ingenting av det som ble skrevet med <code>write()<\/code>. Men operasjonen <code>write()<\/code>, i henhold til standarden, er ikke obligatorisk for \u00e5 fullf\u00f8re ved \u00e5 skrive alt som den ble foresl\u00e5tt \u00e5 skrive. Den kan tillate \u00e5 skrive bare en del av dataene. For eksempel kan vi ha to tr\u00e5der, hver av dem legger til 1024 byte til en fil, beskrevet av den samme filbeskriveren. Fra standardens synspunkt er resultatet akseptabelt n\u00e5r hver av skriveoperasjonene bare kan legge til \u00e9n byte til filen. Disse operasjonene vil forbli atom\u00e6re, men etter at de er fullf\u00f8rt, vil dataene de skrev til filen bli blandet. <noindex><a rel=\"nofollow\" href=\"https:\/\/stackoverflow.com\/a\/42442926\/413438\">Her er<\/a><\/noindex> en veldig interessant diskusjon om dette emnet p\u00e5 Stack Overflow.<\/p>\n<h2>Funksjonene fsync() og fdatasync()<\/h2>\n<p>\nDen enkleste m\u00e5ten \u00e5 skrive data til disk p\u00e5 er ved \u00e5 kalle funksjonen <noindex><a rel=\"nofollow\" href=\"https:\/\/man7.org\/linux\/man-pages\/man2\/fsync.2.html\">fsync()<\/a><\/noindex>. Denne funksjonen ber operativsystemet om \u00e5 overf\u00f8re alle modifiserte blokker fra bufferen til disken. Dette inkluderer ogs\u00e5 all metadata for filen (tilgangstid, tid for filmodifikasjon, osv.). Jeg tror behovet for disse metadataene sjelden oppst\u00e5r, s\u00e5 hvis du vet at de ikke er viktige for deg, kan du bruke funksjonen <code>fdatasync()<\/code>. I <noindex><a rel=\"nofollow\" href=\"https:\/\/man7.org\/linux\/man-pages\/man2\/fdatasync.2.html\">dokumentasjonen<\/a><\/noindex> om <code>fdatasync()<\/code> sies det at under arbeidet med denne funksjonen lagres det p\u00e5 disken s\u00e5 mye metadata som \"er n\u00f8dvendig for korrekt utf\u00f8relse av de p\u00e5f\u00f8lgende lesing av data-operasjonene\". Og dette er akkurat det som bekymrer de fleste applikasjoner.<\/p>\n<p>Et av problemene som kan oppst\u00e5 her, er at disse mekanismene ikke garanterer at filen vil v\u00e6re mulig \u00e5 oppdage etter en potensiell feil. Spesielt n\u00e5r man oppretter en ny fil, m\u00e5 man kalle <code>fsync()<\/code> for the directory that contains it. Otherwise, after a crash, it may happen that this file does not exist. The reason for this is that in UNIX, due to the use of hard links, a file can exist in multiple directories. Therefore, when called, <code>fsync()<\/code> there is no way for the file to know which directory's data also needs to be flushed to disk (<noindex><a rel=\"nofollow\" href=\"https:\/\/www.quora.com\/When-should-you-fsync-the-containing-directory-in-addition-to-the-file-itself\">here<\/a><\/noindex> you can read more about it). It seems that the ext4 file system is capable <noindex><a rel=\"nofollow\" href=\"https:\/\/lwn.net\/Articles\/799807\/\">of automatically<\/a><\/noindex> applying <code>fsync()<\/code> to directories containing corresponding files, but this may not be the case with other file systems.<\/p>\n<p>This mechanism may be implemented differently in different file systems. I used <noindex><a rel=\"nofollow\" href=\"https:\/\/git.kernel.org\/pub\/scm\/linux\/kernel\/git\/axboe\/blktrace.git\/tree\/README\">blktrace<\/a><\/noindex> to find out what disk operations are used in the ext4 and XFS file systems. Both produce usual write commands to disk for both file contents and the file system journal, flushing the cache and completing the operation by executing FUA (Force Unit Access, writing data directly to disk, bypassing the cache) in the journal. They probably do this to confirm the fact of performing the operation. On disks that do not support FUA, this causes two cache flushes. My experiments showed that <code>fdatasync()<\/code> a little faster <code>fsync()<\/code>. The utility <code>blktrace<\/code> indicates that <code>fdatasync()<\/code> typically writes less data to disk (in ext4 <code>fsync()<\/code> writes 20 KiB, and <code>fdatasync()<\/code> \u2014 16 KiB). In addition, I found out that XFS is a bit faster than ext4. And here with the help of <code>blktrace<\/code> it was possible to find out that <code>fdatasync()<\/code> flushes less data to disk (4 KiB in XFS).<\/p>\n<h2>Ambiguous situations arising from the use of fsync()<\/h2>\n<p>\nI can recall three ambiguous situations regarding <code>fsync()<\/code>, with which I encountered in practice.<\/p>\n<p>The first such case occurred in 2008. At that time, the Firefox 3 interface would 'freeze' when writing a large number of files to disk. The problem was that in the implementation of the interface, SQLite was used to store information about its state. After each change in the interface, the function was called <code>fsync()<\/code>, which provided good guarantees for stable data storage. In the file system in use at that time, ext3, the function <code>fsync()<\/code> den nedlastet alt \"skitne\" sider i systemet til disken, ikke bare de som var knyttet til den aktuelle filen. Dette betydde at et klikk p\u00e5 knappen i Firefox kunne initiere skriving av megabytes med data til harddisken, noe som kunne ta mange sekunder. L\u00f8sningen p\u00e5 problemet, s\u00e5 langt jeg forstod fra <noindex><a rel=\"nofollow\" href=\"http:\/\/shaver.off.net\/diary\/2008\/05\/25\/fsyncers-and-curveballs\/\">dette<\/a><\/noindex> materialet, var \u00e5 flytte databaseh\u00e5ndteringen til asynkrone bakgrunnsoppgaver. Dette betyr at tidligere i Firefox ble det implementert strengere krav til datalagringens p\u00e5litelighet enn det som faktisk var n\u00f8dvendig, og egenskapene til filsystemet ext3 forverret bare dette problemet.<\/p>\n<p>Det andre avviket skjedde i 2009. Da, etter et systemkrasj, opplevde brukere av det nye filsystemet ext4 at mange nylig opprettede filer hadde null lengde, mens dette ikke skjedde med det eldre filsystemet ext3. I forrige avsnitt nevnte jeg at ext3 skrev for mye data til disken, noe som betydelig forsinket ytelsen. <code>fsync()<\/code>For \u00e5 forbedre situasjonen, skriver ext4 til disken kun de \"skitne\" sidene som er knyttet til den spesifikke filen. Data fra andre filer forblir i minnet i mye lengre tid enn ved bruk av ext3. Dette ble gjort for \u00e5 forbedre ytelsen (som standard forblir data i denne tilstanden i 30 sekunder, noe som kan justeres med <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\">here<\/a><\/noindex> man kan finne mer materiale om dette). Dette betyr at store mengder data kan g\u00e5 tapt irreversibelt etter et krasj. L\u00f8sningen p\u00e5 dette problemet er \u00e5 bruke <code>fsync()<\/code> i applikasjoner som trenger \u00e5 sikre p\u00e5litelig datalagring og maksimalt beskytte dem mot konsekvensene av krasj. Funksjonen <code>fsync()<\/code> fungerer betydelig bedre med ext4 enn med ext3. Ulempen med denne tiln\u00e6rmingen er at dens anvendelse, som f\u00f8r, bremser utf\u00f8relsen av visse operasjoner, som installasjon av programmer. Se detaljer om dette <noindex><a rel=\"nofollow\" href=\"https:\/\/lwn.net\/Articles\/322823\/\">her<\/a><\/noindex> og <noindex><a rel=\"nofollow\" href=\"https:\/\/thunk.org\/tytso\/blog\/2009\/03\/12\/delayed-allocation-and-the-zero-length-file-problem\/\">her<\/a><\/noindex>.<\/p>\n<p>Det tredje problemet, ang\u00e5ende <code>fsync()<\/code>, oppsto i 2018. Da, som en del av PostgreSQL-prosjektet, ble det fastsl\u00e5tt at hvis funksjonen <code>fsync()<\/code> m\u00f8ter en feil, merker den \"skitne\" sider som \"rene\". Som et resultat blir de p\u00e5f\u00f8lgende kallene <code>fsync()<\/code> man kan ikke gj\u00f8re noe med slike sider. P\u00e5 grunn av dette lagres de modifiserte sidene i minnet og skrives aldri til disken. Dette er en virkelig katastrofe, ettersom applikasjonen vil tro at visse data er skrevet til disken, mens det i virkeligheten ikke er tilfelle. Slike feil <code>fsync()<\/code> er sjeldne, applikasjonen kan nesten ingenting gj\u00f8re for \u00e5 takle problemet. I dag, n\u00e5r dette skjer, krasjer PostgreSQL og andre applikasjoner. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.usenix.org\/conference\/atc20\/presentation\/rebello\">Her<\/a><\/noindex>, i artikkelen \u00abKan applikasjoner komme seg fra fsync-feil?\u00bb, blir dette problemet unders\u00f8kt i detalj. For \u00f8yeblikket er den beste l\u00f8sningen p\u00e5 dette problemet \u00e5 bruke Direct I\/O med flagget <code>O_SYNC<\/code> eller med flagget <code>O_DSYNC<\/code>. Med denne tiln\u00e6rmingen vil systemet rapportere om feil som kan oppst\u00e5 under spesifikke dataskriveoperasjoner, men denne tiln\u00e6rmingen krever at applikasjonen administrerer buffere selv. Les mer om dette <noindex><a rel=\"nofollow\" href=\"https:\/\/lwn.net\/Articles\/752063\/\">her<\/a><\/noindex> og <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.postgresql.org\/wiki\/Fsync_Errors\">her<\/a><\/noindex>.<\/p>\n<h2>\u00c5pning av filer med flaggene O_SYNC og O_DSYNC<\/h2>\n<p>\nLa oss g\u00e5 tilbake til diskusjonen om mekanismer i Linux som sikrer vedvarende datalagring. Det handler spesifikt om bruk av flagget <code>O_SYNC<\/code> eller flagget <code>O_DSYNC<\/code> ved \u00e5pning av filer med systemanropet <noindex><a rel=\"nofollow\" href=\"https:\/\/man7.org\/linux\/man-pages\/man2\/open.2.html\">open()<\/a><\/noindex>. Med denne tiln\u00e6rmingen blir hver dataskriving vurdert som om kommandoene <code>write()<\/code> systemet f\u00e5r, henholdsvis, kommandoer <code>fsync()<\/code> og <code>fdatasync()<\/code>. I <noindex><a rel=\"nofollow\" href=\"https:\/\/pubs.opengroup.org\/onlinepubs\/009695399\/basedefs\/xbd_chap03.html#tag_03_373\">spesifikasjonene fra POSIX<\/a><\/noindex> kalles dette \u00abSynchronized I\/O File Integrity Completion\u00bb og \u00abData Integrity Completion\u00bb. Den st\u00f8rste fordelen med denne tiln\u00e6rmingen er at for \u00e5 sikre dataintegritet m\u00e5 man bare gj\u00f8re ett systemanrop, ikke to (for eksempel \u2014 <code>write()<\/code> og <code>fdatasync()<\/code>). Den st\u00f8rste ulempen med denne tiln\u00e6rmingen er at alle skriveoperasjoner som bruker den aktuelle filbeskrivelsen vil bli synkronisert, noe som kan begrense mulighetene for \u00e5 strukturere applikasjonskoden.<\/p>\n<h2>Bruk av Direct I\/O med flagget O_DIRECT<\/h2>\n<p>\nSystemanropet <code>open()<\/code> st\u00f8tter flagget <code>O_DIRECT<\/code>, som er ment for \u00e5 omg\u00e5 operativsystemets buffer og utf\u00f8re I\/O-operasjoner ved \u00e5 samhandle direkte med disken. Dette betyr i mange tilfeller at skrivekommandoer utstedt av programmet vil bli direkte overf\u00f8rt til kommandoer som er m\u00e5lrettet mot diskoperasjoner. Men generelt er ikke denne mekanismen en erstatning for funksjonene <code>fsync()<\/code> eller <code>fdatasync()<\/code>. Poenget er at selve disken kan <noindex><a rel=\"nofollow\" href=\"https:\/\/www.evanjones.ca\/durability-nvme.html\">utsette eller cache<\/a><\/noindex> de relevante data skrive kommandoene. Og, hva som er verre, i noen spesielle tilfeller kan I\/O-operasjoner utf\u00f8rt med flagget <code>O_DIRECT<\/code>, <noindex><a rel=\"nofollow\" href=\"https:\/\/ext4.wiki.kernel.org\/index.php\/Clarifying_Direct_IO%27s_Semantics\">oversettes<\/a><\/noindex> til tradisjonelle bufferiserte operasjoner. Det er enklest \u00e5 l\u00f8se dette problemet ved \u00e5 \u00e5pne filer med flagget <code>O_DSYNC<\/code>, noe som vil bety at det vil v\u00e6re et kall etter hver skriveoperasjon <code>fdatasync()<\/code>.<\/p>\n<p>Det har vist seg at filsystemet XFS nylig har f\u00e5tt en 'hurtigvei' for <code>O_DIRECT|O_DSYNC<\/code>-skriving av data. Hvis en blokk blir overskrevet med bruk av <code>O_DIRECT|O_DSYNC<\/code>, s\u00e5 vil XFS, i stedet for \u00e5 t\u00f8mme cachen, utf\u00f8re FUA-skrivekommandoen dersom enheten st\u00f8tter det. Jeg bekreftet dette ved \u00e5 bruke verkt\u00f8yet <code>blktrace<\/code> i Linux 5.4\/Ubuntu 20.04. Denne tiln\u00e6rmingen b\u00f8r v\u00e6re mer effektiv, da den skriver et minimum av data til disken og samtidig bruker \u00e9n operasjon snarere enn to (skrive og t\u00f8mme cache). Jeg fant en lenke til <noindex><a rel=\"nofollow\" href=\"https:\/\/patchwork.kernel.org\/patch\/10250257\/\">patch<\/a><\/noindex> fra kjernen i 2018, der denne mekanismen er implementert. Det er en diskusjon der som omhandler bruk av denne optimaliseringen i andre filsystemer, men s\u00e5 vidt jeg vet, er XFS det eneste filsystemet som s\u00e5 langt st\u00f8tter dette.<\/p>\n<h2>sync_file_range()<\/h2>\n<p>\nI Linux finnes det et systemkall <noindex><a rel=\"nofollow\" href=\"https:\/\/man7.org\/linux\/man-pages\/man2\/sync_file_range.2.html\">sync_file_range()<\/a><\/noindex>, som lar deg skrive til disk bare en del av en fil, ikke hele filen. Dette systemkallet initierer en asynkron skriving av data og venter ikke p\u00e5 at det skal fullf\u00f8res. Men det st\u00e5r i hjelpedokumentasjonen for <code>sync_file_range()<\/code> at denne kommandoen er 'sv\u00e6rt farlig'. Den anbefales ikke til bruk. Egenskapene og farene <code>sync_file_range()<\/code> er veldig godt beskrevet i <noindex><a rel=\"nofollow\" href=\"http:\/\/yoshinorimatsunobu.blogspot.com\/2014\/03\/how-syncfilerange-really-works.html\">dette<\/a><\/noindex> materialet. I s\u00e6rdeleshet ser det ut til at dette systemkallet bruker RocksDB til \u00e5 styre n\u00e5r kjernen t\u00f8mmer 'skitne' data til disk. Men samtidig, for \u00e5 sikre varig datalagring, brukes ogs\u00e5 <code>fdatasync()<\/code>. I <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/facebook\/rocksdb\/search?q=sync_file_range\">koden<\/a><\/noindex> Det er interessante kommentarer om dette i RocksDB. For eksempel ser det ut til at kallet <code>sync_file_range()<\/code> n\u00e5r det brukes med ZFS ikke f\u00f8rer til at data skrives til disk. Erfaring forteller meg at kode som sjelden brukes, kan inneholde feil. Derfor ville jeg anbefale \u00e5 ikke bruke dette systemkallet uten absolutt n\u00f8dvendighet.<\/p>\n<h2>Systemkall som hjelper til med \u00e5 sikre varig datalagring<\/h2>\n<p>\nJeg har kommet frem til at for \u00e5 utf\u00f8re inn-\/utgangsoperasjoner som gir p\u00e5litelig datalagring, kan man bruke tre tiln\u00e6rminger. Alle krever et funksjonskall <code>fsync()<\/code> for katalogen der filen er opprettet. Her er disse tiln\u00e6rmingene:<\/p>\n<ol>\n<li>Kall p\u00e5 funksjonen <code>fdatasync()<\/code> eller <code>fsync()<\/code> etter funksjonen <code>write()<\/code> (bruk helst <code>fdatasync()<\/code>).<\/li>\n<li>Arbeid med filbeskrivelsen, \u00e5pnet med flagget <code>O_DSYNC<\/code> eller <code>O_SYNC<\/code> (bedre \u2014 med flagget <code>O_DSYNC<\/code>).<\/li>\n<li>Bruk av kommandoen <code>pwritev2()<\/code> med flagget <code>RWF_DSYNC<\/code> eller <code>RWF_SYNC<\/code> (foretrukket \u2014 med flagget <code>RWF_DSYNC<\/code>).<\/li>\n<\/ol>\n<p><\/p>\n<h2>Notater om ytelse<\/h2>\n<p>\nJeg har ikke utf\u00f8rt grundige m\u00e5linger av ytelsen til de forskjellige mekanismene jeg har unders\u00f8kt. Mine observerte hastighetsforskjeller er ganske sm\u00e5. Dette betyr at jeg kan ta feil, og at det i andre forhold kan gi andre resultater. F\u00f8rst vil jeg fortelle hva som p\u00e5virker ytelsen mest, og deretter hva som har mindre innvirkning.<\/p>\n<ol>\n<li>Overskriving av fildata er raskere enn \u00e5 legge til data til filen (ytelsesgevinsten kan v\u00e6re 2-100%). \u00c5 legge til data til filen krever ytterligere endringer i filens metainformasjon, selv etter systemkallet <code>fallocate()<\/code>, men omfanget av denne effekten kan variere. Jeg anbefaler \u00e5 kalle <code>fallocate()<\/code> for \u00e5 forh\u00e5ndsallokere n\u00f8dvendig plass. Deretter m\u00e5 dette omr\u00e5det eksplisitt fylles med nuller og kalle <code>fsync()<\/code>. Dette s\u00f8rger for at de aktuelle blokkene i filsystemet merkes som \u00aballokert\u00bb, og ikke som \u00abikke-allokert\u00bb. Dette gir en liten (omtrent 2%) ytelsesforbedring. I tillegg kan f\u00f8rste tilgang til en blokk p\u00e5 noen disker v\u00e6re tregere enn andre. Dette betyr at fylling av plass med nuller kan f\u00f8re til en betydelig (omtrent 100%) ytelsesforbedring. Spesielt kan dette skje med disker <noindex><a rel=\"nofollow\" href=\"https:\/\/n2ws.com\/blog\/how-to-guides\/pre-warm-ebs-volumes-on-aws\">AWS EBS<\/a><\/noindex> (dette er ikke-offisielle data, jeg har ikke kunnet bekrefte dem). Det samme gjelder for lagringer <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/compute\/docs\/disks\/benchmarking-pd-performance\">GCP Persistent Disk<\/a><\/noindex> (og dette er allerede offisiell informasjon bekreftet av tester). Andre spesialister har gjort de samme <noindex><a rel=\"nofollow\" href=\"http:\/\/yoshinorimatsunobu.blogspot.com\/2009\/05\/overwriting-is-much-faster-than_28.html\">observasjonene<\/a><\/noindex>, relatert til forskjellige disker.<\/li>\n<li>Jo f\u00e6rre systemkall, jo h\u00f8yere ytelse (gevinsten kan v\u00e6re omtrent 5%). Det ser ut til at \u00e5 kalle <code>open()<\/code> med flagget <code>O_DSYNC<\/code> eller kalle <code>pwritev2()<\/code> med flagget <code>RWF_SYNC<\/code> raskall av <code>fdatasync()<\/code>. Eg har ei mistanke om at dette har \u00e5 gjere med at n\u00e5r ein tar denne tiln\u00e6rminga, s\u00e5 spelar det ei rolle at for \u00e5 l\u00f8yse den same oppg\u00e5va m\u00e5 ein utf\u00f8re f\u00e6rre systemkall (ein kall i staden for to). Men forskjellen i ytelse er sv\u00e6rt liten, s\u00e5 du kan heilt klart ignorere det og bruke det i applikasjonen som ikkje vil f\u00f8re til komplisering av logikken.<\/li>\n<\/ol>\n<p>\nDersom du er interessert i temaet omhaldande datalagring \u2014 her er nokre nyttige ressursar:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.scylladb.com\/2017\/10\/05\/io-access-methods-scylla\/\">I\/O tilgangsmetodar<\/a><\/noindex> \u2014 ei oversikt over grunnprinsippa for inndatakontroll.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/lwn.net\/Articles\/457667\/\">Sikring av at data n\u00e5r disken<\/a><\/noindex> \u2014 ein fortelling om kva som skjer med data p\u00e5 veg fr\u00e5 applikasjonen til disken.<\/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\">N\u00e5r b\u00f8r du fsync katalogen som inneheld<\/a><\/noindex> \u2014 svaret p\u00e5 sp\u00f8rsm\u00e5let om n\u00e5r det er n\u00f8dvendig \u00e5 bruke <code>fsync()<\/code> for katalogar. I korte trekk, dette b\u00f8r gjerast ved oppretting av ei ny fil, og grunnen til denne anbefalinga er at det i Linux kan finnast mange referansar til den same fila.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/bobsql.com\/sql-server-on-linux-forced-unit-access-fua-internals\/\">SQL Server p\u00e5 Linux: FUA-internals<\/a><\/noindex> \u2014 her finnes det ei beskrivelse av korleis robust datalagring er implementert i SQL Server p\u00e5 Linux-plattforma. Her er det einige interessante samanlikningar mellom systemkall i Windows og Linux. Eg er nesten sikker p\u00e5 at eg l\u00e6rte om FUA-optimalisering av XFS takka vere dette materialet.<\/li>\n<\/ul>\n<p>\nHar du tapt data som du trudde var sikkert lagra p\u00e5 disken?<\/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=\"B\u00e6rekraftig datalagring og fil-API for 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=\"B\u00e6rekraftig datalagring og fil-API for Linux\" src=\"\/wp-content\/uploads\/2020\/10\/d9fd0b1c09eb6e40944aee2d13ee4088.png\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<br \/>Kilde: <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 5.0.5 - 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.\" \/>\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\/no\/blog\/administrirovanie\/ustojchivoe-hranenie-dannyh-i-fajlovye-api-linux\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.5\" \/>\n\t\t<meta property=\"og:locale\" content=\"nn_NO\" \/>\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.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/no\/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\udd47Robust datalagring og fil-API i Linux | ProHoster","description":"Eg, som har utforska robust datalagring i skybaserte system, har bestemt meg for \u00e5 sjekke meg sj\u00f8lv, for \u00e5 vere sikker p\u00e5 at eg forst\u00e5r dei grunnleggjande prinsippa.","canonical_url":"https:\/\/prohoster.info\/no\/blog\/administrirovanie\/ustojchivoe-hranenie-dannyh-i-fajlovye-api-linux","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nn_NO","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.","og:url":"https:\/\/prohoster.info\/no\/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":{"focus":[],"additional":[]},"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":"2026-08-11 12:50:05","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts\/98090","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/comments?post=98090"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts\/98090\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/media\/98091"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/media?parent=98090"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/categories?post=98090"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/tags?post=98090"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}