{"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\/it\/blog\/administrirovanie\/ustojchivoe-hranenie-dannyh-i-fajlovye-api-linux","title":{"rendered":"Archiviazione sicura dei dati e API di file in Linux","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Mentre esploravo la resilienza dello storage nei sistemi cloud, ho deciso di mettermi alla prova per assicurarmi di comprendere i concetti di base. Ho <noindex><a rel=\"nofollow\" href=\"https:\/\/www.evanjones.ca\/durability-nvme.html\">iniziato a leggere la specifica NVMe<\/a><\/noindex> per capire quali garanzie riguardanti la resilienza dello storage (cio\u00e8 le garanzie che i dati saranno accessibili dopo un guasto del sistema) ci forniscono i dischi NVMe. Ho tratto le seguenti conclusioni principali: si deve considerare che i dati sono danneggiati dal momento in cui viene emesso il comando di scrittura fino a quando la scrittura non \u00e8 completata sul supporto. Tuttavia, nella maggior parte dei programmi di scrittura, si utilizzano tranquillamente le chiamate di sistema.<\/p>\n<p>In questo articolo esaminer\u00f2 i meccanismi di resilienza dello storage forniti dalle API file di Linux. Sembra che qui tutto dovrebbe essere semplice: il programma chiama il comando <code>write()<\/code>, e dopo che questo comando \u00e8 stato completato, i dati dovrebbero essere salvati in modo sicuro sul disco. Ma <code>write()<\/code> copier\u00e0 solo i dati dell'applicazione nella cache del kernel, situata nella memoria. Per forzare il sistema a scrivere i dati sul disco, \u00e8 necessario utilizzare alcuni meccanismi aggiuntivi.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/524172\/\"><img decoding=\"async\" alt=\"Archiviazione sicura dei dati e API di file in Linux\" src=\"\/wp-content\/uploads\/2020\/10\/b974dcb9fc546cae03ade4f3d8f5dc25.png\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p>In generale, questo materiale \u00e8 un insieme di appunti che riguardano ci\u00f2 che ho appreso sull'argomento che mi interessa. Se dobbiamo sintetizzare le informazioni pi\u00f9 importanti, si pu\u00f2 dire che per organizzare uno storage dati sostenibile \u00e8 necessario utilizzare il comando <code>fdatasync()<\/code> o aprire i file con il flag <code>O_DSYNC<\/code>. Se siete interessati a conoscere i dettagli su cosa succede ai dati durante il passaggio dal codice sorgente al disco, date un'occhiata a <noindex><a rel=\"nofollow\" href=\"https:\/\/lwn.net\/Articles\/457667\/\">questo<\/a><\/noindex> articolo.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Le caratteristiche dell'uso della funzione write()<\/h2>\n<p>\nChiamata di sistema <code>write()<\/code> sono definite nello standard <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/POSIX\">IEEE POSIX<\/a><\/noindex> come un tentativo di scrivere dati in un descrittore di file. Dopo il completamento riuscito <code>write()<\/code> le operazioni di lettura dei dati devono restituire esattamente i byte che sono stati precedentemente scritti, anche se i dati vengono acceduti da altri processi o thread (<noindex><a rel=\"nofollow\" href=\"https:\/\/pubs.opengroup.org\/onlinepubs\/9699919799\/functions\/write.html#tag_16_685_08\">ecco<\/a><\/noindex> la sezione corrispondente dello standard POSIX). <noindex><a rel=\"nofollow\" href=\"https:\/\/pubs.opengroup.org\/onlinepubs\/9699919799\/functions\/V2_chap02.html#tag_15_09_07\">Qui<\/a><\/noindex>, nella sezione dedicata all'interazione dei thread con le normali operazioni sui file, c'\u00e8 una nota che afferma che se ciascuno dei due thread chiama queste funzioni, ogni chiamata deve vedere o tutte le conseguenze designate che derivano dall'esecuzione dell'altra chiamata, oppure non vedere affatto conseguenze. Questo porta a concludere che tutte le operazioni di input\/output su file devono trattenere il blocco della risorsa con cui stanno lavorando.<\/p>\n<p>Significa che l'operazione <code>write()<\/code> \u00e8 atomica? Dal punto di vista tecnico \u2014 s\u00ec. Le operazioni di lettura dei dati devono restituire o tutto, o niente di quanto \u00e8 stato scritto con <code>write()<\/code>. Ma l'operazione <code>write()<\/code>, in conformit\u00e0 con lo standard, non \u00e8 necessario che si completi, registrando tutto ci\u00f2 che le \u00e8 stato proposto di registrare. Le \u00e8 consentito registrare solo una parte dei dati. Ad esempio, potremmo avere due flussi, ciascuno dei quali aggiunge 1024 byte a un file descritto dallo stesso descrittore di file. Dal punto di vista dello standard, si considererebbe accettabile il risultato in cui ciascuna delle operazioni di scrittura pu\u00f2 aggiungere solo un byte al file. Queste operazioni rimarranno atomiche, ma dopo il loro completamento, i dati scritti nel file risulteranno mescolati. <noindex><a rel=\"nofollow\" href=\"https:\/\/stackoverflow.com\/a\/42442926\/413438\">Ecco<\/a><\/noindex> c'\u00e8 una discussione molto interessante su questo argomento su Stack Overflow.<\/p>\n<h2>Le funzioni fsync() e fdatasync()<\/h2>\n<p>\nIl modo pi\u00f9 semplice per forzare la scrittura dei dati su disco \u00e8 chiamare la funzione <noindex><a rel=\"nofollow\" href=\"https:\/\/man7.org\/linux\/man-pages\/man2\/fsync.2.html\">fsync()<\/a><\/noindex>. Questa funzione richiede al sistema operativo di trasferire tutti i blocchi modificati dalla cache al disco. Ci\u00f2 include anche tutti i metadati del file (tempo di accesso, tempo di modifica del file e cos\u00ec via). Credo che la necessit\u00e0 di questi metadati sorga raramente, quindi, se sai che non sono importanti per te, puoi utilizzare la funzione <code>fdatasync()<\/code>. In <noindex><a rel=\"nofollow\" href=\"https:\/\/man7.org\/linux\/man-pages\/man2\/fdatasync.2.html\">documentazione<\/a><\/noindex> per <code>fdatasync()<\/code> Si dice che durante l'esecuzione di questa funzione venga salvato su disco un volume di metadati \u00abnecessario per l'esecuzione corretta delle operazioni di lettura dei dati successive\u00bb. E questo \u00e8 proprio ci\u00f2 che preoccupa la maggior parte delle applicazioni.<\/p>\n<p>Uno dei problemi che potrebbe sorgere qui \u00e8 che questi meccanismi non garantiscono che il file sar\u00e0 recuperabile dopo un possibile guasto. In particolare, quando si crea un nuovo file, \u00e8 necessario chiamare <code>fsync()<\/code> per la directory che lo contiene. Altrimenti, dopo un guasto, potrebbe risultare che quel file non esiste. La ragione \u00e8 che in UNIX, a causa dell'uso dei collegamenti rigidi, un file pu\u00f2 esistere in pi\u00f9 directory. Pertanto, al momento della chiamata <code>fsync()<\/code> per il file non c'\u00e8 modo di sapere quali dati di quale directory devono essere scritti su disco (<noindex><a rel=\"nofollow\" href=\"https:\/\/www.quora.com\/When-should-you-fsync-the-containing-directory-in-addition-to-the-file-itself\">qui<\/a><\/noindex> puoi leggere di pi\u00f9 a riguardo). Sembra che il file system ext4 sia in grado di <noindex><a rel=\"nofollow\" href=\"https:\/\/lwn.net\/Articles\/799807\/\">automaticamente<\/a><\/noindex> applicare <code>fsync()<\/code> alle directory che contengono i file appropriati, ma nel caso di altri file system questo potrebbe non essere cos\u00ec.<\/p>\n<p>Questo meccanismo pu\u00f2 essere implementato in vari modi nei diversi file system. Ho utilizzato <noindex><a rel=\"nofollow\" href=\"https:\/\/git.kernel.org\/pub\/scm\/linux\/kernel\/git\/axboe\/blktrace.git\/tree\/README\">blktrace<\/a><\/noindex> per scoprire quali operazioni di disco vengono utilizzate nei file system ext4 e XFS. Entrambi emettono comuni comandi di scrittura su disco sia per il contenuto dei file che per il registro del file system, svuotano la cache e terminano l'operazione eseguendo la scrittura FUA (Force Unit Access, scrittura dei dati direttamente sul disco, saltando la cache) nel registro. Probabilmente, adottano questo approccio per confermare che l'operazione \u00e8 stata effettuata. Su dischi che non supportano FUA, ci\u00f2 provoca due svuotamenti della cache. I miei esperimenti hanno dimostrato che <code>fdatasync()<\/code> \u00e8 leggermente pi\u00f9 veloce <code>fsync()<\/code>. Strumento <code>blktrace<\/code> indica che <code>fdatasync()<\/code> di solito scrive meno dati sul disco (in ext4 <code>fsync()<\/code> scrive 20 KiB, mentre <code>fdatasync()<\/code> scrive 16 KiB). Inoltre, ho scoperto che XFS \u00e8 leggermente pi\u00f9 veloce di ext4. E qui con l'aiuto di <code>blktrace<\/code> sono riuscito a scoprire che <code>fdatasync()<\/code> svuota sul disco meno dati (4 KiB in XFS).<\/p>\n<h2>Situazioni ambigue che si presentano quando si utilizza fsync()<\/h2>\n<p>\nPosso ricordare tre situazioni ambigue riguardanti <code>fsync()<\/code>, con cui mi sono confrontato nella pratica.<\/p>\n<p>Il primo caso di questo tipo si \u00e8 verificato nel 2008. Allora, l'interfaccia di Firefox 3 si bloccava quando si tentava di scrivere su disco un grande numero di file. Il problema era che nella realizzazione dell'interfaccia per memorizzare le informazioni sul suo stato veniva utilizzato un database SQLite. Dopo ogni modifica apportata all'interfaccia, veniva chiamata la funzione <code>fsync()<\/code>, che garantiva buone garanzie di memorizzazione dei dati. Nella filesystem utilizzata allora, ext3, la funzione <code>fsync()<\/code> scriveva su disco tutte le pagine \"sporche\" nel sistema, non solo quelle relative al file specifico. Questo significava che un clic su un pulsante in Firefox poteva avviare la registrazione di megabyte di dati su disco rigido, richiedendo molti secondi. La soluzione al problema, da quanto ho compreso da <noindex><a rel=\"nofollow\" href=\"http:\/\/shaver.off.net\/diary\/2008\/05\/25\/fsyncers-and-curveballs\/\">questo<\/a><\/noindex> materiale, consisteva nel trasferire il lavoro con il database in attivit\u00e0 di sfondo asincrone. Questo significa che prima in Firefox erano implementati requisiti pi\u00f9 severi per la robustezza della memorizzazione dei dati di quanto fosse realmente necessario, e le peculiarit\u00e0 del filesystem ext3 aggravavano ulteriormente questo problema.<\/p>\n<p>Il secondo malfunzionamento si \u00e8 verificato nel 2009. Allora, dopo un guasto del sistema, gli utenti del nuovo file system ext4 si sono trovati di fronte a file recentemente creati che avevano una lunghezza pari a zero, mentre con il pi\u00f9 vecchio file system ext3 questo non \u00e8 accaduto. Nel paragrafo precedente, ho accennato al fatto che ext3 scriveva su disco troppi dati, il che rallentava notevolmente l'operazione. <code>fsync()<\/code>. Per migliorare la situazione, in ext4 vengono scritte su disco solo le pagine \"sporche\" relative a un file specifico. I dati degli altri file rimangono in memoria per un tempo molto pi\u00f9 lungo rispetto a quanto avviene con ext3. Questo \u00e8 stato realizzato per migliorare le prestazioni (di default i dati rimangono in questo stato per 30 secondi, questo pu\u00f2 essere configurato tramite <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\">qui<\/a><\/noindex> \u00e8 possibile trovare ulteriori materiali a riguardo). Questo significa che un grande volume di dati pu\u00f2 andare irrimediabilmente perso dopo un guasto. La soluzione a questo problema consiste nell'utilizzo di <code>fsync()<\/code> in applicazioni che necessitano di garantire una memorizzazione dati sicura e massimizzare la protezione da eventuali malfunzionamenti. La funzione <code>fsync()<\/code> funziona con ext4 in modo molto pi\u00f9 efficiente rispetto a ext3. Lo svantaggio di questo approccio \u00e8 che, come prima, rallenta l'esecuzione di alcune operazioni, come l'installazione di programmi. Maggiori dettagli su questo si trovano <noindex><a rel=\"nofollow\" href=\"https:\/\/lwn.net\/Articles\/322823\/\">qui<\/a><\/noindex> e <noindex><a rel=\"nofollow\" href=\"https:\/\/thunk.org\/tytso\/blog\/2009\/03\/12\/delayed-allocation-and-the-zero-length-file-problem\/\">qui<\/a><\/noindex>.<\/p>\n<p>Il terzo problema riguarda <code>fsync()<\/code>, emerso nel 2018. Allora, nell'ambito del progetto PostgreSQL, si \u00e8 scoperto che se la funzione <code>fsync()<\/code> incorre in un errore, contrassegna le pagine 'sporche' come 'pulite'. Di conseguenza, le chiamate successive <code>fsync()<\/code> non fanno nulla con queste pagine. Questo comporta che le pagine modificate rimangano in memoria e non vengano mai scritte su disco. \u00c8 una vera e propria catastrofe, poich\u00e9 l'applicazione riterr\u00e0 che alcuni dati siano stati scritti su disco, mentre in realt\u00e0 non \u00e8 cos\u00ec. Tali guasti <code>fsync()<\/code> sono rari, e l'applicazione in tali situazioni pu\u00f2 fare poco per combattere il problema. Oggigiorno, quando ci\u00f2 avviene, PostgreSQL e altre applicazioni terminano in modo anomalo. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.usenix.org\/conference\/atc20\/presentation\/rebello\">Qui<\/a><\/noindex>, nel materiale 'Can Applications Recover from fsync Failures?', questo problema viene approfondito in tutti i dettagli. Attualmente, la migliore soluzione a questo problema \u00e8 utilizzare Direct I\/O con il flag <code>O_SYNC<\/code> o con il flag <code>O_DSYNC<\/code>. Con questo approccio, il sistema segnaler\u00e0 eventuali errori che possono verificarsi durante specifiche operazioni di scrittura dei dati, ma richiede che l'applicazione gestisca autonomamente i buffer. Maggiori dettagli su questo possono essere trovati <noindex><a rel=\"nofollow\" href=\"https:\/\/lwn.net\/Articles\/752063\/\">qui<\/a><\/noindex> e <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.postgresql.org\/wiki\/Fsync_Errors\">qui<\/a><\/noindex>.<\/p>\n<h2>Apertura di file usando i flag O_SYNC e O_DSYNC<\/h2>\n<p>\nTorniamo a discutere dei meccanismi Linux che garantiscono la persistenza dei dati. In particolare, stiamo parlando dell'uso del flag <code>O_SYNC<\/code> o del flag <code>O_DSYNC<\/code> quando si apre file utilizzando la chiamata di sistema <noindex><a rel=\"nofollow\" href=\"https:\/\/man7.org\/linux\/man-pages\/man2\/open.2.html\">open()<\/a><\/noindex>. Con questo approccio, ogni operazione di scrittura dei dati viene eseguita come se dopo ogni comando <code>write()<\/code> al sistema vengano date, rispettivamente, comandi <code>fsync()<\/code> e <code>fdatasync()<\/code>. In <noindex><a rel=\"nofollow\" href=\"https:\/\/pubs.opengroup.org\/onlinepubs\/009695399\/basedefs\/xbd_chap03.html#tag_03_373\">specifiche POSIX<\/a><\/noindex> questo \u00e8 noto come \u00abSynchronized I\/O File Integrity Completion\u00bb e \u00abData Integrity Completion\u00bb. Il principale vantaggio di questo approccio \u00e8 che per garantire l'integrit\u00e0 dei dati \u00e8 necessario effettuare solo una chiamata di sistema, invece di due (ad esempio \u2014 <code>write()<\/code> e <code>fdatasync()<\/code>). Il principale svantaggio di questo approccio \u00e8 che tutte le operazioni di scrittura che utilizzano il corrispondente descrittore di file saranno sincronizzate, il che pu\u00f2 limitare le capacit\u00e0 di strutturazione del codice dell'applicazione.<\/p>\n<h2>Utilizzo di Direct I\/O con il flag O_DIRECT<\/h2>\n<p>\nChiamata di sistema <code>open()<\/code> supporta il flag <code>O_DIRECT<\/code>, che \u00e8 progettato per eseguire operazioni di input\/output bypassando la cache del sistema operativo e interagendo direttamente con il disco. Questo, in molti casi, significa che i comandi di scrittura emessi dal programma verranno tradotti direttamente in comandi diretti per lavorare con il disco. Tuttavia, in generale, questo meccanismo non sostituisce le funzioni <code>fsync()<\/code> o <code>fdatasync()<\/code>. Il fatto \u00e8 che il disco stesso pu\u00f2 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.evanjones.ca\/durability-nvme.html\">ritardare o memorizzare nella cache<\/a><\/noindex> i corrispondenti comandi di scrittura dei dati. E, ci\u00f2 che \u00e8 peggio, in alcuni casi particolari, le operazioni di input\/output eseguite utilizzando il flag <code>O_DIRECT<\/code>, <noindex><a rel=\"nofollow\" href=\"https:\/\/ext4.wiki.kernel.org\/index.php\/Clarifying_Direct_IO%27s_Semantics\">vengono tradotte<\/a><\/noindex> in operazioni tradizionali con buffer. Il modo pi\u00f9 semplice per risolvere questo problema \u00e8 utilizzare anche il flag <code>O_DSYNC<\/code>, il che significa che per ogni operazione di scrittura ci sar\u00e0 una chiamata <code>fdatasync()<\/code>.<\/p>\n<p>Si \u00e8 scoperto che nel file system XFS \u00e8 stata recentemente aggiunta una \"via rapida\" per <code>O_DIRECT|O_DSYNC<\/code>-la scrittura dei dati. Se si sovrascrive un blocco utilizzando <code>O_DIRECT|O_DSYNC<\/code>, quindi XFS, invece di svuotare la cache, eseguir\u00e0 il comando FUA per la scrittura nel caso in cui il dispositivo lo supporti. Ne ho avuto la conferma utilizzando l'utility <code>blktrace<\/code> sul sistema Linux 5.4\/Ubuntu 20.04. Questo approccio dovrebbe essere pi\u00f9 efficiente, poich\u00e9 comporta la scrittura di un numero minimo di dati sul disco e utilizza un'unica operazione, invece di due (scrittura e svuotamento della cache). Ho trovato un link a <noindex><a rel=\"nofollow\" href=\"https:\/\/patchwork.kernel.org\/patch\/10250257\/\">per correggere l'errore.<\/a><\/noindex> un kernel del 2018, in cui \u00e8 implementato questo meccanismo. L\u00ec c'\u00e8 una discussione riguardante l'applicazione di questa ottimizzazione anche in altri file system, ma, per quanto ne so, XFS \u00e8 attualmente l'unico file system che la supporta.<\/p>\n<h2>La funzione sync_file_range()<\/h2>\n<p>\nIn Linux, esiste una chiamata di sistema <noindex><a rel=\"nofollow\" href=\"https:\/\/man7.org\/linux\/man-pages\/man2\/sync_file_range.2.html\">sync_file_range()<\/a><\/noindex>, che consente di scrivere su disco solo una parte di un file, e non l'intero file. Questa chiamata avvia un flush asincrono dei dati e non aspetta il suo completamento. Ma nella documentazione di <code>sync_file_range()<\/code> si dice che questo comando \u00e8 'molto pericoloso'. Non si consiglia di usarlo. Le caratteristiche e i pericoli <code>sync_file_range()<\/code> sono ben descritti in <noindex><a rel=\"nofollow\" href=\"http:\/\/yoshinorimatsunobu.blogspot.com\/2014\/03\/how-syncfilerange-really-works.html\">questo<\/a><\/noindex> materiale. In particolare, sembra che questa chiamata utilizzi RocksDB per gestire quando il kernel scrive i dati \"sporchi\" su disco. Tuttavia, per garantire la persistenza dei dati, viene utilizzato anche <code>fdatasync()<\/code>. In <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/facebook\/rocksdb\/search?q=sync_file_range\">codice<\/a><\/noindex> RocksDB ha commenti interessanti su questo argomento. Ad esempio, sembra che la chiamata <code>sync_file_range()<\/code> quando si utilizza ZFS non porti al salvataggio dei dati su disco. L'esperienza mi suggerisce che il codice utilizzato raramente potrebbe contenere errori. Pertanto, consiglierei di non utilizzare questa chiamata di sistema senza una ragione impellente.<\/p>\n<h2>Chiamate di sistema che aiutano a garantire la persistenza dei dati<\/h2>\n<p>\nSono giunto alla conclusione che per eseguire operazioni di input\/output che garantiscono la persistenza dei dati, si possono utilizzare tre approcci. Tutti richiedono la chiamata della funzione <code>fsync()<\/code> per la directory in cui \u00e8 stato creato il file. Ecco questi approcci:<\/p>\n<ol>\n<li>Chiamata della funzione <code>fdatasync()<\/code> o <code>fsync()<\/code> dopo la funzione <code>write()<\/code> (meglio utilizzare <code>fdatasync()<\/code>).<\/li>\n<li>Lavorare con il descrittore di file aperto con il flag <code>O_DSYNC<\/code> o <code>O_SYNC<\/code> (meglio \u2014 con il flag <code>O_DSYNC<\/code>).<\/li>\n<li>Utilizzare il comando <code>pwritev2()<\/code> con il flag <code>RWF_DSYNC<\/code> o <code>RWF_SYNC<\/code> (preferibilmente \u2014 con il flag <code>RWF_DSYNC<\/code>).<\/li>\n<\/ol>\n<p><\/p>\n<h2>Note sulle prestazioni<\/h2>\n<p>\nNon ho effettuato misurazioni dettagliate delle prestazioni dei vari meccanismi che ho esaminato. Le differenze di velocit\u00e0 che ho osservato sono piuttosto piccole. Questo significa che potrei sbagliarmi e che, in condizioni diverse, quello stesso meccanismo potrebbe mostrare risultati diversi. Inizier\u00f2 parlando di ci\u00f2 che influisce maggiormente sulle prestazioni e poi di ci\u00f2 che ha un impatto minore.<\/p>\n<ol>\n<li>La riscrittura dei dati di un file \u00e8 pi\u00f9 veloce rispetto all'aggiunta di dati a un file (il guadagno in prestazioni pu\u00f2 variare dal 2% al 100%). L'aggiunta di dati a un file richiede modifiche aggiuntive ai metadati del file, anche dopo la chiamata di sistema <code>fallocate()<\/code>, ma l'entit\u00e0 di questo effetto pu\u00f2 variare. Raccomando, per garantire le migliori prestazioni, di chiamare <code>fallocate()<\/code> per la preallocazione dello spazio necessario. Successivamente, \u00e8 necessario riempire esplicitamente questo spazio con zeri e chiamare <code>fsync()<\/code>. Questo rende i blocchi corrispondenti nel file system contrassegnati come \u00abdedicati\u00bb invece di \u00abnon dedicati\u00bb. Ci\u00f2 fornisce un piccolo miglioramento delle prestazioni (circa il 2%). Inoltre, per alcuni dischi, la prima operazione di accesso a un blocco pu\u00f2 richiedere pi\u00f9 tempo di altre. Ci\u00f2 significa che riempire lo spazio con zeri pu\u00f2 portare a un miglioramento delle prestazioni significativo (circa il 100%). In particolare, questo pu\u00f2 accadere con i dischi <noindex><a rel=\"nofollow\" href=\"https:\/\/n2ws.com\/blog\/how-to-guides\/pre-warm-ebs-volumes-on-aws\">AWS EBS<\/a><\/noindex> (questi dati non sono ufficiali, non sono riuscito a confermarli). Lo stesso vale per gli archivi <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/compute\/docs\/disks\/benchmarking-pd-performance\">GCP Persistent Disk<\/a><\/noindex> (questo \u00e8 invece un'informazione ufficiale, confermata da test). Altri esperti hanno fatto osservazioni simili <noindex><a rel=\"nofollow\" href=\"http:\/\/yoshinorimatsunobu.blogspot.com\/2009\/05\/overwriting-is-much-faster-than_28.html\">osservazioni<\/a><\/noindex>, relative a vari dischi.<\/li>\n<li>Meno chiamate di sistema ci sono, maggiore \u00e8 la prestazione (il guadagno pu\u00f2 essere di circa il 5%). Sembra che la chiamata <code>open()<\/code> con il flag <code>O_DSYNC<\/code> o la chiamata <code>pwritev2()<\/code> con il flag <code>RWF_SYNC<\/code> sia pi\u00f9 veloce della chiamata <code>fdatasync()<\/code>Sospetto che il problema sia che, con questo approccio, il numero di chiamate di sistema per risolvere lo stesso compito \u00e8 ridotto (una chiamata anzich\u00e9 due). Ma la differenza nelle prestazioni \u00e8 molto piccola, quindi puoi tranquillamente non tenerne conto e usare nel tuo applicativo ci\u00f2 che non complica la sua logica.<\/li>\n<\/ol>\n<p>\nSe ti interessa il tema della conservazione sostenibile dei dati \u2014 ecco alcuni materiali utili:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.scylladb.com\/2017\/10\/05\/io-access-methods-scylla\/\">Metodi di accesso I\/O<\/a><\/noindex> \u2014 panoramica dei principali meccanismi di input\/output.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/lwn.net\/Articles\/457667\/\">Assicurare che i dati raggiungano il disco<\/a><\/noindex> \u2014 racconto su cosa succede ai dati lungo il percorso dall'applicazione al disco.<\/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\">Quando dovresti eseguire fsync sulla directory contenente<\/a><\/noindex> \u2014 risposta alla domanda su quando \u00e8 necessario utilizzare <code>fsync()<\/code> per le directory. In breve, bisogna farlo quando si crea un nuovo file, e il motivo di questo consiglio \u00e8 che in Linux possono esserci molteplici collegamenti a un file stesso.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/bobsql.com\/sql-server-on-linux-forced-unit-access-fua-internals\/\">SQL Server su Linux: Internals di FUA<\/a><\/noindex> \u2014 qui descrive come \u00e8 implementato l'archiviazione persistente dei dati in SQL Server sulla piattaforma Linux. Qui ci sono alcune interessanti comparazioni tra le chiamate di sistema di Windows e Linux. Sono quasi certo che \u00e8 grazie a questo materiale che ho appreso dell'ottimizzazione FUA di XFS.<\/li>\n<\/ul>\n<p>\nHai mai perso dati che pensavi fossero salvati in modo sicuro su disco?<\/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=\"Archiviazione sicura dei dati e API di file 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=\"Archiviazione sicura dei dati e API di file in Linux\" src=\"\/wp-content\/uploads\/2020\/10\/d9fd0b1c09eb6e40944aee2d13ee4088.png\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<br \/>Fonte: <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\/it\/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=\"it_IT\" \/>\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\/it\/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\udd47Archiviazione persistente dei dati e API file Linux | ProHoster","description":"Esplorando la resilienza dell'archiviazione dei dati nei sistemi cloud, ho deciso di mettermi alla prova per assicurarmi di comprendere le nozioni di base. Ho iniziato leggendo le specifiche NVMe per capire quali garanzie offre riguardo all'archiviazione persistente dei dati (ovvero, la certezza che i dati saranno disponibili dopo un guasto del sistema) fornite dai dischi NVMe. Ho identificato i seguenti punti principali","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/ustojchivoe-hranenie-dannyh-i-fajlovye-api-linux","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","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\/it\/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\/it\/wp-json\/wp\/v2\/posts\/98090","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=98090"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/98090\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/98091"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=98090"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=98090"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=98090"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}