Ndichiri kutsvagisa kusimba kwekuchengetwa kwedata mumafu masystem, ndakafunga kuzviyedza kuti ndive nechokwadi chekuti ndinonzwisisa zvinhu zvakakosha. I
Mune ino positi, ini ndinoongorora anoenderera ekuchengetedza masisitimu anopihwa neLinux faira APIs. Zvinoita sekuti zvese zvinofanirwa kunge zviri nyore pano: chirongwa chinodaidza murairo write()
, uye mushure mekunge murairo uyu wapera, data ichachengetedzwa zvakachengeteka ku diski. Asi write()
inongokopa data rekushandisa kune kernel cache iri mu RAM. Kuti umanikidzire hurongwa kunyora data kune disk, unoda kushandisa mamwe maitiro ekuwedzera.
Pakazara, chinyorwa ichi muunganidzwa wezvinyorwa zvine chekuita nezvandakadzidza pamusoro penyaya yandinofarira. Kana tikataura muchidimbu nezvechinhu chinonyanya kukosha, zvinozoitika kuti kuronga kuchengetedza data kwaunofanirwa kushandisa murairo. fdatasync()
kana kuvhura mafaira nemureza O_DSYNC
. Kana iwe uchida kudzidza zvakawanda pamusoro pezvinoitika kune data munzira yayo kubva kukodhi kuenda kudhisiki, tarisa
Zvimiro zvekushandisa kunyora () basa
System call write()
inotsanangurwa muchiyero write()
Mashandisirwo ekuverenga data anofanirwa kudzosera chaizvo mabhayiti akange ambonyorwa, uchiita izvi kunyangwe iyo data inowanikwa kubva kune mamwe maitiro kana shinda (
Izvi zvinoreva here kuti kuvhiyiwa write()
ndiyo atomiki here? Kubva pakuona kwehunyanzvi, hongu. Mashandisirwo ekuverenga data anofanirwa kudzosera zvese kana hapana pane zvakanyorwa nazvo write()
. Asi oparesheni write()
, maererano nemwero wacho, haifaniri hazvo kuguma nokunyora zvose zvayakanzi inyore. Anobvumirwa kunyora chikamu che data chete. Semuenzaniso, tinogona kuva netambo mbiri imwe neimwe ichibatanidza 1024 bytes kune faira inotsanangurwa neiyo faira descriptor. Kubva pakuona kweyero, mhedzisiro inogamuchirwa ichave apo yega yega yekunyora mashandiro anogona kuwedzera imwe chete byte kufaira. Aya maitiro acharamba ari atomu, asi mushure mekunge apera, data ravakanyora kufaira richasanganiswa.
fsync () uye fdatasync () mabasa
Nzira iri nyore yekutsvaira data kune dhisiki ndeyekufonera basa fdatasync()
. The fdatasync()
Zvinonzi panguva yekushanda kwebasa iri, huwandu hwakadaro hwemetadata hunochengetwa ku diski iyo "inodiwa pakuita kwakakodzera kweanotevera kuverenga data." Uye izvi ndizvo chaizvo zvinotarisirwa nemaapplication mazhinji.
Rimwe dambudziko rinogona kumuka pano nderekuti nzira idzi hadzivimbise kuti faira ichaonekwa mushure mekutadza kutadza. Kunyanya, paunenge uchigadzira faira nyowani, unofanirwa kufona fsync()
kune dhairekitori ririmo. Kana zvisina kudaro, mushure mekukundikana, zvinogona kuitika kuti iyi faira haipo. Chikonzero cheizvi ndechekuti muUNIX, nekuda kwekushandiswa kwezvakaoma zvinongedzo, faira rinogona kuvapo mune akawanda madhairekitori. Naizvozvo, pakufona fsync()
hapana nzira yekuti faira rizive kuti nderipi dhairekitori data rinofanirawo kuiswa kune dhisiki (fsync()
kumadhairekitori ane mafaera anoenderana, asi izvi zvinogona kunge zvisiri izvo kune mamwe mafaera masisitimu.
Iyi meshini inogona kuitwa zvakasiyana pane akasiyana faira masisitimu. Ndakashandisa fdatasync()
zvishoma nekukurumidza fsync()
. Utility blktrace
zvinoratidza kuti fdatasync()
kazhinji inonyora dhata shoma kune dhisiki (mu ext4 fsync()
inonyora 20 KB, uye fdatasync()
16KiB). Zvakare, ndakaona kuti XFS inokurumidza zvishoma kupfuura ext4. Uye pano nerubatsiro blktrace
akakwanisa kuziva kuti fdatasync()
inobvisa data shoma kune dhisiki (4KiB mu XFS).
Mamiriro ezvinhu asina kujeka anomuka kana uchishandisa fsync ()
Ndinogona kufunga nezvezvinhu zvitatu zvisinganzwisisike maererano fsync()
izvo zvandakasangana nazvo mukuita.
Nyaya yekutanga yakadaro yakaitika muna 2008. Ipapo iyo Firefox 3 interface yakamira kana nhamba huru yemafaira yakanyorwa kudhisiki. Dambudziko raive rekuti kushandiswa kweiyo interface kwakashandisa SQLite dhatabhesi kuchengetedza ruzivo nezve mamiriro ayo. Mushure mekuchinja kwega kwega kwakaitika mune interface, basa rakanzi fsync()
, iyo yakapa vimbiso dzakanaka dzekuchengetedza data yakagadzikana. Mune ext3 faira system yakabva yashandiswa, basa racho fsync()
yakarasa mapeji ese "akasviba" muhurongwa kune dhisiki, uye kwete chete ayo aienderana nefaira rinoenderana. Izvi zvaireva kuti kudzvanya bhatani muFirefox kwaigona kukonzeresa megabytes yedata kuti inyorwe kune magnetic disk, izvo zvinogona kutora masekonzi akawanda. Mhinduro yedambudziko, sekunzwisisa kwandinoita kubva
Dambudziko rechipiri rakaitika muna 2009. Zvino, mushure mekuparara kwehurongwa, vashandisi veiyo itsva ext4 faira system vakatarisana nenyaya yekuti mafaera mazhinji achangogadzirwa aive ne zero kureba, asi izvi hazvina kuitika neyekare ext3 faira system. Mundima yapfuura, ndakataura nezvekuti ext3 yakawedzera sei data kune disk, izvo zvakadzora zvinhu pasi zvakanyanya. fsync()
. Kuti uvandudze mamiriro acho ezvinhu, mu ext4 chete iwo mapeji ane tsvina anoenderana neimwe faira anosundirwa kudhisiki. Uye data kubva kune mamwe mafaera inoramba iri mundangariro kwenguva yakareba kupfuura ne ext3. Izvi zvakaitwa kuti uvandudze mashandiro (nekusagadzika, iyo data inogara iri mudunhu kwemasekonzi makumi matatu, unogona kugadzirisa izvi uchishandisa fsync()
mumashandisirwo anofanirwa kuve nechokwadi chekuchengetedza data yakagadzikana uye kuvadzivirira zvakanyanya sezvinobvira kubva kumhedzisiro yekutadza. Function fsync()
inoshanda zvakanyanya zvakanyanya kana uchishandisa ext4 pane kana uchishandisa ext3. Kukanganisa kweiyi nzira ndeyokuti kushandiswa kwayo, sepakutanga, kunonotsa kuitwa kwemamwe mabasa, akadai sekuisa zvirongwa. Ona tsanangudzo pamusoro peizvi
Dambudziko rechitatu maererano fsync()
, yakatanga muna 2018. Zvadaro, mukati megadziriro yePostgreSQL purojekiti, zvakaonekwa kuti kana basa racho fsync()
inosangana nechikanganiso, inomaka "tsvina" mapeji se "akachena". Nekuda kweizvozvo, kufona kunotevera fsync()
Havaiti chero chinhu nemapeji akadaro. Nekuda kweizvi, mapeji akagadziridzwa anochengetwa mundangariro uye haana kumbobvira anyorwa kudhisiki. Iyi injodzi chaiyo, sezvo chikumbiro chichafunga kuti imwe data yakanyorerwa diski, asi chaizvoizvo hazvizove. Kukundikana kwakadaro fsync()
hazviwanzo, iko kushandiswa mumamiriro ezvinhu akadaro hakugone kuita chero chinhu kurwisa dambudziko. Mazuva ano, kana izvi zvaitika, PostgreSQL uye mamwe maapplication anoparara. O_SYNC
kana nemureza O_DSYNC
. Neiyi nzira, sisitimu inoshuma zvikanganiso zvinogona kuitika panguva chaiyo yekunyora mashandiro, asi nzira iyi inoda kuti application igadzirise iyo buffer pachayo. Verenga zvakawanda pamusoro peizvi
Kuvhura mafaera uchishandisa O_SYNC uye O_DSYNC mireza
Ngatidzokerei kunhaurirano yeLinux michina inopa yakagadzikana yekuchengetedza data. Kureva kuti tiri kutaura nezvekushandisa mureza O_SYNC
kana mureza O_DSYNC
paunovhura mafaira uchishandisa system call write()
iyo system inopihwa mirairo zvinoenderana fsync()
ΠΈ fdatasync()
. The write()
ΠΈ fdatasync()
) Chinhu chikuru chakaipa cheiyi nzira ndechekuti vese vanonyora vachishandisa inofananidzira faira descriptor ichave yakawiriraniswa, iyo inogona kudzikisira kugona kugadzira kodhi yekushandisa.
Kushandisa Direct I/O neO_DIRECT mureza
System call open()
inotsigira mureza O_DIRECT
, iyo yakagadzirirwa kunzvenga iyo yekushandisa system cache kuita I / O mashandiro kuburikidza nekudyidzana zvakananga ne diski. Izvi, muzviitiko zvakawanda, zvinoreva kuti kunyora mirairo yakabudiswa nepurogiramu ichashandurwa zvakananga mumirairo ine chinangwa chekushanda ne diski. Asi, kazhinji, iyi michina haisi kutsiva mabasa fsync()
kana fdatasync()
. Ichokwadi ndechokuti disk pachayo inogona O_DIRECT
, O_DSYNC
, izvo zvinoreva kuti imwe neimwe yekunyora kushanda ichateverwa nekufona fdatasync()
.
Zvakazoitika kuti XFS faira system yakanga ichangobva kuwedzera "nzira yekukurumidza" ye O_DIRECT|O_DSYNC
-kurekodha data. Kana block ichinyorwa zvakare uchishandisa O_DIRECT|O_DSYNC
, ipapo XFS, panzvimbo yekutsvaira cache, ichaita iyo FUA kunyora kuraira kana mudziyo uchitsigira. Ndakasimbisa izvi nekushandisa utility blktrace
pane Linux 5.4/Ubuntu 20.04 system. Iyi nzira inofanira kunge yakanyatsoshanda, sezvo kana yakashandiswa, nhamba shoma yedhesi inonyorerwa ku diski uye imwe inoshandiswa inoshandiswa, pane maviri (kunyora nekutsvaira cache). Ndakawana link ku
sync_file_range() basa
Linux ine system call sync_file_range()
chikwata chinonzi "chinotyisa zvikuru". Hazvikurudzirwi kuishandisa. Zvinhu uye njodzi sync_file_range()
yakanyatsotsanangurwa mukati fdatasync()
. The sync_file_range()
Paunenge uchishandisa ZFS, haiburitse data kudhisiki. Zvakaitika zvinondiudza kuti kodhi isingawanzo shandiswa inogona kunge iine tsikidzi. Naizvozvo, ini ndinopa zano kusashandisa iyi system yekufona kunze kwekunge zvakakodzera.
Mafoni eSistimu anobatsira kuti data irambe iripo
Ndasvika kumhedziso yekuti kune nzira nhatu dzinogona kushandiswa kuita maI/O mashandiro anoita kuti data irambe iripo. Vese vanoda runhare rwekuita fsync()
yedhairekitori rakagadzirwa faira. Aya ndiwo maitiro:
- Kudana basa
fdatasync()
kanafsync()
mushure mekushandawrite()
(zviri nani kushandisafdatasync()
). - Kushanda nefaira descriptor yakavhurwa nemureza
O_DSYNC
kanaO_SYNC
(zviri nani - nemurezaO_DSYNC
). - Kushandisa murairo
pwritev2()
nemurezaRWF_DSYNC
kanaRWF_SYNC
(zvichida nemurezaRWF_DSYNC
).
Performance Notes
Handina kunyatsoyera kushanda kwemaitiro akasiyana-siyana andakaongorora. Misiyano yandakaona mukumhanya kwebasa ravo idiki kwazvo. Izvi zvinoreva kuti ndinogona kunge ndisina kururama, uye kuti mumamiriro ezvinhu akasiyana chinhu chimwe chete chinogona kuunza migumisiro yakasiyana. Kutanga, ini ndichataura nezve izvo zvinokanganisa kuita zvakanyanya, uyezve izvo zvinokanganisa kuita kushoma.
- Kunyora faira data kunokurumidza kupfuura kuisa data kune faira (basa rekuita rinogona kuva 2-100%). Kuisa data kufaira kunoda imwe shanduko kune metadata yefaira, kunyangwe mushure mekufona system
fallocate()
, asi ukuru hweichi chiitiko hunogona kusiyana. Ini ndinokurudzira, kuitira kuita kwakanyanya, kufonafallocate()
kufanogovera nzvimbo inodiwa. Zvadaro nzvimbo iyi inofanira kuzadzwa zvakajeka ne zero uye inodanwafsync()
. Izvi zvinozoita kuti mabhuroko anoenderana mufaira system akanyorwa se "akagoverwa" kwete "asina kugoverwa". Izvi zvinopa diki (inenge 2%) mashandiro ekuvandudza. Pamusoro pezvo, mamwe madhisiki anogona kuve nekunonoka kwekutanga kuwana kune block pane mamwe. Izvi zvinoreva kuti kuzadza nzvimbo ne zero kunogona kutungamira kune yakakosha (inenge 100%) kuvandudza mukuita. Kunyanya, izvi zvinogona kuitika ne disksAWS EBS (iyi idata isina pamutemo, handina kukwanisa kuisimbisa). Zvimwe chetezvo zvinoenda kukuchengetedzaGCP Persistent Disk (uye iyi yatova ruzivo rwepamutemo, yakasimbiswa nemiedzo). Dzimwe nyanzvi dzakaita zvimwe chetezvoobservation , zvinoenderana nemadhisiki akasiyana. - Iwo mashoma masisitimu anofona, anowedzera kuita (iyo pfuma inogona kunge iri 5%). Zvinoita senge dambudziko
open()
nemurezaO_DSYNC
kana kufonapwritev2()
nemurezaRWF_SYNC
nekukurumidza kupfuura kufonafdatasync()
. Ini ndinofungidzira kuti chiripo apa ndechekuti nzira iyi ine basa mukuti mashoma masystem mafoni anofanirwa kuitwa kugadzirisa dambudziko rimwechete (kufona kumwe pachinzvimbo kwembiri). Asi mutsauko mukuita mudiki kwazvo, saka unogona kufuratira zvachose uye kushandisa chimwe chinhu mukushandisa icho chisingazoomese pfungwa dzayo.
Kana iwe uchifarira musoro wenyaya yekuchengetedza data, hezvino zvimwe zvinobatsira:
I/O Nzira dzekuwana -Kutarisisa kwekutanga kwemaitiro ekuisa/zvinobuda.Ita shuwa kuti data inosvika dhisiki - nyaya pamusoro pezvinoitika kune data munzira kubva pakushandisa kuenda kudhisiki.Ndepapi paunofanira fsync iyo ine dhairekitori - mhinduro kumubvunzo wenguva yekushandisafsync()
yedhairekitori. Kuti uise izvi muchidimbu, zvinozoitika kuti iwe unofanirwa kuita izvi paunenge uchigadzira faira idzva, uye chikonzero chekurudziro iyi ndechekuti muLinux panogona kuve nezvakawanda zvinongedzo kune imwechete faira.SQL Server paLinux: FUA Internals - heino tsananguro yekuti kuenderera mberi kwekuchengetedza data kunoitwa sei muSQL Server papuratifomu yeLinux. Pane kumwe kunonakidza kuenzanisa pakati peWindows neLinux system inofona pano. Ndine chokwadi chekuti yaive yekutenda kune ichi chinyorwa chandakadzidza nezveFUA optimization yeXFS.
Wakamborasa data rawaifunga kuti rakachengetwa zvakachengeteka padhisiki here?
Source: www.habr.com