{"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\/sv\/blog\/administrirovanie\/ustojchivoe-hranenie-dannyh-i-fajlovye-api-linux","title":{"rendered":"H\u00e5llbar datalagring och fil-API:er f\u00f6r Linux","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Jag, medan jag utforskade datalagringens h\u00e5llbarhet i molnsystem, beslutade att testa mig sj\u00e4lv f\u00f6r att s\u00e4kerst\u00e4lla att jag f\u00f6rst\u00e5r de grundl\u00e4ggande sakerna. Jag <noindex><a rel=\"nofollow\" href=\"https:\/\/www.evanjones.ca\/durability-nvme.html\">b\u00f6rjade med att l\u00e4sa specifikationen f\u00f6r NVMe<\/a><\/noindex> f\u00f6r att f\u00f6rst\u00e5 vilka garantier g\u00e4llande h\u00e5llbar datalagring (det vill s\u00e4ga garantier f\u00f6r att data kommer att vara tillg\u00e4ngliga efter systemfel) som NVMe-enheter ger oss. Jag drog f\u00f6ljande grundl\u00e4ggande slutsatser: man m\u00e5ste betrakta data som korrupta fr\u00e5n det \u00f6gonblick kommandot f\u00f6r skrivning av data ges och fram till dess att skrivningen har slutf\u00f6rts p\u00e5 lagringsmediet. Men i de flesta program f\u00f6r dataskrivning anv\u00e4nds utan problem systemanrop.<\/p>\n<p>I detta material utforskar jag mekanismerna f\u00f6r h\u00e5llbar datalagring som tillhandah\u00e5lls av fil-API:er i Linux. Det verkar som att det hela borde vara enkelt: programmet anropar kommandot <code>write()<\/code>, och efter det att detta kommando har slutf\u00f6rts, ska data vara s\u00e4kert lagrade p\u00e5 disken. Men <code>write()<\/code> kopierar bara applikationens data till k\u00e4rnkashen som ligger i det prim\u00e4ra minnet. F\u00f6r att tvinga systemet att skriva data p\u00e5 disken m\u00e5ste man anv\u00e4nda vissa ytterligare mekanismer.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/524172\/\"><img decoding=\"async\" alt=\"H\u00e5llbar datalagring och fil-API:er f\u00f6r Linux\" src=\"\/wp-content\/uploads\/2020\/10\/b974dcb9fc546cae03ade4f3d8f5dc25.png\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p>Sammanfattningsvis utg\u00f6r detta material en samling anteckningar om vad jag har l\u00e4rt mig om det \u00e4mne som intresserar mig. Om man ska kortfattat beskriva det mest viktiga, s\u00e5 inneb\u00e4r det att f\u00f6r att organisera h\u00e5llbar datalagring b\u00f6r man anv\u00e4nda kommandot <code>fdatasync()<\/code> eller \u00f6ppna filer med flaggan <code>O_DSYNC<\/code>. Om du \u00e4r intresserad av att l\u00e4sa mer ing\u00e5ende om vad som h\u00e4nder med data p\u00e5 v\u00e4gen fr\u00e5n programkoden till disken, kika p\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/lwn.net\/Articles\/457667\/\">denna<\/a><\/noindex> artikel.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Funktionens write() egenskaper<\/h2>\n<p>\nSystemanropet <code>write()<\/code> \u00e4r definierat i standarden <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/POSIX\">IEEE POSIX<\/a><\/noindex> som ett f\u00f6rs\u00f6k att skriva data till en filbeskrivare. Efter att operationen har slutf\u00f6rts framg\u00e5ngsrikt ska <code>write()<\/code> l\u00e4soperationer returnera exakt de byte som tidigare har skrivits, \u00e4ven om data beg\u00e4rs fr\u00e5n andra processer eller tr\u00e5dar (<noindex><a rel=\"nofollow\" href=\"https:\/\/pubs.opengroup.org\/onlinepubs\/9699919799\/functions\/write.html#tag_16_685_08\">h\u00e4r<\/a><\/noindex> den motsvarande delen av POSIX-standarden). <noindex><a rel=\"nofollow\" href=\"https:\/\/pubs.opengroup.org\/onlinepubs\/9699919799\/functions\/V2_chap02.html#tag_15_09_07\">H\u00e4r<\/a><\/noindex>, i avsnittet som handlar om interaktionen mellan tr\u00e5dar och vanliga filoperationer, finns en anm\u00e4rkning som s\u00e4ger att om var och en av de tv\u00e5 tr\u00e5darna anropar dessa funktioner, s\u00e5 m\u00e5ste varje anrop se antingen alla de angivna konsekvenser som ett annat anrop medf\u00f6r, eller inte se n\u00e5gra konsekvenser alls. Detta leder till slutsatsen att alla filin- och utdataoperationer m\u00e5ste beh\u00e5lla l\u00e5sning p\u00e5 den resurs de arbetar med.<\/p>\n<p>Betyder det att operationen <code>write()<\/code> \u00e4r atom\u00e4r? Tekniskt sett \u2014 ja. L\u00e4soperationer ska returnera antingen allt eller inget av det som skrivits med hj\u00e4lp av <code>write()<\/code>. Men operationen <code>write()<\/code>, enligt standarden, beh\u00f6ver inte n\u00f6dv\u00e4ndigtvis slutf\u00f6ras genom att skriva allt som den erbjudits att skriva. Den f\u00e5r utf\u00f6ra skrivning av endast en del av data. Till exempel kan vi ha tv\u00e5 tr\u00e5dar, var och en av dem l\u00e4gger till 1024 byte till en fil som beskrivs av samma filbeskrivare. Ur standardens synvinkel \u00e4r det acceptabelt att resultatet \u00e4r att varje skrivoperation kan justera filen med endast ett byte. Dessa operationer f\u00f6rblir atom\u00e4ra, men efter att de \u00e4r f\u00e4rdiga, kommer de data som skrivits av dem i filen att vara blandade. <noindex><a rel=\"nofollow\" href=\"https:\/\/stackoverflow.com\/a\/42442926\/413438\">H\u00e4r \u00e4r<\/a><\/noindex> en mycket intressant diskussion om detta p\u00e5 Stack Overflow.<\/p>\n<h2>Funktionerna fsync() och fdatasync()<\/h2>\n<p>\nDet enklaste s\u00e4ttet att skriva data till disken \u00e4r att anropa funktionen <noindex><a rel=\"nofollow\" href=\"https:\/\/man7.org\/linux\/man-pages\/man2\/fsync.2.html\">fsync()<\/a><\/noindex>. Denna funktion beg\u00e4r av operativsystemet att \u00f6verf\u00f6ra alla modifierade block fr\u00e5n cachen till disken. Detta inkluderar alla filmetadata (\u00e5tkomsttid, \u00e4ndringstid f\u00f6r filen och s\u00e5 vidare). Jag anser att behovet av dessa metadata s\u00e4llan uppst\u00e5r, s\u00e5 om du vet att de inte \u00e4r viktiga f\u00f6r dig, kan du anv\u00e4nda funktionen <code>fdatasync()<\/code>. I <noindex><a rel=\"nofollow\" href=\"https:\/\/man7.org\/linux\/man-pages\/man2\/fdatasync.2.html\">hj\u00e4lpen<\/a><\/noindex> per <code>fdatasync()<\/code> anger att under k\u00f6rningen av denna funktion sparas en m\u00e4ngd metadata till disken som \"\u00e4r n\u00f6dv\u00e4ndig f\u00f6r korrekt utf\u00f6rande av n\u00e4sta datal\u00e4sningsoperationer\". Och detta \u00e4r precis vad de flesta applikationer bryr sig om.<\/p>\n<p>Ett av problemen som kan uppst\u00e5 h\u00e4r \u00e4r att dessa mekanismer inte garanterar att filen kan uppt\u00e4ckas efter en eventuell krasch. Specifikt, n\u00e4r en ny fil skapas, m\u00e5ste man anropa <code>fsync()<\/code> f\u00f6r katalogen som den inneh\u00e5ller. Annars kan det efter ett fel bli s\u00e5 att denna fil inte finns. Anledningen till detta \u00e4r att i UNIX, p\u00e5 grund av anv\u00e4ndning av h\u00e5rda l\u00e4nkar, kan filen existera i flera kataloger. D\u00e4rf\u00f6r, vid anropet <code>fsync()<\/code> kan filen inte veta vilken specifik katalog som ocks\u00e5 ska skrivas till disken (<noindex><a rel=\"nofollow\" href=\"https:\/\/www.quora.com\/When-should-you-fsync-the-containing-directory-in-addition-to-the-file-itself\">). Ett typiskt exempel p\u00e5 anv\u00e4ndning:<\/a><\/noindex> om detta kan man l\u00e4sa mer). Det verkar som att filsystemet ext4 har f\u00f6rm\u00e5gan <noindex><a rel=\"nofollow\" href=\"https:\/\/lwn.net\/Articles\/799807\/\">automatiskt<\/a><\/noindex> att till\u00e4mpa <code>fsync()<\/code> till kataloger som inneh\u00e5ller motsvarande filer, men i fallet med andra filsystem kan det vara annorlunda.<\/p>\n<p>Denna mekanism kan implementeras p\u00e5 olika s\u00e4tt i olika filsystem. Jag anv\u00e4nde <noindex><a rel=\"nofollow\" href=\"https:\/\/git.kernel.org\/pub\/scm\/linux\/kernel\/git\/axboe\/blktrace.git\/tree\/README\">blktrace<\/a><\/noindex> f\u00f6r att f\u00e5 veta vilka diskoperationer som anv\u00e4nds i filsystemen ext4 och XFS. B\u00e5da ger vanliga skrivkommandon till disken b\u00e5de f\u00f6r filinneh\u00e5ll och f\u00f6r filsystemets logg, skriver ut cachen och avslutar operationen med en FUA-skrivning (Force Unit Access, data skrivs direkt till disken, f\u00f6rbi cachen) i loggen. Sannolikt g\u00f6r de s\u00e5 f\u00f6r att bekr\u00e4fta att operationen \u00e4gde rum. P\u00e5 diskar som inte st\u00f6djer FUA orsakar detta tv\u00e5 cache-skrivningar. Mina experiment visade att <code>fdatasync()<\/code> \u00e4r n\u00e5got snabbare <code>fsync()<\/code>. Verktyget <code>blktrace<\/code> indikerar att <code>fdatasync()<\/code> vanligtvis skriver mindre data till disken (i ext4 <code>fsync()<\/code> skriver 20 KiB, medan <code>fdatasync()<\/code> \u2013 16 KiB). Dessutom uppt\u00e4ckte jag att XFS \u00e4r n\u00e5got snabbare \u00e4n ext4. Och d\u00e4r lyckades <code>blktrace<\/code> f\u00e5 veta att <code>fdatasync()<\/code> skriver mindre data till disken (4 KiB i XFS).<\/p>\n<h2>Otydliga situationer som uppst\u00e5r vid anv\u00e4ndning av fsync()<\/h2>\n<p>\nJag kan minnas tre otydliga situationer som handlar om <code>fsync()<\/code>, som jag st\u00f6tt p\u00e5 i praktiken.<\/p>\n<p>Det f\u00f6rsta tillf\u00e4llet intr\u00e4ffade 2008. D\u00e5 \u201dfr\u00f6s\u201d Firefox 3:s gr\u00e4nssnitt om man skrev till disken med ett stort antal filer. Problemet var att i implementeringen av gr\u00e4nssnittet f\u00f6r att lagra information om dess tillst\u00e5nd anv\u00e4ndes en SQLite-databas. Efter varje f\u00f6r\u00e4ndring som \u00e4gde rum i gr\u00e4nssnittet anropades funktionen <code>fsync()<\/code>, vilket gav bra garantier f\u00f6r h\u00e5llbar datalagring. I det filsystem som anv\u00e4ndes d\u00e5, ext3, funktionen <code>fsync()<\/code> s\u00e4nde alla \"smutsiga\" sidor till disken i systemet, och inte bara de som hade att g\u00f6ra med den aktuella filen. Det innebar att ett klick p\u00e5 knappen i Firefox kunde initiera skrivning av megabyte data p\u00e5 den magnetiska disken, vilket kunde ta m\u00e5nga sekunder. L\u00f6sningen p\u00e5 problemet, s\u00e5 l\u00e5ngt jag f\u00f6rstod utifr\u00e5n <noindex><a rel=\"nofollow\" href=\"http:\/\/shaver.off.net\/diary\/2008\/05\/25\/fsyncers-and-curveballs\/\">detta<\/a><\/noindex> materialet, var att flytta databashanteringen till asynkrona bakgrundsuppgifter. Det betyder att det tidigare i Firefox fanns str\u00e4ngare krav p\u00e5 datalagringens motst\u00e5ndskraft \u00e4n vad som faktiskt var n\u00f6dv\u00e4ndigt, och egenskaperna hos filsystemet ext3 f\u00f6rv\u00e4rrade bara detta problem.<\/p>\n<p>Det andra problemet intr\u00e4ffade 2009. Efter en systemkrasch st\u00f6tte anv\u00e4ndare av det nya filsystemet ext4 p\u00e5 att m\u00e5nga nyligen skapade filer hade en noll l\u00e4ngd, medan s\u00e5dana problem inte intr\u00e4ffade med det \u00e4ldre filsystemet ext3. I det f\u00f6reg\u00e5ende stycket n\u00e4mnde jag att ext3 s\u00e4nde f\u00f6r mycket data till disken, vilket kraftigt f\u00f6rs\u00e4mrade prestandan. <code>fsync()<\/code>F\u00f6r att f\u00f6rb\u00e4ttra situationen s\u00e4nder ext4 endast de \"smutsiga\" sidorna som har att g\u00f6ra med den specifika filen till disken. Data fr\u00e5n andra filer stannar kvar i minnet under en mycket l\u00e4ngre tid \u00e4n n\u00e4r ext3 anv\u00e4nds. Detta gjordes f\u00f6r att f\u00f6rb\u00e4ttra prestanda (som standard f\u00f6rblir data i detta tillst\u00e5nd i 30 sekunder, och detta kan justeras med hj\u00e4lp av <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\">). Ett typiskt exempel p\u00e5 anv\u00e4ndning:<\/a><\/noindex> som kan hittas i ytterligare material om detta). Det inneb\u00e4r att en stor m\u00e4ngd data kan g\u00e5 f\u00f6rlorad efter en krasch. L\u00f6sningen p\u00e5 detta problem handlar om anv\u00e4ndning av <code>fsync()<\/code> i applikationer som beh\u00f6ver s\u00e4kerst\u00e4lla motst\u00e5ndskraftig datalagring och maximalt skydda den mot konsekvenserna av krasch. Funktionen <code>fsync()<\/code> \u00e4r mycket effektivare vid anv\u00e4ndning av ext4 \u00e4n vid anv\u00e4ndning av ext3. Nackdelen med detta tillv\u00e4gag\u00e5ngss\u00e4tt \u00e4r att dess till\u00e4mpning, liksom tidigare, saktar ner genomf\u00f6randet av vissa operationer, som installation av program. Mer information om detta finns i <noindex><a rel=\"nofollow\" href=\"https:\/\/lwn.net\/Articles\/322823\/\">h\u00e4r<\/a><\/noindex> och <noindex><a rel=\"nofollow\" href=\"https:\/\/thunk.org\/tytso\/blog\/2009\/03\/12\/delayed-allocation-and-the-zero-length-file-problem\/\">h\u00e4r<\/a><\/noindex>.<\/p>\n<p>Det tredje problemet, som r\u00f6r <code>fsync()<\/code>, intr\u00e4ffade 2018. Inom ramen f\u00f6r PostgreSQL-projektet fick man reda p\u00e5 att om funktionen <code>fsync()<\/code> st\u00f6ter p\u00e5 ett fel, markerar den \"smutsiga\" sidor som \"rena\". Som ett resultat markerar f\u00f6ljande anrop <code>fsync()<\/code> Inga \u00e5tg\u00e4rder vidtas med s\u00e5dana sidor. P\u00e5 grund av detta lagras modifierade sidor i minnet och skrivs aldrig till disken. Detta \u00e4r en riktig katastrof, eftersom applikationen kommer att tro att vissa data har skrivits till disken, n\u00e4r de i sj\u00e4lva verket inte har det. S\u00e5dana fel <code>fsync()<\/code> \u00e4r s\u00e4llsynta, applikationen kan n\u00e4stan inte g\u00f6ra n\u00e5got f\u00f6r att hantera problemet i s\u00e5dana situationer. Numera, n\u00e4r detta intr\u00e4ffar, kraschar PostgreSQL och andra applikationer. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.usenix.org\/conference\/atc20\/presentation\/rebello\">H\u00e4r<\/a><\/noindex>, i materialet \u00abKan applikationer \u00e5terh\u00e4mta sig fr\u00e5n fsync-fel?\u00bb, unders\u00f6ks detta problem i detalj. F\u00f6r n\u00e4rvarande \u00e4r den b\u00e4sta l\u00f6sningen p\u00e5 detta problem att anv\u00e4nda Direct I\/O med flaggan <code>O_SYNC<\/code> eller med flaggan <code>O_DSYNC<\/code>. Med denna metod rapporterar systemet om fel som kan uppst\u00e5 vid specifika dataskrivningsoperationer, men denna metod kr\u00e4ver att applikationen hanterar sina egna buffertar. L\u00e4s mer om detta <noindex><a rel=\"nofollow\" href=\"https:\/\/lwn.net\/Articles\/752063\/\">h\u00e4r<\/a><\/noindex> och <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.postgresql.org\/wiki\/Fsync_Errors\">h\u00e4r<\/a><\/noindex>.<\/p>\n<h2>\u00d6ppna filer med hj\u00e4lp av flaggorna O_SYNC och O_DSYNC<\/h2>\n<p>\nL\u00e5t oss \u00e5terv\u00e4nda till diskussionen om Linux-mekanismer som s\u00e4kerst\u00e4ller h\u00e5llbar datalagring. N\u00e4mligen handlar det om att anv\u00e4nda flaggan <code>O_SYNC<\/code> eller flaggan <code>O_DSYNC<\/code> vid \u00f6ppning av filer med hj\u00e4lp av systemanropet <noindex><a rel=\"nofollow\" href=\"https:\/\/man7.org\/linux\/man-pages\/man2\/open.2.html\">open()<\/a><\/noindex>. Med denna metod utf\u00f6rs varje dataskrivningsoperation som om systemet efter varje kommando ger motsvarande instruktioner <code>write()<\/code> enligt POSIX-specifikationerna <code>fsync()<\/code> och <code>fdatasync()<\/code>. I <noindex><a rel=\"nofollow\" href=\"https:\/\/pubs.opengroup.org\/onlinepubs\/009695399\/basedefs\/xbd_chap03.html#tag_03_373\">detta kallas \u00abSynchronized I\/O File Integrity Completion\u00bb och \u00abData Integrity Completion\u00bb. Den fr\u00e4msta f\u00f6rdelen med denna metod \u00e4r att f\u00f6r att s\u00e4kerst\u00e4lla dataintegritet beh\u00f6ver bara ett systemanrop g\u00f6ras, inte tv\u00e5 (till exempel \u2014<\/a><\/noindex> ). Huvudnackdelen med denna metod \u00e4r att alla skrivoperationer som anv\u00e4nder den relevanta filbeskrivaren kommer att synkroniseras, vilket kan begr\u00e4nsa m\u00f6jligheterna att strukturera applikationskoden. <code>write()<\/code> och <code>fdatasync()<\/code>Anv\u00e4ndning av Direct I\/O med flaggan O_DIRECT<\/p>\n<h2>st\u00f6djer flaggan<\/h2>\n<p>\nSystemanropet <code>open()<\/code> O_DIRECT <code>, som \u00e4r avsedd att, genom att kringg\u00e5 operativsystemets cache, utf\u00f6ra in- och utdataoperationer genom att interagera direkt med disken. Detta inneb\u00e4r i m\u00e5nga fall att skrivkommandon som utf\u00e4rdas av programmet direkt \u00f6vers\u00e4tts till kommandon som riktas till disken. Men i allm\u00e4nhet \u00e4r denna mekanism inte en ers\u00e4ttning f\u00f6r funktioner<\/code>. Det handlar om att sj\u00e4lva disken kan <code>fsync()<\/code> eller <code>fdatasync()<\/code>skjuta upp eller cacha <noindex><a rel=\"nofollow\" href=\"https:\/\/www.evanjones.ca\/durability-nvme.html\">skjuta upp eller cachelagra<\/a><\/noindex> relevanta dataskriverkommandon. Och v\u00e4rre \u00e4n s\u00e5, i vissa s\u00e4rskilda fall kan I\/O-operationer som utf\u00f6rs med flaggan <code>, som \u00e4r avsedd att, genom att kringg\u00e5 operativsystemets cache, utf\u00f6ra in- och utdataoperationer genom att interagera direkt med disken. Detta inneb\u00e4r i m\u00e5nga fall att skrivkommandon som utf\u00e4rdas av programmet direkt \u00f6vers\u00e4tts till kommandon som riktas till disken. Men i allm\u00e4nhet \u00e4r denna mekanism inte en ers\u00e4ttning f\u00f6r funktioner<\/code>, <noindex><a rel=\"nofollow\" href=\"https:\/\/ext4.wiki.kernel.org\/index.php\/Clarifying_Direct_IO%27s_Semantics\">\u00f6vers\u00e4tts<\/a><\/noindex> till traditionella buffrade operationer. Det enklaste s\u00e4ttet att l\u00f6sa detta problem \u00e4r att anv\u00e4nda en flagga f\u00f6r att \u00f6ppna filer <code>O_DSYNC<\/code>, vilket kommer att inneb\u00e4ra att varje skrivoperation f\u00f6ljs av ett samtal <code>fdatasync()<\/code>.<\/p>\n<p>Det visade sig att ett \"snabbt s\u00e4tt\" nyligen har lagts till i XFS-filsystemet f\u00f6r <code>O_DIRECT|O_DSYNC<\/code>-dataskrivningar. Om en block skrivs \u00f6ver med hj\u00e4lp av <code>O_DIRECT|O_DSYNC<\/code>, s\u00e5 kommer XFS, ist\u00e4llet f\u00f6r att spola cachen, att utf\u00f6ra FUA-skrivkommandot om enheten st\u00f6djer det. Jag bekr\u00e4ftade detta genom att anv\u00e4nda verktyget <code>blktrace<\/code> i Linux 5.4\/Ubuntu 20.04. Denna metod b\u00f6r vara effektivare, eftersom den skriver ett minimum av data till disken och endast utf\u00f6r en operation i st\u00e4llet f\u00f6r tv\u00e5 (skrivning och spola cachen). Jag fann en l\u00e4nk till <noindex><a rel=\"nofollow\" href=\"https:\/\/patchwork.kernel.org\/patch\/10250257\/\">patch<\/a><\/noindex> k\u00e4rnan fr\u00e5n 2018 d\u00e4r denna mekanism \u00e4r implementerad. D\u00e4r finns en diskussion som handlar om till\u00e4mpningen av denna optimering i andra filsystem, men s\u00e5vitt jag vet \u00e4r XFS det enda filsystemet som st\u00f6djer detta hittills.<\/p>\n<h2>funktionen sync_file_range()<\/h2>\n<p>\nI Linux finns det ett systemanrop <noindex><a rel=\"nofollow\" href=\"https:\/\/man7.org\/linux\/man-pages\/man2\/sync_file_range.2.html\">sync_file_range()<\/a><\/noindex>, som till\u00e5ter att endast en del av en fil spolas till disken, inte hela filen. Detta anrop initierar en asynkron avskrivning av data och v\u00e4ntar inte p\u00e5 dess slutf\u00f6rande. Men i dokumentationen f\u00f6r <code>sync_file_range()<\/code> n\u00e4mns det att detta kommando \u00e4r \"mycket farligt\". Det rekommenderas inte att anv\u00e4nda det. Funktionerna och farorna <code>sync_file_range()<\/code> \u00e4r mycket v\u00e4l beskrivna i <noindex><a rel=\"nofollow\" href=\"http:\/\/yoshinorimatsunobu.blogspot.com\/2014\/03\/how-syncfilerange-really-works.html\">detta<\/a><\/noindex> materialet. S\u00e4rskilt verkar det som att detta anrop anv\u00e4nder RocksDB f\u00f6r att hantera n\u00e4r k\u00e4rnan spolar \"smutsiga\" data till disken. Men d\u00e4r anv\u00e4nds ocks\u00e5 <code>fdatasync()<\/code>. I <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/facebook\/rocksdb\/search?q=sync_file_range\">koden<\/a><\/noindex> RocksDB har intressanta kommentarer om detta \u00e4mne. Till exempel verkar det som att anropet <code>sync_file_range()<\/code> vid anv\u00e4ndning av ZFS inte leder till att data spolas till disken. Min erfarenhet s\u00e4ger mig att kod som s\u00e4llan anv\u00e4nds kan inneh\u00e5lla buggar. D\u00e4rf\u00f6r skulle jag r\u00e5da dig att inte anv\u00e4nda detta systemanrop utan absolut n\u00f6dv\u00e4ndighet.<\/p>\n<h2>Systemanrop som hj\u00e4lper till att s\u00e4kerst\u00e4lla h\u00e5llbar datalagring<\/h2>\n<p>\nJag har kommit fram till att det finns tre tillv\u00e4gag\u00e5ngss\u00e4tt f\u00f6r att utf\u00f6ra in- och utdataoperationer som s\u00e4kerst\u00e4ller stabil lagring av data. Alla kr\u00e4ver att man anropar en funktion <code>fsync()<\/code> f\u00f6r katalogen d\u00e4r filen skapades. H\u00e4r \u00e4r dessa tillv\u00e4gag\u00e5ngss\u00e4tt:<\/p>\n<ol>\n<li>Anrop av funktionen <code>fdatasync()<\/code> eller <code>fsync()<\/code> efter funktionen <code>write()<\/code> (b\u00e4st att anv\u00e4nda <code>fdatasync()<\/code>).<\/li>\n<li>Arbete med en filbeskrivare som \u00f6ppnats med flaggan <code>O_DSYNC<\/code> eller <code>O_SYNC<\/code> (b\u00e4st \u2014 med flaggan <code>O_DSYNC<\/code>).<\/li>\n<li>Anv\u00e4nda kommandot <code>pwritev2()<\/code> med flaggan <code>RWF_DSYNC<\/code> eller <code>RWF_SYNC<\/code> (f\u00f6redrar \u2014 med flaggan <code>RWF_DSYNC<\/code>).<\/li>\n<\/ol>\n<p><\/p>\n<h2>Prestandanoteringar<\/h2>\n<p>\nJag har inte utf\u00f6rt noggranna m\u00e4tningar av prestandan f\u00f6r de olika mekanismer jag har unders\u00f6kt. De skillnader jag har observerat i hastighet \u00e4r ganska sm\u00e5. Det betyder att jag kan ha fel, och att samma sak kan ge andra resultat under andra f\u00f6rh\u00e5llanden. F\u00f6rst kommer jag att ber\u00e4tta om vad som har st\u00f6rst p\u00e5verkan p\u00e5 prestandan, och sedan om vad som p\u00e5verkar prestandan mindre.<\/p>\n<ol>\n<li>\u00d6verskrivning av filens data \u00e4r snabbare \u00e4n att bifoga data till filen (prestandavinsten kan vara 2-100%). Att bifoga data till filen kr\u00e4ver ytterligare \u00e4ndringar i filens metadata, \u00e4ven efter systemanropet <code>fallocate()<\/code>, men omfattningen av denna effekt kan variera. Jag rekommenderar att man anropar <code>fallocate()<\/code> f\u00f6r att f\u00f6rhandsallokera n\u00f6dv\u00e4ndigt utrymme. Sedan m\u00e5ste detta utrymme explicit fyllas med nollor och anropas <code>fsync()<\/code>. Tack vare detta kommer motsvarande block i filsystemet att m\u00e4rkas som \"allokerade\" ist\u00e4llet f\u00f6r \"icke-allokerade\". Detta ger en liten (ungef\u00e4r 2%) f\u00f6rb\u00e4ttring av prestandan. Dessutom kan den f\u00f6rsta \u00e5tkomstoperationen till en block p\u00e5 vissa diskar ta l\u00e4ngre tid \u00e4n andra. Det betyder att fyllning av utrymme med nollor kan leda till ett betydande (ungef\u00e4r 100%) f\u00f6rb\u00e4ttring av prestandan. Speciellt kan detta intr\u00e4ffa med diskar <noindex><a rel=\"nofollow\" href=\"https:\/\/n2ws.com\/blog\/how-to-guides\/pre-warm-ebs-volumes-on-aws\">AWS EBS<\/a><\/noindex> (detta \u00e4r icke-officiell data, jag kunde inte bekr\u00e4fta det). Detsamma g\u00e4ller lagringarna <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/compute\/docs\/disks\/benchmarking-pd-performance\">GCP Persistent Disk<\/a><\/noindex> (och detta \u00e4r redan officiell information, bekr\u00e4ftad genom tester). Andra experter har gjort liknande <noindex><a rel=\"nofollow\" href=\"http:\/\/yoshinorimatsunobu.blogspot.com\/2009\/05\/overwriting-is-much-faster-than_28.html\">observationer<\/a><\/noindex>, relaterade till olika diskar.<\/li>\n<li>Ju f\u00e4rre systemanrop, desto h\u00f6gre prestanda (vinsten kan vara omkring 5%). Det verkar som att anropet <code>open()<\/code> med flaggan <code>O_DSYNC<\/code> eller anropet <code>pwritev2()<\/code> med flaggan <code>RWF_SYNC<\/code> snabbare anrop <code>fdatasync()<\/code>. Jag misst\u00e4nker att det handlar om att f\u00e4rre systemanrop kr\u00e4vs f\u00f6r att l\u00f6sa samma uppgift (ett anrop ist\u00e4llet f\u00f6r tv\u00e5). Men skillnaden i prestanda \u00e4r mycket liten, s\u00e5 du kan helt enkelt ignorera den och anv\u00e4nda det som inte f\u00f6rsv\u00e5rar logiken i din applikation.<\/li>\n<\/ol>\n<p>\nOm du \u00e4r intresserad av \u00e4mnet h\u00e5llbar datalagring - h\u00e4r \u00e4r n\u00e5gra anv\u00e4ndbara material:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.scylladb.com\/2017\/10\/05\/io-access-methods-scylla\/\">I\/O \u00c5tkomstmetoder<\/a><\/noindex> \u2014 en \u00f6versikt \u00f6ver grunderna f\u00f6r in- och utmatningsmekanismer.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/lwn.net\/Articles\/457667\/\">S\u00e4kerst\u00e4llande av att data n\u00e5r disken<\/a><\/noindex> \u2014 en ber\u00e4ttelse om vad som h\u00e4nder med data p\u00e5 v\u00e4gen fr\u00e5n applikationen till 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\u00e4r ska du fsynca den inneh\u00e5llande katalogen<\/a><\/noindex> \u2014 svar p\u00e5 fr\u00e5gan om n\u00e4r <code>fsync()<\/code> ska till\u00e4mpas p\u00e5 kataloger. Om man sammanfattar detta, s\u00e5 ska det g\u00f6ras vid skapandet av en ny fil, och anledningen till denna rekommendation \u00e4r att det kan finnas m\u00e5nga l\u00e4nkar till samma fil i Linux.<\/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 Interna<\/a><\/noindex> \u2014 h\u00e4r finns en beskrivning av hur h\u00e5llbar datalagring implementeras i SQL Server p\u00e5 Linux-plattformen. Det g\u00f6rs n\u00e5gra intressanta j\u00e4mf\u00f6relser mellan systemanrop i Windows och Linux. Jag \u00e4r n\u00e4stan s\u00e4ker p\u00e5 att det var tack vare detta material som jag l\u00e4rde mig om FUA-optimering av XFS.<\/li>\n<\/ul>\n<p>\nHar du f\u00f6rlorat data som du trodde var s\u00e4kert lagrade 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=\"H\u00e5llbar datalagring och fil-API:er f\u00f6r 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=\"H\u00e5llbar datalagring och fil-API:er f\u00f6r Linux\" src=\"\/wp-content\/uploads\/2020\/10\/d9fd0b1c09eb6e40944aee2d13ee4088.png\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<br \/>K\u00e4lla: <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.4 - 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\/sv\/blog\/administrirovanie\/ustojchivoe-hranenie-dannyh-i-fajlovye-api-linux\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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\/sv\/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\udd47H\u00e5llbar datalagring och fil-API:er p\u00e5 Linux | ProHoster","description":"N\u00e4r jag unders\u00f6kte h\u00e5llbar datalagring i molnsystem beslutade jag mig f\u00f6r att testa mig sj\u00e4lv och s\u00e4kerst\u00e4lla att jag f\u00f6rst\u00e5r de grundl\u00e4ggande koncepten.","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/ustojchivoe-hranenie-dannyh-i-fajlovye-api-linux","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/98090","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=98090"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/98090\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/98091"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=98090"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=98090"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=98090"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}