Kaydinta Xogta Waara iyo Linux File APIs

Aniga, oo baaraya xasiloonida kaydinta xogta ee nidaamyada daruuraha, waxaan go'aansaday inaan tijaabiyo naftayda, si aan u hubiyo in aan fahmo waxyaabaha aasaasiga ah. I ku bilaabay akhrinta NVMe spec si loo fahmo waxa dammaanad qaadaya ku adkaysiga xogta (taasi waa, dammaanad qaadaya in xogta la heli karo ka dib fashilka nidaamka) na sii NMVe disks. Waxaan sameeyay gabagabada ugu muhiimsan ee soo socota: waxaad u baahan tahay inaad tixgeliso xogta dhaawacan laga bilaabo wakhtiga xogta qorista amarka la bixiyo, iyo ilaa wakhtiga loo qorayo kaydinta kaydinta. Si kastaba ha ahaatee, barnaamijyada intooda badan, wicitaanada nidaamka si badbaado leh ayaa loo isticmaalaa in lagu qoro xogta.

Maqaalkan, waxaan ku sahamiyaa hababka adkaysiga ee ay bixiso API-ga faylka Linux. Waxay u muuqataa in wax walba ay tahay inay fudud yihiin halkan: barnaamijku wuxuu ku baaqayaa amarka write(), iyo ka dib markii hawlgalka amarkan la dhammeeyo, xogta waxaa lagu kaydin doonaa si ammaan ah saxanka. Laakin write() waxa kaliya oo koobiyaya xogta codsiga kaydka kernel-ka ee ku yaala RAM. Si loogu qasbo nidaamka inuu xogta ku qoro saxanka, waa in la isticmaalo habab dheeraad ah.

Kaydinta Xogta Waara iyo Linux File APIs

Guud ahaan, qoraalkani waa qoraallo la xidhiidha waxa aan ka bartay mawduuc aan xiiseeyo. Haddii aan si kooban uga hadalno waxa ugu muhiimsan, waxaa soo baxday in si loo habeeyo kaydinta xogta waarta, waxaad u baahan tahay inaad isticmaasho amarka fdatasync() ama ku fur faylal calan leh O_DSYNC. Haddii aad xiisaynayso inaad wax badan ka barato waxa ku dhacaya xogta dariiqa code ilaa diskka, eeg tan maqaal.

Astaamaha isticmaalka qoraalka() function

Wacitaanka nidaamka write() lagu qeexay heerka IEEE POSIX isku day ah in xogta loo qoro sharaxaadaha faylka. Kadib markii ay si guul leh u dhammaatay shaqada write() Hawlgallada akhrinta xogta waa inay soo celiyaan sida saxda ah ee hore loo qoray, taas oo samaynaysa xitaa haddii xogta laga helayo habab kale ama taxaneyaal (bal eega qaybta u dhiganta heerka POSIX). waa, qaybta ku saabsan isdhexgalka dunta iyo hawlaha caadiga ah ee faylka, waxaa jira qoraal sheegaya in haddii laba xadhig ay mid kastaa u yeeraan hawlahan, markaa wicitaan kasta waa inuu arko dhammaan cawaaqibta la tilmaamay ee fulinta wicitaanka kale uu keeno, ama ma arkin haba yaraatee wax cawaaqib xumo ah. Tani waxay horseedaysaa gabagabada in dhammaan hawlgallada galka I/O ay ku hayaan quful kheyraadka lagu shaqeynayo.

Tani miyay ka dhigan tahay in qaliinka write() waa atomic? Marka laga eego dhinaca farsamada, haa. Hawlgallada akhrinta xogta waa inay soo celiyaan dhammaan ama midna waxa lagu qoray write(). Laakin qaliinka write(), iyada oo la raacayo halbeegga, maaha in la dhammeeyo, iyada oo qortay wax kasta oo la weydiistay inay qorto. Waa loo ogol yahay inay qoraan qayb ka mid ah xogta. Tusaale ahaan, waxa laga yaabaa in aanu yeelano laba durdur midkiiba ku lifaaqan 1024 bytes fayl uu tilmaamay isla fayl-fayl-fayleedka. Marka laga eego aragtida heerka, natiijadu waxay noqon doontaa mid la aqbali karo marka mid kasta oo ka mid ah hawlgallada qorista ay ku dhejin karaan hal byte oo keliya faylka. Hawlgalladani waxay ahaan doonaan atomic, laakiin ka dib marka ay dhammeeyaan, xogta ay u qoraan faylka waa la jajabin doonaa. halkan dood aad u xiiso badan oo ku saabsan mowduucan oo ku saabsan Istaag-dhaafka.

fsync () iyo fdatasync() hawlaha

Sida ugu fudud ee xogta loogu shubi karo saxanka waa in la waco shaqada fsync(). Shaqadani waxay waydiisanaysaa nidaamka qalliinka inuu ka raro dhammaan baloogyada wax laga beddelay khasnadda oo u guuriyo disk. Tan waxaa ku jira dhammaan xogta badan ee faylka (waqtiga gelitaanka, wakhtiga wax ka beddelka faylka, iyo wixii la mid ah). Waxaan rumaysanahay in xogtan badan ay tahay mid naadir ah oo loo baahan yahay, marka haddii aad ogtahay inaysan muhiim kuu ahayn, waxaad isticmaali kartaa shaqada fdatasync(). The I caawi on fdatasync() waxay sheegaysaa in inta lagu jiro hawlgalka hawshan, qadarka metadata ee noocan oo kale ah ayaa lagu keydiyaa diskka, taas oo lagama maarmaan u ah fulinta saxda ah ee hawlgallada akhrinta xogta soo socda. Tanina waa dhab ahaan waxa codsiyada badankoodu ay daneeyaan.

Hal dhibaato oo halkan ka iman karta ayaa ah in hababkani aanay dammaanad qaadin in faylka la heli karo ka dib fashilka suurtogalka ah. Gaar ahaan, marka fayl cusub la abuuro, waa in la waco fsync() hagaha ku jira. Haddii kale, shil ka dib, waxaa laga yaabaa inay soo baxdo in faylkani aanu jirin. Sababta tani waa iyada oo hoos timaada UNIX, iyadoo ay ugu wacan tahay isticmaalka xiriiriyeyaasha adag, faylku wuxuu ku jiri karaa hageyaal badan. Sidaa darteed, marka la wacayo fsync() ma jirto si uu faylku u ogaado xogta tusaha ay tahay in sidoo kale lagu shubo saxanka (halkan wax badan oo arrintan ku saabsan ayaad ka akhrisan kartaa). Waxay u egtahay in nidaamka faylka ext4 uu awood u leeyahay si toos ah isticmaal fsync() tusaha ay ku jiraan faylalka u dhigma, laakiin tani ma noqon karto kiiska nidaamyada kale ee faylalka.

Farsamadan waxaa loo fulin karaa si kala duwan hababka faylalka kala duwan. waan isticmaalay blktrace si aad wax uga barato hawlaha diskooga loo isticmaalo ext4 iyo XFS nidaamka faylka. Labaduba waxay soo saaraan amarrada qorista ee caadiga ah si ay u saxanaadaan waxyaabaha ku jira faylalka iyo joornaalka nidaamka faylalka, nadiifi khasnadda oo ka bax adigoo fulinaya FUA (Cutubka Xoogga, si toos ah ugu qora xogta diskka, ka gudubka cache) u qor joornaalka. Waxay u badan tahay inay sidaas sameeyaan si ay u xaqiijiyaan xaqiiqada wax kala iibsiga. Wadayaasha aan taageerin FUA, tani waxay sababtaa laba kaydin. Tijaabooyinkeygu waxay muujiyeen taas fdatasync() xoogaa degdeg ah fsync(). Utility blktrace taas ayaa tilmaamaysa fdatasync() inta badan waxay ku qortaa xog yar diskka (ee ext4 fsync() wuxuu qoray 20 KiB, iyo fdatasync() - 16 KiB). Sidoo kale, waxaan ogaaday in XFS uu ka yara dheereeyo ext4. Oo halkan iyadoo la kaashanayo blktrace ayaa awooday in uu ogaado taas fdatasync() waxay ku shubtaa xog yar diskka (4 KiB gudaha XFS).

Xaalado aan caddayn marka la isticmaalayo fsync()

Waxaan ka fikiri karaa saddex xaaladood oo madmadow oo ku saabsan fsync()taas oo aan la kulmay ficil ahaan.

Dhacdadan oo kale waxay dhacday sanadkii 2008dii. Waqtigaas, Firefox 3 interface "la qaboojiyey" haddii tiro badan oo faylal ah lagu qoray saxanka. Dhibaatadu waxay ahayd in hirgelinta is-dhexgalku uu isticmaalay xogta SQLite si uu u kaydiyo macluumaadka ku saabsan gobolkiisa. Ka dib isbeddel kasta oo ka dhacay interface-ka, shaqada ayaa loo yeedhay fsync(), taas oo siisay dammaanad wanaagsan ee kaydinta xogta xasilloon. Nidaamka faylka ext3 ee markaa la isticmaalay, shaqada fsync() daadiyey si ay u saxan dhammaan bogagga "wasakh" ee nidaamka, oo ma aha oo kaliya kuwa la xiriira faylka u dhigma. Tani waxay ka dhigan tahay in badhanka Firefox-ka la riixo ay sababi karto megabyte oo xog ah in lagu qoro saxanka magnetka, kaas oo qaadan kara ilbiriqsiyo badan. Xalka dhibaatada, inta aan ka fahmay waxaa shay, waxay ahayd in la raro shaqada xogta xogta oo loo wareejiyo hawlo asal ah oo aan isku mid ahayn. Tani waxay ka dhigan tahay in Firefox loo isticmaalay in lagu fuliyo shuruudaha kaydinta adag ee ka badan intii loo baahnaa, iyo habka faylka ext3 ayaa sii xumeeyay dhibaatadan.

Dhibaatada labaad waxay dhacday 2009. Kadib, shilka nidaamka kadib, isticmaalayaasha nidaamka faylka cusub ee ext4 waxay ogaadeen in faylal badan oo dhowaan la sameeyay ay eber-dherer yihiin, laakiin taasi kuma dhicin nidaamka faylka ext3 ee hore. Baaragaraafkii hore, waxaan uga hadlay sida ext3 ay ugu daadisay xogta badan diskka, taas oo wax badan hoos u dhigtay. fsync(). Si loo hagaajiyo xaaladda, ext4 waxay daadisaa kaliya kuwa "wasakh" boggaga khuseeya fayl gaar ah. Iyo xogta faylasha kale waxay ku sii jirtaa xusuusta waqti aad uga dheer marka loo eego ext3. Tan waxaa loo sameeyay si loo hagaajiyo waxqabadka (sida caadiga ah, xogtu waxay ku sii jirtaa gobolkan 30 ilbiriqsi, waxaad ku habeyn kartaa tan adoo isticmaalaya wasakh_expire_centisecs; halkan waxaad ka heli kartaa macluumaad dheeraad ah arrintan). Tani waxay ka dhigan tahay in tiro badan oo xog ah si aan la soo celin karin loo lumin karo shil ka dib. Xalka dhibaatadan waa in la isticmaalo fsync() Codsiyada u baahan inay bixiyaan kaydinta xogta xasilloon oo ay ka ilaaliyaan inta ugu badan ee suurtogalka ah cawaaqibka guuldarrooyinka. Shaqada fsync() si ka hufan ugu shaqeeya ext4 marka loo eego ext3. Khasaaraha habkani waa in isticmaalkiisu, sidii hore, uu hoos u dhigo qaar ka mid ah hawlaha, sida rakibidda barnaamijyada. Fiiri faahfaahin arrintan ku saabsan halkan ΠΈ halkan.

Dhibaatada saddexaad ee ku saabsan fsync(), oo asalkiisu yahay 2018. Kadib, gudaha qaabka mashruuca PostgreSQL, waxaa la ogaaday in haddii shaqada fsync() la kulma khalad, waxa ay bogag "wasakh ah" u calaamadisay "nadiif". Natiijo ahaan, wicitaanada soo socda fsync() waxba ha ku samayn boggagaas. Sababtaas awgeed, boggaga la beddelay ayaa lagu kaydiyaa xusuusta oo aan waligood lagu qorin saxanka. Tani waa masiibo dhab ah, sababtoo ah codsigu wuxuu u maleynayaa in xogta qaar lagu qoray disk, laakiin dhab ahaantii ma noqon doonto. Guuldarrooyinka noocaas ah fsync() waa naadir, codsiga xaaladahan oo kale ma samayn karo ku dhawaad ​​waxba si loola dagaallamo dhibaatada. Maalmahan, markay tani dhacdo, PostgreSQL iyo codsiyada kale way burburaan. waa, ee maqaalka "Arjiyada ka soo kabsan kara fsync Failures?", dhibaatadan si faahfaahsan ayaa loo baadhay. Hadda xalka ugu fiican ee dhibaatadan waa in la isticmaalo Direct I/O oo leh calanka O_SYNC ama calan wata O_DSYNC. Habkan, nidaamku wuxuu ka warbixin doonaa khaladaadka dhici kara marka la samaynayo xog gaar ah oo qorista, laakiin habkani wuxuu u baahan yahay codsiga si uu u maareeyo kaydiyeyaasha laftiisa. Wax badan ka akhri halkan ΠΈ halkan.

Furitaanka feylasha addoo isticmaalaya calamada O_SYNC iyo O_DSYNC

Aan u soo laabano doodda hababka Linux ee bixiya kaydinta xogta joogtada ah. Magac ahaan, waxaan ka hadlaynaa adeegsiga calanka O_SYNC ama calan O_DSYNC marka la furayo faylasha adoo isticmaalaya nidaamka call furan(). Habkan, xog kasta oo qoraal ah ayaa la sameeyaa sida haddii amar kasta ka dib write() nidaamka waxaa la siiyaa, siday u kala horreeyaan, amarada fsync() ΠΈ fdatasync(). The Tilmaamaha POSIX Tan waxa loo yaqaan "Dhammaystirka I/O File Integrity Completion" iyo "Dhammaystirka daacadnimada Xogta". Faa'iidada ugu weyn ee habkan ayaa ah in hal wicitaan oo kaliya loo baahan yahay in la fuliyo si loo xaqiijiyo daacadnimada xogta, oo aan ahayn laba (tusaale ahaan - write() ΠΈ fdatasync()). Khasaaraha ugu weyn ee habkan ayaa ah in dhammaan hawlgallada qorista iyadoo la adeegsanayo sharraxaadda faylka u dhiganta la isku dhejin doono, taas oo xaddidi karta awoodda qaabeynta koodka codsiga.

Isticmaalka Tooska I/O oo wata calanka O_DIRECT

Wacitaanka nidaamka open() taageera calanka O_DIRECT, kaas oo loogu talagalay in lagu dhaafo khasnadaha nidaamka hawlgalka, sameeyo hawlgallada I / O, si toos ah ula falgalka saxanka. Tani, marar badan, waxay la macno tahay in amarrada qorista ee uu soo saaro barnaamijku si toos ah loogu tarjumi doono amarrada loogu talagalay in lagu shaqeeyo saxanka. Laakiin, guud ahaan, habkani maaha beddelka shaqooyinka fsync() ama fdatasync(). Xaqiiqdu waxay tahay in diskka laftiisa uu awoodo dib u dhac ama kayd amarada ku habboon qorista xogta. Iyo, xitaa ka sii daran, xaaladaha gaarka ah qaarkood, hawlgallada I / O ayaa la sameeyay marka la isticmaalayo calanka O_DIRECT, baahin galay hawlgalo dhaqameed. Habka ugu fudud ee lagu xallin karo dhibaatadan waa in la isticmaalo calanka si loo furo faylasha O_DSYNC, taas oo macnaheedu yahay in hawlgal kasta oo qoraal ah uu raaci doono wicitaan fdatasync().

Waxaa soo baxday in nidaamka faylka XFS uu dhawaan ku daray "dariiq degdeg ah" oo loogu talagalay O_DIRECT|O_DSYNC-diwaanka xogta. Haddii balooggu uu ku dul qoran yahay iyadoo la isticmaalayo O_DIRECT|O_DSYNC, ka dibna XFS, halkii ay ka nadiifin lahayd khasnadda, waxay fulin doontaa amarka qoraalka FUA haddii qalabku taageerayo. Waxaan ku xaqiijiyay tan aniga oo isticmaalaya utility blktrace Nidaamka Linux 5.4/Ubuntu 20.04. Habkani waa inuu noqdaa mid aad waxtar u leh, maadaama ay ku qorayso xogta ugu yar ee diskka oo ay isticmaasho hal hawlgal, ma aha laba (qor oo nadiifi cache). Waxaan helay xiriir balastar 2018 kernel oo hirgeliya habkan. Waxaa jira xoogaa dood ah oo ku saabsan ku-dhaqanka wanaajintan nidaamyada kale ee faylalka, laakiin inta aan ogahay, XFS waa nidaamka faylka kaliya ee taageera ilaa hadda.

sync_file_range () shaqada

Linux waxay leedahay wicitaan habaysan sync_file_range (), kaas oo kuu ogolaanaya inaad ku daadiso qayb ka mid ah faylka diskka, ma aha dhammaan faylka. Wicitaanku waxa uu bilaabaa dareere asynchronous ah mana sugayo in uu dhammeeyo. Laakiin tixraac ahaan sync_file_range() amarkan ayaa la sheegay inuu yahay "mid aad khatar u ah". Laguma talin in la isticmaalo. Tilmaamaha iyo khataraha sync_file_range() si aad u wanaagsan ayaa lagu sharaxay tan maaddo. Gaar ahaan, wacitaankani wuxuu u muuqdaa inuu isticmaalo RocksDB si loo xakameeyo marka kernelku ku daadiyo xogta "wasakh" saxanka. Laakiin waqti isku mid ah halkaas, si loo hubiyo kaydinta xogta deggan, waxa kale oo loo isticmaalaa fdatasync(). The koodh RocksDB waxay leedahay faallooyin xiiso leh oo ku saabsan mawduucan. Tusaale ahaan, waxay u egtahay wicitaanka sync_file_range() marka la isticmaalayo ZFS ma daadin xogta disk. Waayo-aragnimadu waxay ii sheegtaa in koodka dhifta ah ee la isticmaalo laga yaabo inuu kutaanno ku jiro. Sidaa darteed, waxaan kugula talin lahaa inaadan isticmaalin nidaamkan wicitaanka haddii aan loo baahnayn.

Wicitaanada nidaamka si ay u caawiyaan hubinta ku adkaysiga xogta

Waxa aan gartay in ay jiraan saddex hab oo loo isticmaali karo in lagu fuliyo hawlgallada I/O ee joogtada ah. Dhammaantood waxay u baahan yihiin wicitaan shaqo fsync() tusaha meesha faylka lagu sameeyay. Waa kuwan hababka:

  1. Wacitaanka shaqada fdatasync() ama fsync() shaqada ka dib write() (ka fiican in la isticmaalo fdatasync()).
  2. La shaqaynta sharraxaha faylka oo lagu furay calan O_DSYNC ama O_SYNC (ka roon - calan leh O_DSYNC).
  3. Isticmaalka amarka pwritev2() calan leh RWF_DSYNC ama RWF_SYNC (doorbidayaa calanka RWF_DSYNC).

Qoraalada Waxqabadka

Si taxaddar leh uma aan cabbirin waxqabadka hababka kala duwan ee aan baaray. Farqiga aan ka ogaaday xawaaraha shaqadoodu aad bay u yar yihiin. Taas macnaheedu waa in aan khaldami karo, iyo in xaaladaha kale wax la mid ah ay muujin karaan natiijooyin kala duwan. Marka hore, waxaan ka hadli doonaa waxa saameeya waxqabadka in ka badan, ka dibna, waxa ku saabsan waxa saameeya waxqabadka yar.

  1. Ku-beddelka xogta faylka way ka dhakhso badan tahay ku-xidhka xogta faylka (faa'iidada waxqabadku waxay noqon kartaa 2-100%). Ku dhejinta xogta faylka waxay u baahan tahay isbeddelo dheeraad ah oo lagu sameeyo xogta badan ee faylka, xitaa ka dib wicitaanka nidaamka fallocate(), laakiin baaxadda saamayntani way kala duwanaan kartaa. Waxaan ku talinayaa, waxqabadka ugu fiican, in la waco fallocate() si hore loogu qoondeeyo booska loo baahan yahay. Markaa booskan waa in si cad loo buuxiyaa eber oo la wacaa fsync(). Tani waxay sababi doontaa baloogyada u dhigma ee nidaamka faylalka in lagu calaamadiyo "la qoondeeyey" halkii "aan la qoondayn". Tani waxay siinaysaa horumar yar (qiyaastii 2%). Sidoo kale, saxannada qaar ayaa laga yaabaa inay leeyihiin hawl galkii ugu horreeyay ee xannibaadda oo ka gaabis ah kuwa kale. Tani waxay ka dhigan tahay buuxinta booska eber waxay horseedi kartaa horumar la taaban karo (qiyaastii 100%). Gaar ahaan, tani waxay ku dhici kartaa saxanadaha. AWS EBS (tani waa xog aan rasmi ahayn, ma xaqiijin karo iyaga). Waxa la mid ah kaydinta. Disk-ga joogtada ah ee GCP (tanina waa horeba xog rasmi ah, oo lagu xaqiijiyay tijaabooyin). Khubarada kale ayaa sidaas oo kale sameeyay fiirsashola xiriira saxanadaha kala duwan.
  2. Wicitaanada nidaamka yar, ayaa kor u kaca waxqabadka (faa'iidada waxay noqon kartaa ilaa 5%). Waxay u egtahay wicitaan open() calan leh O_DSYNC ama wac pwritev2() calan leh RWF_SYNC degdeg ah wac fdatasync(). Waxaan ka shakisanahay in ujeedada halkan ay tahay in habkan, xaqiiqda ah in wicitaanno nidaamyo yar ay tahay in la sameeyo si loo xalliyo isla hawsha (hal wicitaan halkii laba) ayaa door ka ciyaara. Laakiin farqiga wax qabadku aad ayuu u yar yahay, markaa si fudud ayaad iskaga indho tiri kartaa oo aad u isticmaali kartaa shay codsiga ku jira oo aan u horseedin dhibka caqligiisa.

Haddii aad xiisaynayso mawduuca kaydinta xogta waara, halkan waxaa ah agab waxtar leh:

  • Hababka Galitaanka I/O - dulmar guud oo ku saabsan aasaaska hababka wax-gelinta/soo-saarka.
  • Xaqiijinta in xogta ay gaarto diskka - sheeko ku saabsan waxa ku dhacaya xogta jidka ka codsiga ilaa diskka.
  • Goorma ayay tahay inaad fsync ka sameyso hagaha - jawaabta su'aasha ah goorta la codsanayo fsync() loogu talagalay hagaha. Marka la soo koobo, waxay soo baxday inaad u baahan tahay inaad tan sameyso markaad abuureyso fayl cusub, sababta taladan loo soo jeediyayna waa in Linux ay jiri karaan tixraacyo badan oo isku mid ah.
  • SQL Server ee Linux: FUA Internals - Halkan waxaa ah sharraxaad ku saabsan sida kaydinta xogta joogtada ah loogu hirgeliyay SQL Server ee madal Linux. Waxaa jira isbarbardhig xiiso leh oo u dhexeeya wicitaannada nidaamka Windows iyo Linux halkan. Waxaan hubaa in ay ku mahadsan tahay agabkan aan ka bartay tayaynta FUA ee XFS.

Weligaa ma lumisay xog aad u malaysay inay si ammaan ah ugu kaydsan tahay saxanka?

Kaydinta Xogta Waara iyo Linux File APIs

Kaydinta Xogta Waara iyo Linux File APIs

Source: www.habr.com