Kusunga deta kosalekeza ndi ma API a mafayilo Linux

Pamene ndikufufuza kukhazikika kwa kusungidwa kwa deta mu machitidwe a mtambo, ndinaganiza zodziyesa ndekha ndikuonetsetsa kuti ndikumvetsa zofunikira. Ndinayamba ndikuwerenga mafotokozedwe a NVMe. 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.

Kusunga deta kosalekeza ndi ma API a mafayilo Linux

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 izi nkhani.

Zomwe mungagwiritse ntchito kulemba () ntchito

Kuitana kwadongosolo write() kufotokozedwa mu muyezo IEEE POSIX 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 (tawonani gawo loyenera la muyezo wa POSIX). ndiM'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. pano Pali zokambirana zosangalatsa kwambiri pamutuwu pa Stack Overflow.

fsync () ndi fdatasync () ntchito

Njira yosavuta yosinthira deta ku diski ndikuyimbira ntchitoyi fsync ()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 satifiketi 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 (apa Mutha kuwerenga zambiri za izi). Zikuwoneka kuti fayilo ya ext4 imatha basi 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 blktrace 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 izo 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 dirty_expire_centisecs; apa (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 apa ΠΈ apa.

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. ndiNkhani 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 apa ΠΈ apa.

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 tsegula ()Ndi njirayi, ntchito iliyonse yolemba deta imachitidwa ngati pambuyo pa lamulo lililonse write() dongosolo amapatsidwa malamulo molingana fsync() ΠΈ fdatasync(). The Zotsatira za POSIX 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 chepetsa kapena cache lolingana deta kulemba malamulo. Ndipo, choyipa kwambiri, nthawi zina zapadera, ntchito za I / O zimachitidwa pogwiritsa ntchito mbendera O_DIRECT, zimawulutsidwa 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 chigamba 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 kulunzanitsa_fayilo_range(), 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 izi zakuthupi. Makamaka, kuyimba uku kumawoneka kuti kumagwiritsa ntchito RocksDB kuwongolera pomwe kernel itaya "zakuda" ku disk. Koma pa nthawi yomweyo amagwiritsanso ntchito fdatasync(). The kachidindo 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:

  1. Kuyitana ntchito fdatasync() kapena fsync() pambuyo ntchito write() (zabwino kugwiritsa ntchito fdatasync()).
  2. Kugwira ntchito ndi fayilo yofotokozera yotsegulidwa ndi mbendera O_DSYNC kapena O_SYNC (bwino ndi mbendera) O_DSYNC).
  3. Kugwiritsa ntchito lamulo pwritev2() ndi mbendera RWF_DSYNC kapena RWF_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.

  1. 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 foni fallocate() kugawatu malo ofunikira. Ndiye danga ili liyenera kudzazidwa momveka bwino ndi ziro ndikuyitanidwa fsync()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 AWS EBS (Iyi ndi data yosavomerezeka, sindinathe kutsimikizira). Zomwezo zimagwiranso ntchito ku malo osungirako zinthu GCP Persistent Disk (ndipo izi ndizodziwika kale, zotsimikiziridwa ndi mayesero). Akatswiri ena apanganso chimodzimodzi kuyang'anitsitsa, zokhudzana ndi ma disks osiyanasiyana.
  2. Kuyimba kwamakina ocheperako, kumapangitsa magwiridwe antchito apamwamba (kupindula kungakhale kozungulira 5%). Zikuoneka kuti kuitana open() ndi mbendera O_DSYNC kapena chovuta pwritev2() ndi mbendera RWF_SYNC mwachangu kuposa kuyimba fdatasync()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:

  • Njira zopezera I/O - Chidule cha zoyambira za njira zolowera / zotulutsa.
  • Kuonetsetsa kuti deta ifika pa disk - Nkhani yokhudzana ndi zomwe zimachitika ku data panjira kuchokera pakugwiritsa ntchito kupita ku diski.
  • Ndi liti pamene muyenera fsync ndandanda yomwe ili - 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.
  • Seva ya SQL yayatsidwa Linux: Zamkati za FUA β€” 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?

Kusunga deta kosalekeza ndi ma API a mafayilo Linux

Kusunga deta kosalekeza ndi ma API a mafayilo Linux

Source: www.habr.com

Gulani kuchititsa kodalirika kwamasamba okhala ndi chitetezo cha DDoS, ma seva a VPS VDS Gulani malo odalirika osungira mawebusayiti okhala ndi chitetezo cha DDoS, ma seva a VPS VDS | ProHoster