Nchekwa data na-adịgide adịgide yana API faịlụ Linux

Mgbe m na-enyocha nkwado nke nchekwa data na sistemụ igwe ojii, ekpebiri m ịnwale onwe m iji jide n'aka na m ghọtara ihe ndị bụ isi. I malitere site n'ịgụ nkọwa NVMe iji ghọta ihe nkwa maka nchekwa data na-adigide (ya bụ, na-ekwe nkwa na data ahụ ga-adị mgbe ọdịda sistemụ) nyere anyị diski NMVe. Emere m nkwubi okwu ndị a bụ isi: data ga-abụrịrị mebiri emebi site na mgbe enyere iwu ide data ruo oge edere ya na nchekwa nchekwa. Agbanyeghị, ọtụtụ mmemme na-eji obi ụtọ na-eji oku sistemụ dekọ data.

Na ọkwa a, m na-enyocha usoro nchekwa na-adịgide adịgide nke API faịlụ Linux nyere. Ọ dị ka ihe niile kwesịrị ịdị mfe ebe a: mmemme ahụ na-akpọ iwu ahụ write(), ma ka emechara iwu a, a ga-echekwa data ahụ na diski. Ma write() naanị na-eṅomi data ngwa na cache kernel dị na RAM. Iji manye sistemu ide data na diski, ịkwesịrị iji ụfọdụ usoro ndị ọzọ.

Nchekwa data na-adịgide adịgide yana API faịlụ Linux

N'ozuzu, akwụkwọ a bụ nchịkọta nke ndetu metụtara ihe m mụtara na isiokwu masịrị m. Ọ bụrụ na anyị na-ekwu okwu nkenke maka ihe kacha mkpa, ọ na-apụta na iji hazie nchekwa data na-adigide, ịkwesịrị iji iwu ahụ. fdatasync() ma ọ bụ mepee faịlụ na ọkọlọtọ O_DSYNC. Ọ bụrụ na ị nwere mmasị ịmụtakwu ihe na-eme data na ụzọ ya site na koodu gaa na diski, lelee anya nke a edemede.

Njirimara nke iji ọrụ ide()

Oku sistemu write() akọwapụtara na ọkọlọtọ IEEE POSIX dị ka mgbalị ịde data na onye na-akọwa faịlụ. Mgbe emechara nke ọma write() Ọrụ ịgụ data ga-eweghachite kpọmkwem bytes nke edere na mbụ, na-eme nke a ọbụlagodi na enwetara data site na usoro ma ọ bụ eri ndị ọzọ (lee ngalaba dị mkpa nke ọkọlọtọ POSIX). ọ bụ, na ngalaba nke ka eri na-emekọrịta ihe na ọrụ faịlụ nkịtị, enwere ndetu nke na-ekwu na ọ bụrụ na eriri abụọ nke ọ bụla na-akpọ ọrụ ndị a, mgbe ahụ, oku ọ bụla ga-ahụrịrị ma ọ bụ ihe niile a ga-esi na oku nke ọzọ pụta, ma ọ bụ ọ dịghị ma ọlị. nsonaazụ. Nke a na-eduga ná nkwubi okwu na ọrụ I/O faịlụ niile ga-ejiderịrị mkpọchi na akụrụngwa ha na-arụ ọrụ na ya.

Nke a ọ pụtara na ọrụ ahụ write() ọ bụ atomiki? Site n'echiche teknụzụ, ee. Ọrụ ọgụgụ data ga-eweghachite ihe niile ma ọ bụ ihe ọ bụla nke ejiri dee ya write(). Ma ọrụ write(), dị ka ụkpụrụ ahụ si dị, ọ bụchaghị na ọ ga-akwụsị site n'ide ihe niile a gwara ya ka o dee. E kwere ka o dee naanị akụkụ nke data. Dịka ọmụmaatụ, anyị nwere ike ịnwe eriri abụọ nke ọ bụla na-etinye 1024 bytes na faịlụ nke otu onye na-akọwa faịlụ kọwara. Site n'echiche nke ọkọlọtọ, nsonaazụ a na-anabata ga-abụ mgbe ọrụ ide ihe ọ bụla nwere ike itinye naanị otu byte na faịlụ ahụ. Ọrụ ndị a ga-anọgide na-atọm, ma mgbe emechara ha, a ga-agwakọta data ha dere na faịlụ ahụ. ebe a Mkparịta ụka na-atọ ụtọ nke ukwuu na isiokwu a na Stack Overflow.

fsync () na fdatasync () ọrụ

Ụzọ kachasị mfe iji wụnye data na diski bụ ịkpọ ọrụ ahụ fsync(). Ọrụ a na-arịọ sistemụ arụmọrụ ka ọ bufee ngọngọ niile gbanwetụrụ site na cache gaa na diski. Nke a gụnyere metadata faịlụ niile (oge nnweta, oge mgbanwe faịlụ, na ihe ndị ọzọ). Ekwenyere m na metadata a anaghị adịkarị mkpa, yabụ ọ bụrụ na ịmara na ọ dịghị gị mkpa, ịnwere ike iji ọrụ ahụ. fdatasync(). The Enyemaka on fdatasync() A na-ekwu na n'oge arụ ọrụ a, a na-echekwa ụdị metadata dị otú ahụ na diski nke "dị mkpa maka nhazi nke ọma nke ọrụ ọgụgụ data ndị a." Na nke a bụ kpọmkwem ihe ọtụtụ ngwa na-eche banyere ya.

Otu nsogbu nwere ike ibili ebe a bụ na usoro ndị a anaghị ekwe nkwa na faịlụ a ga-achọpụta mgbe enwere ike ịda. Karịsịa, mgbe ị na-eke faịlụ ọhụrụ, ịkwesịrị ịkpọ fsync() maka akwụkwọ ndekọ aha nwere ya. Ma ọ bụghị ya, mgbe ọdịda gasịrị, ọ nwere ike pụta na faịlụ a adịghị. Ihe kpatara nke a bụ na na UNIX, n'ihi iji njikọ siri ike, faịlụ nwere ike ịdị na ọtụtụ akwụkwọ ndekọ aha. Ya mere, mgbe ị na-akpọ fsync() ọ nweghị ụzọ faịlụ ga-esi mara nke ndekọ data kwesịrị ịkwanye na diski (ebe a Ị nwere ike ịgụkwu gbasara nke a). Ọ dị ka sistemụ faịlụ ext4 nwere ike na-akpaghị aka tinye fsync() na akwụkwọ ndekọ aha nwere faịlụ ndị kwekọrọ, mana nke a nwere ike ọ gaghị adị na sistemụ faịlụ ndị ọzọ.

Enwere ike ime usoro a n'ụzọ dị iche na sistemụ faịlụ dị iche iche. Eji m ya blktrace ịmụta maka ọrụ diski a na-eji na ext4 na XFS faịlụ. Ha abụọ na-enye iwu ide ihe mgbe niile na diski maka ọdịnaya faịlụ yana akwụkwọ ndekọ sistemụ faịlụ, kpochapụ cache, wee pụọ site na ịme FUA (Force Unit Access, ide data ozugbo na diski, gafere cache) degara akwụkwọ akụkọ ahụ. Ha nwere ike ime nke a iji gosi na azụmahịa ahụ emeela. Na draịva na-anaghị akwado FUA, nke a na-ebute oghere cache abụọ. Nnwale m mere gosiri na fdatasync() ntakịrị ngwa ngwa fsync(). Ịbara uru blktrace na-egosi na fdatasync() na-edekarị obere data na diski (na ext4 fsync() na-ede 20 KiB, na fdatasync() - 16 KB). Ọzọkwa, achọpụtara m na XFS dị ntakịrị ngwa ngwa karịa ext4. Na ebe a na enyemaka blktrace jisiri ike chọpụta nke ahụ fdatasync() na-agbanye obere data na diski (4 KiB na XFS).

Ọnọdụ mgbagwoju anya na-ebilite mgbe ị na-eji fsync()

Enwere m ike icheta ọnọdụ atọ dị mgbagwoju anya gbasara fsync()nke m zutere na omume.

Ikpe mbụ dị otú ahụ mere na 2008. Mgbe ahụ, interface Firefox 3 jụrụ oyi ma ọ bụrụ na edere ọtụtụ faịlụ na diski. Nsogbu bụ na mmejuputa nke interface ahụ jiri nchekwa data SQLite chekwaa ozi gbasara steeti ya. Mgbe mgbanwe ọ bụla mere na interface ahụ, a na-akpọ ọrụ ahụ fsync(), nke nyere ezigbo nkwa nke nchekwa data kwụsiri ike. Na usoro faịlụ ext3 wee jiri ya rụọ ọrụ fsync() tụbara ibe niile "unyi" na sistemụ na diski, ọ bụghị naanị ndị metụtara faịlụ kwekọrọ. Nke a pụtara na ịpị bọtịnụ na Firefox nwere ike ịkpalite megabyte nke data ka edee na diski magnetik, nke nwere ike were ọtụtụ sekọnd. Ihe ngwọta maka nsogbu ahụ, dịka m ghọtara ihe a ga-ebufe ọrụ na nchekwa data gaa na ọrụ ndabere asynchronous. Nke a pụtara na Firefox na mbụ mejuputa a chọrọ nchekwa siri ike karịa ka achọrọ n'ezie, yana njirimara nke sistemụ faịlụ ext3 mere ka nsogbu a ka njọ.

Nsogbu nke abụọ mere na 2009. Mgbe ahụ, mgbe usoro ihe mberede gasịrị, ndị ọrụ nke sistemu faịlụ ext4 ọhụrụ chere eziokwu ahụ na ọtụtụ faịlụ emepụtara ọhụrụ enweghị ogologo efu, mana nke a emeghị na sistemụ faịlụ ext3 ochie. Na paragraf gara aga, ekwuru m ka ext3 si ekpochapụ data buru ibu na diski, nke mere ka ihe kwụsịlata nke ukwuu. fsync(). Iji meziwanye ọnọdụ ahụ, na ext4, naanị ibe ndị ruru unyi dị na otu faịlụ ka a na-agbanye na diski. Na data sitere na faịlụ ndị ọzọ na-anọgide na ebe nchekwa ruo ogologo oge karịa na ext3. Emere nke a iji melite arụmọrụ (site na ndabara, data na-anọ na steeti a maka sekọnd 30, ị nwere ike hazie nke a site na iji. unyi_expire_centisecs; ebe a Ị nwere ike ịchọta ihe ndị ọzọ gbasara nke a). Nke a pụtara na a nnukwu ego nke data nwere ike irretrievably efu mgbe a ọdịda. Ihe ngwọta maka nsogbu a bụ iji fsync() na ngwa ndị chọrọ iji hụ na nchekwa data kwụsiri ike ma chebe ha dịka o kwere mee site na nsonaazụ ọdịda. Ọrụ fsync() na-arụ ọrụ nke ọma karịa mgbe ị na-eji ext4 karịa mgbe ị na-eji ext3. Ọdịmma nke ụzọ a bụ na iji ya, dị ka ọ dị na mbụ, na-ebelata mmezu nke ụfọdụ ọrụ, dị ka ịwụnye mmemme. Hụ nkọwa gbasara nke a ebe a и ebe a.

Nsogbu nke atọ gbasara fsync(), malitere na 2018. Mgbe ahụ, n'ime usoro nke ọrụ PostgreSQL, a chọpụtara na ọ bụrụ na ọrụ ahụ fsync() zutere njehie, ọ na-aka ibe "unyi" dị ka "dị ọcha". N'ihi ya, oku ndị a fsync() Ha anaghị eme ihe ọ bụla na ibe ndị dị otú ahụ. N'ihi nke a, a na-echekwa ibe ndị gbanwetụrụ na ebe nchekwa ma ọ dịghị mgbe ọ bụla edere ya na diski. Nke a bụ ezigbo ọdachi, ebe ọ bụ na ngwa ahụ ga-eche na edere ụfọdụ data na diski, ma n'eziokwu ọ gaghị adị. Ụdị ọdịda dị otú ahụ fsync() dị obere, ngwa n'ọnọdụ ndị dị otú ahụ enweghị ike ime ihe ọ bụla iji luso nsogbu ahụ ọgụ. Ụbọchị ndị a, mgbe nke a mere, PostgreSQL na ngwa ndị ọzọ dara. ọ bụ, na ihe "Ngwa nwere ike nwetaghachi na fsync ọdịda?", a na-enyocha nsogbu a n'ụzọ zuru ezu. Ugbu a ihe ngwọta kachasị mma maka nsogbu a bụ iji Direct I/O nwere ọkọlọtọ O_SYNC ma ọ bụ jiri ọkọlọtọ O_DSYNC. Site na usoro a, usoro ahụ ga-akọ njehie nke nwere ike ime n'oge arụ ọrụ ederede kpọmkwem, mana usoro a chọrọ ngwa iji jikwaa ndị na-echekwa ihe n'onwe ya. Gụkwuo maka nke a ebe a и ebe a.

Imepe faịlụ site na iji ọkọlọtọ O_SYNC na O_DSYNC

Ka anyị laghachi na mkparịta ụka nke usoro Linux na-enye nchekwa data kwụsiri ike. Ya bụ, anyị na-ekwu maka iji ọkọlọtọ O_SYNC ma ọ bụ ọkọlọtọ O_DSYNC mgbe imepe faịlụ site na iji oku usoro mepere(). Site na usoro a, a na-arụ ọrụ ide data ọ bụla dị ka a ga-asị na mgbe iwu ọ bụla gasịrị write() A na-enye usoro ahụ iwu ya fsync() и fdatasync(). The Nkọwapụta POSIX nke a ka a na-akpọ "Mmekọrịta I/O File Integrity Completion" na "Emecha Ịdị Mma Data". Isi uru nke usoro a bụ na iji hụ na iguzosi ike n'ezi ihe data, naanị ị ga-eme otu oku sistemụ, karịa abụọ (dịka ọmụmaatụ - write() и fdatasync()). Ihe ọghọm dị na ụzọ a bụ na a ga-emekọrịta ihe niile edere site na iji nkọwa faịlụ kwekọrọ, nke nwere ike belata ikike ịhazi koodu ngwa.

Iji Direct I/O nwere ọkọlọtọ O_DIRECT

Oku sistemu open() na-akwado ọkọlọtọ O_DIRECT, nke emebere iji gafere cache sistemụ arụmọrụ iji rụọ ọrụ I/O site na iji diski na-emekọrịta ihe ozugbo. Nke a, n'ọtụtụ ọnọdụ, pụtara na a ga-asụgharị iwu ederede sitere na mmemme ahụ n'ime iwu nke iji diski arụ ọrụ. Ma, n'ozuzu, usoro a abụghị ihe ngbanwe maka ọrụ fsync() ma ọ bụ fdatasync(). Nke bụ eziokwu bụ na diski n'onwe ya nwere ike defer ma ọ bụ cache iwu ide data kwekọrọ. Na, iji mee ka ihe ka njọ, n'ọnọdụ ụfọdụ pụrụ iche ọrụ I/O rụrụ mgbe a na-eji ọkọlọtọ O_DIRECT, mgbasa ozi n'ime ọrụ echekwabara omenala. Ụzọ kachasị mfe iji dozie nsogbu a bụ iji ọkọlọtọ mepee faịlụ O_DSYNC, nke ga-apụta na ọrụ ide ihe ọ bụla ga-esochi oku fdatasync().

Ọ tụgharịrị na sistemụ faịlụ XFS agbakwunyela “ụzọ ngwa ngwa” n'oge na-adịbeghị anya O_DIRECT|O_DSYNC- ndekọ data. Ọ bụrụ na ejigharịgharịa ngọngọ O_DIRECT|O_DSYNC, mgbe ahụ, XFS, kama ịkwanye cache ahụ, ga-eme iwu ederede FUA ma ọ bụrụ na ngwaọrụ kwadoro ya. Achọpụtara m nke a site na iji ngwa ahụ blktrace na sistemụ Linux 5.4/Ubuntu 20.04. Usoro a kwesịrị ịdị na-arụ ọrụ nke ọma, ebe ọ bụ na mgbe ejiri ya, a na-edepụta ntakịrị data na diski na otu ọrụ a na-eji, karịa abụọ (ịde ma na-ekpochapụ cache). Achọtara m njikọ kwachie 2018 kernel, nke na-arụ ọrụ a. Enwere ụfọdụ mkparịta ụka ebe ahụ gbasara itinye njikarịcha a na sistemụ faịlụ ndị ọzọ, mana dịka m maara, XFS bụ naanị sistemụ faịlụ na-akwado nke a.

ọrụ sync_file_range().

Linux nwere oku sistemụ sync_file_oke(), nke na-enye gị ohere ịkwanye naanị akụkụ nke faịlụ na diski, karịa faịlụ dum. Oku a na-ebute mwepu data asynchronous na ọ naghị eche ka ọ mechaa. Mana na asambodo sync_file_range() A na-ekwu na otu a dị "oke egwu". A naghị atụ aro iji ya. Atụmatụ na ihe egwu sync_file_range() kọwara nke ọma na nke a ihe. Kpọmkwem, oku a na-egosi na ọ na-eji RocksDB ịchịkwa mgbe kernel na-atụgharị data ruru unyi na diski. Mana n'otu oge ahụ, iji hụ na nchekwa data kwụsiri ike, a na-ejikwa ya fdatasync(). The koodu RocksDB nwere okwu na-atọ ụtọ gbasara isiokwu a. Dịka ọmụmaatụ, ọ na-egosi na oku ahụ sync_file_range() Mgbe ị na-eji ZFS, ọ naghị ebugharị data na diski. Ahụmahụ na-agwa m na koodu nke a na-ejikarị eme ihe nwere ike ịnwe ahụhụ. Ya mere, m ga-adụ ọdụ ka ị ghara iji usoro oku a ma ọ bụrụ na ọ dị oke mkpa.

Oku sistemu na-enyere aka hụ na nkwụsi ike data

Abịala m nkwubi okwu na e nwere ụzọ atọ enwere ike iji rụọ ọrụ I/O nke na-eme ka data nọgidesie ike. Ha niile chọrọ oku ọrụ fsync() maka ndekọ nke emepụtara faịlụ ahụ. Ndị a bụ ụzọ:

  1. Na-akpọ ọrụ fdatasync() ma ọ bụ fsync() mgbe ọrụ write() (ọ ka mma iji fdatasync()).
  2. Na-arụ ọrụ na nkọwa faịlụ meghere na ọkọlọtọ O_DSYNC ma ọ bụ O_SYNC (mma - na ọkọlọtọ O_DSYNC).
  3. Ojiji iwu pwritev2() na ọkọlọtọ RWF_DSYNC ma ọ bụ RWF_SYNC (ọkachamma jiri ọkọlọtọ RWF_DSYNC).

Ndetu arụmọrụ

Ejighị m nlezianya tụọ arụmọrụ nke usoro dị iche iche m nyochara. Ndịiche m chọpụtara na ọsọ nke ọrụ ha dị obere. Nke a pụtara na m nwere ike na-ezighị ezi, na n'okpuru ọnọdụ dị iche iche otu ihe ahụ nwere ike ịrụpụta ihe dị iche iche. Nke mbụ, m ga-ekwu maka ihe na-emetụta arụmọrụ karịa, mgbe ahụ ihe na-emetụta arụmọrụ obere.

  1. Idekọ data faịlụ dị ngwa karịa itinye data na faịlụ (uru arụmọrụ nwere ike ịbụ 2-100%). Itinye data na faịlụ chọrọ mgbanwe ndị ọzọ na metadata nke faịlụ ahụ, ọbụlagodi mgbe okuchara sistemụ fallocate(), mana oke mmetụta a nwere ike ịdị iche. Ana m akwado, maka ịrụ ọrụ kacha mma, ịkpọ fallocate() iji buru ụzọ nye ohere achọrọ. Mgbe ahụ, oghere a ga-ejupụta n'ụzọ doro anya na efu ma kpọọ ya fsync(). Nke a ga-ahụ na ihe mgbochi ndị kwekọrọ na sistemụ faịlụ ka edobere dị ka "ekenyela" karịa "anaghị ekenye ya". Nke a na-enye nkwalite arụmọrụ ntakịrị (ihe dịka 2%). Na mgbakwunye, ụfọdụ diski nwere ike ịnweta ụzọ mgbochi iji nwayọ karịa ndị ọzọ. Nke a pụtara na imeju oghere na efu nwere ike ibute mmụba dị ịrịba ama (ihe dịka 100%) na arụmọrụ. Karịsịa, nke a nwere ike ime na diski AWS EBS (nke a bụ data na-akwadoghị, enweghị m ike ịkwado ya). Otu ihe ahụ na-aga maka nchekwa Disk GCP na-adịgide adịgide (na nke a abụrụlarị ozi gọọmentị, nke nnwale gosipụtara). Ndị ọkachamara ndị ọzọ emeela otu ihe ahụ nleba anya, metụtara diski dị iche iche.
  2. Obere oku usoro ole na ole, arụmọrụ dị elu (uru nwere ike ịbụ ihe dịka 5%). Ọ dị ka ihe ịma aka open() na ọkọlọtọ O_DSYNC ma ọ bụ kpọọ pwritev2() na ọkọlọtọ RWF_SYNC ngwa ngwa karịa oku fdatasync(). Echere m na isi ihe ebe a bụ na usoro a na-ekere òkè n'eziokwu na a ghaghị ime oku usoro ole na ole iji dozie otu nsogbu ahụ (otu oku kama abụọ). Mana ọdịiche dị na arụmọrụ dị ntakịrị, yabụ ị nwere ike ileghara ya anya kpamkpam wee jiri ihe dị na ngwa ahụ na-agaghị agbagha mgbagha ya.

Ọ bụrụ na ị nwere mmasị na isiokwu nke nchekwa data na-adigide, ebe a bụ ụfọdụ ihe bara uru:

  • Ụzọ nnweta I/O - nleba anya nke isi usoro ntinye/mpụta.
  • Ịhụ na data ruru disk - akụkọ banyere ihe na-eme data n'ụzọ si ngwa gaa na diski.
  • Kedu mgbe ị ga-atụgharị ndekọ ndekọ ahụ nwere - azịza nke ajụjụ nke mgbe iji fsync() maka akwụkwọ ndekọ aha. Iji tinye nke a na nkenke, ọ na-apụta na ị ga-eme nke a mgbe ị na-emepụta faịlụ ọhụrụ, na ihe kpatara nkwenye a bụ na na Linux enwere ike ịnwe ọtụtụ ntụnye aka na otu faịlụ ahụ.
  • SQL Server na Linux: FUA Internals - Nke a bụ nkọwa nke otu esi etinye nchekwa data na-adịgide adịgide na SQL Server na ikpo okwu Linux. Enwere ụfọdụ ntụnyere na-atọ ụtọ n'etiti oku sistemụ Windows na Linux ebe a. Ọ fọrọ nke nta ka m jide n'aka na ọ bụ ekele maka ihe a ka m mụtara gbasara njikarịcha FUA nke XFS.

Ị tụfuru data nke ị chere na echekwara ya na diski?

Nchekwa data na-adịgide adịgide yana API faịlụ Linux

Nchekwa data na-adịgide adịgide yana API faịlụ Linux

isi: www.habr.com