Pamene ndikufufuza kukhazikika kwa kusungidwa kwa deta mu machitidwe a mtambo, ndinaganiza zodziyesa ndekha ndikuonetsetsa kuti ndikumvetsa zofunikira. Kuti mumvetsetse zitsimikizo zokhudzana ndi kukhazikika kwa deta (ndiko kuti, chitsimikizo chakuti deta idzafikiridwa pambuyo pa kulephera kwa dongosolo) yoperekedwa ndi ma drive a NMVe, ndinafika paziganizo zotsatirazi: deta iyenera kuonedwa kuti yawonongeka kuyambira pomwe lamulo lolemba limaperekedwa mpaka nthawi yomwe deta imalembedwa kumalo osungirako. Komabe, mapulogalamu ambiri amasangalala kugwiritsa ntchito mafoni amtundu kuti alembe deta.
Munkhaniyi, ndikuyang'ana njira zosungira deta zomwe zimaperekedwa ndi ma API a mafayilo. LinuxZikuwoneka kuti chilichonse apa chiyenera kukhala chosavuta: pulogalamuyo imatcha lamulo write(), ndipo lamuloli likamaliza, deta idzasungidwa bwino ku diski. Koma write() Imangokopera zambiri zamapulogalamu ku kernel cache yomwe ili mu RAM. Kukakamiza dongosolo kuti lilembe deta ku diski, njira zina zowonjezera ziyenera kugwiritsidwa ntchito.
Ponseponse, nkhaniyi ndi mndandanda wa zolemba zomwe ndaphunzira pamutu womwe umandisangalatsa. Kuti mufotokoze mwachidule mfundo zofunika kwambiri, zimakhala kuti kukonza zosungirako zokhazikika, muyenera kugwiritsa ntchito lamulo. fdatasync() kapena tsegulani mafayilo ndi mbendera O_DSYNCNgati mukufuna kudziwa zambiri za zomwe zimachitika ku data yanu ikamayenda kuchokera pa pulogalamu yanu kupita ku disk yanu, yang'anani nkhani.
Zomwe mungagwiritse ntchito kulemba () ntchito
Kuitana kwadongosolo write() kufotokozedwa mu muyezo monga kuyesa kulemba deta ku fayilo yofotokozera. Mukamaliza bwino write() ntchito zowerengera deta ziyenera kubweza ndendende ma byte omwe adalembedwa kale, kutero ngakhale deta ikupezeka kuchokera kunjira zina kapena ulusi ( gawo loyenera la muyezo wa POSIX). M'gawo la kuyanjana kwa ulusi ndi magwiridwe antchito anthawi zonse, pali cholemba chonena kuti ngati ulusi uwiri uliwonse ukaitana izi, kuyimba kulikonse kuyenera kuwona zotsatira zonse za foni ina, kapena ayi. Izi zikusonyeza kuti ma fayilo onse a I/O ayenera kukhala ndi loko pazomwe akupeza.
Kodi izi zikutanthauza kuti ntchito write() ndi atomiki? Mwaukadaulo, inde. Ntchito zowerengera deta ziyenera kubweza zonse kapena chilichonse pazomwe zidalembedwa write(). Koma opareshoni write(), malinga ndi muyezo, sikuyenera kumaliza kulemba zonse zomwe adafunsidwa kuti alembe. Zimaloledwa kulemba gawo lokha la deta. Mwachitsanzo, titha kukhala ndi ulusi iwiri, iliyonse ikuphatikiza ma byte 1024 ku fayilo yofotokozedwa ndi fayilo yofotokozera yomweyi. Malinga ndi muyezo, chotsatira chovomerezeka chingakhale chakuti ntchito iliyonse yolemba ingowonjezera baiti imodzi yokha pafayiloyo. Zochita izi zikhalabe za atomiki, koma zikamaliza, zomwe adalemba pafayiloyo zimasakanizidwa. Pali zokambirana zosangalatsa kwambiri pamutuwu pa Stack Overflow.
fsync () ndi fdatasync () ntchito
Njira yosavuta yosinthira deta ku diski ndikuyimbira ntchitoyi Izi zimapempha opareshoni kuti asamutsire midadada yonse yosinthidwa kuchokera ku cache kupita ku disk. Izi zikuphatikiza metadata yonse yamafayilo (nthawi yofikira, nthawi yosintha, ndi zina zotero). Ndikukhulupirira kuti metadata iyi sifunikira kawirikawiri, kotero ngati mukudziwa kuti sizofunika kwa inu, mutha kugwiritsa ntchito ntchitoyi. fdatasync(). The pa fdatasync() Imanena kuti ntchitoyi imapulumutsa ku disk kuchuluka kwa metadata "yofunikira kuti igwire ntchito zowerengera zotsatila." Ndipo ndizo ndendende zomwe mapulogalamu ambiri amasamala.
Vuto limodzi lomwe lingabwere apa ndikuti njirazi sizikutsimikizira kuti fayilo ikhoza kupezeka pambuyo pakulephera kotheka. Makamaka, fayilo yatsopano ikapangidwa, muyenera kuyimba fsync() kwa chikwatu chomwe chili nacho. Apo ayi, pambuyo pa ngozi, zikhoza kukhala kuti fayiloyi kulibe. Chifukwa chake ndikuti mu UNIX, chifukwa chogwiritsa ntchito maulalo olimba, fayilo ikhoza kukhalapo m'madongosolo angapo. Choncho, poyitana fsync() palibe njira yoti fayilo idziwe kuti ndi data yanji yomwe iyeneranso kusinthidwa ku disk ( Mutha kuwerenga zambiri za izi). Zikuwoneka kuti fayilo ya ext4 imatha kutsatira fsync() kupita kumakanema omwe ali ndi mafayilo ofananira, koma izi sizingakhale choncho ndi mafayilo ena.
Makinawa amatha kukhazikitsidwa mosiyanasiyana m'mafayilo osiyanasiyana. Ndinagwiritsa ntchito Kuti mudziwe zambiri zama disk omwe amagwiritsidwa ntchito ndi mafayilo a ext4 ndi XFS. Onsewa amatulutsa malamulo anthawi zonse a disk kulemba zonse zomwe zili mufayilo ndi nyuzipepala yamafayilo, tsitsani cache, ndikutuluka pochita FUA (Force Unit Access, kulemba deta molunjika ku disk, kudutsa posungira) lembani ku magazini. Ayenera kuchita izi kuti atsimikizire kuti ntchitoyi yatha. Pama drive omwe sagwirizana ndi FUA, izi zimayambitsa ma cache awiri. Zoyesera zanga zasonyeza zimenezo fdatasync() mofulumira pang'ono fsync(). Zothandiza blktrace zikusonyeza kuti fdatasync() Nthawi zambiri amalemba zochepa pa disk (mu ext4 fsync() amalemba 20 KB, ndi fdatasync() - 16KiB). Kuphatikiza apo, ndapeza kuti XFS ndiyothamanga pang'ono kuposa ext4. Ndiyeno ndi thandizo la blktrace anakwanitsa kupeza zimenezo fdatasync() imatsitsa zambiri ku disk (4KiB mu XFS).
Mikangano yomwe imabwera mukamagwiritsa ntchito fsync ()
Ndikukumbukira zinthu zitatu zotsutsana fsync(), zomwe ndinakumana nazo muzochita.
Chochitika choyamba chotere chinachitika mu 2008. Kalelo, mawonekedwe a Firefox 3 amaundana polemba kuchuluka kwa mafayilo ku disk. Vuto linali loti mawonekedwe a mawonekedwe adagwiritsa ntchito database ya SQLite kusunga dziko lake. Pambuyo pakusintha kulikonse kwa mawonekedwe, ntchito idatchedwa. fsync(), zomwe zinapereka zitsimikizo zabwino zosungirako deta yokhazikika. Mu fayilo ya ext3 yomwe imagwiritsidwa ntchito panthawiyo, ntchitoyo fsync() adatsitsa masamba onse "odetsedwa" mudongosolo kupita ku disk, osati okhawo okhudzana ndi fayilo yomwe ikufunsidwa. Izi zikutanthauza kuti kudina batani mu Firefox kungayambitse kulembedwa kwa ma megabytes a data ku maginito disk, zomwe zingatenge masekondi ambiri. Yankho la vutolo, monga momwe ndimamvera Yankho lake linali kusuntha ntchito za database ku ntchito zosasinthika zakumbuyo. Izi zikutanthauza kuti Firefox idakhazikitsa kale zofunikira zosungirako kuposa momwe zinalili zofunika, ndipo kutsimikizika kwa fayilo ya ext3 kunangowonjezera vutoli.
Nkhani yachiwiri inachitika mu 2009. Kenaka, pambuyo pa kuwonongeka kwa dongosolo, ogwiritsa ntchito fayilo yatsopano ya ext4 anakumana ndi mafayilo ambiri omwe adangopangidwa kumene ndi zero kutalika, pamene izi sizinachitike ndi fayilo yakale ya ext3. M'ndime yapitayi, ndinanena kuti ext3 inali kuthamangitsa deta yambiri ku disk, zomwe zimachepetsa kwambiri ntchito. fsync()Kuti izi zitheke, ext4 imangotsegula masamba "odetsedwa" omwe ali okhudzana ndi fayilo inayake. Deta kuchokera kumafayilo ena imakhalabe mukumbukiro kwa nthawi yayitali kuposa ndi ext3. Izi zidachitidwa kuti ziwongolere magwiridwe antchito (mwachisawawa, deta imakhalabe m'chigawochi kwa masekondi 30, omwe amatha kusinthidwa pogwiritsa ntchito ; (Mutha kupeza zambiri za izi). Izi zikutanthauza kuti zambiri deta akhoza irretrievably anataya pambuyo kulephera. Njira yothetsera vutoli ndikugwiritsa ntchito fsync() m'mapulogalamu omwe amafunikira kusungidwa kodalirika kwa data ndi chitetezo chokwanira ku zotsatira za kulephera. Ntchito fsync() Zimagwira ntchito bwino kwambiri mukamagwiritsa ntchito ext4 kuposa mukamagwiritsa ntchito ext3. Choyipa cha njirayi ndikuti imachedwetsabe ntchito zina, monga kukhazikitsa mapulogalamu. Kuti mudziwe zambiri, onani ΠΈ .
Vuto lachitatu lokhudza fsync(), idawuka mu 2018. Kenako, mkati mwa dongosolo la polojekiti ya PostgreSQL, zidapezeka kuti ngati ntchitoyi fsync() ikakumana ndi vuto, imalemba masamba "odetsedwa" ngati "oyera". Zotsatira zake, mafoni otsatirawa fsync() Palibe chomwe chimapangidwa ndi masamba otere. Chifukwa cha izi, masamba osinthidwa amasungidwa pamtima ndipo sanalembedwe ku disk. Ichi ndi tsoka lenileni, popeza pulogalamuyi idzaganiza kuti deta ina yalembedwa ku disk, koma kwenikweni, izi siziri choncho. Zowonongeka zotere fsync() Izi ndizosowa, ndipo kugwiritsa ntchito sikungathandize kwenikweni kuthana ndi vutoli. Masiku ano, izi zikachitika, PostgreSQL ndi mapulogalamu ena amawonongeka. Nkhani yakuti "Kodi Mapulogalamu Angabwezere Kukulephera kwa Fsync?" ikuwunika mwatsatanetsatane nkhaniyi. Pakadali pano, njira yabwino yothetsera vutoli ndikugwiritsa ntchito Direct I/O ndi mbendera O_SYNC kapena ndi mbendera O_DSYNCNdi njira iyi, dongosololi lidzafotokoza zolakwika zomwe zingachitike polemba zolemba zinazake, koma njira iyi imafuna kuti pulogalamuyo isamalire ma buffer okha. Kuti mudziwe zambiri, werengani ΠΈ .
Kutsegula mafayilo pogwiritsa ntchito mbendera za O_SYNC ndi O_DSYNC
Tiyeni tibwererenso ku nkhani ya njira Linux, kuonetsetsa kuti deta ikusungidwa bwino. Makamaka, tikulankhula za kugwiritsa ntchito mbendera O_SYNC kapena mbendera O_DSYNC potsegula mafayilo pogwiritsa ntchito foni yamakono Ndi njirayi, ntchito iliyonse yolemba deta imachitidwa ngati pambuyo pa lamulo lililonse write() dongosolo amapatsidwa malamulo molingana fsync() ΠΈ fdatasync(). The Izi zimatchedwa "Synchronized I/O File Integrity Completion" ndi "Deta Integrity Completion." Ubwino waukulu wa njirayi ndikuti kuyimba kwadongosolo kumodzi kokha kumafunika kuchitidwa kuti zitsimikizire kukhulupirika kwa data, osati ziwiri (mwachitsanzo, write() ΠΈ fdatasync()). Choyipa chachikulu cha njirayi ndikuti ntchito zonse zolembera pogwiritsa ntchito fayilo yofananira zidzalumikizidwa, zomwe zingachepetse kuthekera kopanga ma code ogwiritsira ntchito.
Kugwiritsa ntchito Direct I/O yokhala ndi mbendera ya O_DIRECT
Kuitana kwadongosolo open() amathandizira mbendera O_DIRECT, lomwe lapangidwa kuti lizilambalala kachesi ya opaleshoni ndikuchita ntchito za I / O mwachindunji ndi disk. Nthawi zambiri, izi zikutanthauza kuti kulemba malamulo operekedwa ndi pulogalamuyi adzamasuliridwa mwachindunji mu disk malamulo. Komabe, kawirikawiri, makinawa salowa m'malo mwa ntchito fsync() kapena fdatasync()Chinthu chake ndi chakuti disk yokhayo imatha lolingana deta kulemba malamulo. Ndipo, choyipa kwambiri, nthawi zina zapadera, ntchito za I / O zimachitidwa pogwiritsa ntchito mbendera O_DIRECT, mu ntchito zachikhalidwe zotetezedwa. Njira yosavuta yothetsera vutoli ndikugwiritsanso ntchito mbendera potsegula mafayilo. O_DSYNC, zomwe zikutanthauza kuti ntchito iliyonse yolemba idzatsatiridwa ndi kuyitana fdatasync().
Zinapezeka kuti fayilo ya XFS posachedwapa yawonjezera "njira yofulumira" ya O_DIRECT|O_DSYNC-data amalemba. Ngati chipikacho chalembedwa pogwiritsa ntchito O_DIRECT|O_DSYNC, ndiye XFS, m'malo motsitsa cache, ipereka lamulo lolemba la FUA ngati chipangizocho chikuchirikiza. Ndinatsimikizira izi pogwiritsa ntchito chida blktrace m'dongosolo Linux 5.4 /Ubuntu 20.04. Njira iyi iyenera kukhala yothandiza kwambiri, chifukwa imalemba deta yochepa pa disk ndipo imagwiritsa ntchito njira imodzi m'malo mwa ziwiri (kulemba ndi kuchotsa cache). Ndapeza ulalo wa Kernel ya 2018, yomwe imagwiritsa ntchito makinawa, ili ndi zokambirana zakugwiritsa ntchito kukhathamiritsa kumeneku pamafayilo ena, koma monga ndikudziwira, XFS ndiyo yokhayo yamafayilo yomwe imathandizira.
sync_file_range() ntchito
Π Linux pali kuyitana kwa dongosolo , zomwe zimakupatsani mwayi wotsitsa gawo lokha la fayilo ku diski, m'malo mwa fayilo yonse. Kuyimba uku kumayambitsa kusinthasintha kosagwirizana ndipo sikudikirira kuti kumalize. Koma mu chithandizo sync_file_range() Lamuloli akuti ndi "loopsa kwambiri." Kugwiritsa ntchito kwake sikuvomerezeka. Mbali ndi zoopsa sync_file_range() amafotokozedwa bwino kwambiri zakuthupi. Makamaka, kuyimba uku kumawoneka kuti kumagwiritsa ntchito RocksDB kuwongolera pomwe kernel itaya "zakuda" ku disk. Koma pa nthawi yomweyo amagwiritsanso ntchito fdatasync(). The RocksDB ili ndi ndemanga zosangalatsa pamutuwu. Mwachitsanzo, zikuwoneka ngati zovuta sync_file_range() Mukamagwiritsa ntchito ZFS, izi sizimapangitsa kuti deta isunthidwe ku disk. Zochitika zimandiuza kuti khodi yomwe sagwiritsidwa ntchito kawirikawiri imakhala ndi nsikidzi. Chifukwa chake, ndingalangize kuti musagwiritse ntchito kuyimba foniyi pokhapokha ngati kuli kofunikira.
Kuyimba foni pamakina komwe kumathandizira kuonetsetsa kuti data ipitilirabe
Ndazindikira kuti pali njira zitatu zogwirira ntchito za I/O zomwe zimatsimikizira kusungidwa kwa data kosalekeza. Zonsezi zimafuna kuyitana ntchito. fsync() kwa chikwatu chomwe fayilo idapangidwira. Nazi njira izi:
- Kuyitana ntchito
fdatasync()kapenafsync()pambuyo ntchitowrite()(zabwino kugwiritsa ntchitofdatasync()). - Kugwira ntchito ndi fayilo yofotokozera yotsegulidwa ndi mbendera
O_DSYNCkapenaO_SYNC(bwino ndi mbendera)O_DSYNC). - Kugwiritsa ntchito lamulo
pwritev2()ndi mbenderaRWF_DSYNCkapenaRWF_SYNC(makamaka ndi mbendera)RWF_DSYNC).
Zolemba Zochita
Sindinayeze bwino momwe makina amagwirira ntchito omwe ndidawapenda. Kusiyana kwa liwiro lawo lomwe ndawonapo kuli kochepa kwambiri. Izi zikutanthauza kuti ndikhoza kulakwitsa, ndipo chinthu chomwecho chikhoza kupereka zotsatira zosiyana pamikhalidwe yosiyanasiyana. Choyamba, ndikambirana zomwe zimakhudza kwambiri ntchito, ndiyeno zomwe zili ndi zotsatira zochepa.
- Kulembanso zambiri za fayilo ndikofulumira kuposa kuyika deta ku fayilo (kupindula kwa magwiridwe antchito kumatha kuchoka pa 2% mpaka 100%). Kuyika deta ku fayilo kumafuna kusintha kwina kwa metadata ya fayilo, ngakhale mutayimba foni.
fallocate(), koma kukula kwa zotsatira zake kungakhale kosiyana. Ndikupangira, kuti muchite bwino, kuyimba fonifallocate()kugawatu malo ofunikira. Ndiye danga ili liyenera kudzazidwa momveka bwino ndi ziro ndikuyitanidwafsync()Izi zimapangitsa kuti midadada yofanana mu fayilo yamafayilo ilembedwe ngati "yoperekedwa" osati "yosagawidwa." Izi zimapereka kuwongolera kwakung'ono (pafupifupi 2%). Kuphatikiza apo, ma drive ena amatha kugwira ntchito yoyamba yolowera pang'onopang'ono kuposa ena. Izi zikutanthauza kuti kudzaza zero kungapangitse kuti pakhale kusintha kwakukulu (pafupifupi 100%). Izi zitha kuchitika, makamaka, ndi ma drive (Iyi ndi data yosavomerezeka, sindinathe kutsimikizira). Zomwezo zimagwiranso ntchito ku malo osungirako zinthu (ndipo izi ndizodziwika kale, zotsimikiziridwa ndi mayesero). Akatswiri ena apanganso chimodzimodzi , zokhudzana ndi ma disks osiyanasiyana. - Kuyimba kwamakina ocheperako, kumapangitsa magwiridwe antchito apamwamba (kupindula kungakhale kozungulira 5%). Zikuoneka kuti kuitana
open()ndi mbenderaO_DSYNCkapena chovutapwritev2()ndi mbenderaRWF_SYNCmwachangu kuposa kuyimbafdatasync()Ndikukayikira chifukwa chake ndikuti njira iyi imafunikira mafoni ochepa (amodzi m'malo mwa awiri) kuti akwaniritse ntchito yomweyo. Koma kusiyana kwa magwiridwe antchito ndikocheperako kotero kuti mutha kunyalanyaza mosavuta ndikugwiritsa ntchito china chake chomwe sichingasokoneze malingaliro ake.
Ngati muli ndi chidwi ndi mutu wakusungitsa deta mokhazikika, nazi zina zothandiza:
- - Chidule cha zoyambira za njira zolowera / zotulutsa.
- - Nkhani yokhudzana ndi zomwe zimachitika ku data panjira kuchokera pakugwiritsa ntchito kupita ku diski.
- - yankho la funso la nthawi yofunsira
fsync()kwa ma directories. Mwachidule, zikuoneka kuti izi ziyenera kuchitika popanga fayilo yatsopano, ndipo chifukwa cha malangizo awa ndi chakuti mu Linux Pakhoza kukhala maulalo ambiri ku fayilo yomweyo. - β apa pali kufotokozera momwe kusungira deta kosalekeza kumachitikira mu SQL Server papulatifomu LinuxPali kufananiza kosangalatsa pakati pa mafoni a dongosolo pano. Windows ΠΈ LinuxNdili wotsimikiza kuti ndi chifukwa cha nkhaniyi ndinaphunzira za kukonza bwino kwa FUA kwa XFS.
Kodi mudatayapo deta yomwe mumaganiza kuti idasungidwa bwino pagalimoto yanu?
Source: www.habr.com
