Bobolokelo ba Boitsebiso bo tšoarellang le li-API tsa Lifaele tsa Linux

'Na, ha ke ntse ke etsa lipatlisiso ka botsitso ba polokelo ea data mekhoeng ea maru, ke ile ka etsa qeto ea ho itlhahloba, ho etsa bonnete ba hore ke utloisisa lintho tsa motheo. I e qalile ka ho bala litlhaloso tsa NVMe e le ho utloisisa hore na ke litiiso life mabapi le ho phehella ha data (ke hore, ho tiisa hore data e tla ba teng kamora ho hloleha ha sistimi) re fe li-disk tsa NMVe. Ke entse liqeto tse ka sehloohong tse latelang: o hloka ho nahana ka data e senyehileng ho tloha ha taelo ea ho ngola data e fanoa, le ho fihlela nako eo e ngotsoeng ho eona ea polokelo. Leha ho le joalo, mananeong a mangata, mehala ea sistimi e sebelisoa ka mokhoa o sireletsehileng ho ngola data.

Sehloohong sena, ke hlahloba mekhoa ea ho phehella e fanoeng ke li-API tsa faele ea Linux. Ho bonahala eka ntho e 'ngoe le e' ngoe e lokela ho ba bonolo mona: lenaneo le bitsa taelo write(), 'me ka mor'a hore taelo ena e phethe, data e tla bolokoa ka mokhoa o sireletsehileng ho disk. Empa write() e kopitsa feela data ea ts'ebeliso ho cache ea kernel e ho RAM. E le ho qobella tsamaiso ho ngola data ho disk, mekhoa e meng e eketsehileng e tlameha ho sebelisoa.

Bobolokelo ba Boitsebiso bo tšoarellang le li-API tsa Lifaele tsa Linux

Ka kakaretso, boitsebiso bona ke sete sa lintlha tse amanang le seo ke ithutileng sona ka sehlooho se thahasellisang ho 'na. Haeba re bua ka bokhutšoane ba bohlokoa ka ho fetisisa, hoa etsahala hore e le hore u hlophise polokelo ea data e tsitsitseng, u lokela ho sebelisa taelo. fdatasync() kapa bula lifaele ka folakha O_DSYNC. Haeba u thahasella ho ithuta haholoanyane ka se etsahalang ka data ho tloha ho khoutu ho ea ho disk, sheba sena sehlooho.

Likarolo tsa ho sebelisa mosebetsi oa write().

Mohala oa sistimi write() e hlalosoang ka maemo IEEE POSIX e le ho leka ho ngolla data ho e hlalosang faele. Ka mor'a ho qeta mosebetsi ka katleho write() Ts'ebetso ea ho bala data e tlameha ho khutlisa li-byte tse neng li ngotsoe pele, ho etsa sena leha data e fumaneha ho tsoa lits'ebetsong tse ling kapa likhoele (bonang karolo e tsamaellanang ea maemo a POSIX). ke, karolong e mabapi le tšebelisano ea likhoele le lits'ebetso tse tloaelehileng tsa faele, ho na le lengolo le bolelang hore haeba likhoele tse peli li bitsa mesebetsi ena, mohala o mong le o mong o tlameha ho bona litlamorao tsohle tse bonts'itsoeng tseo ho etsoa ha mohala o mong ho lebisang ho tsona, kapa ho se bone ho hang ha ho ditlamorao. Sena se lebisa qetong ea hore lits'ebetso tsohle tsa faele tsa I/O li tlameha ho ts'oara senotlolo sesebelisoa se sebetsoang ho sona.

Na sena se bolela hore opereishene write() ke atomic? Ho ea ka pono ea tekheniki, e. Ts'ebetso ea ho bala data e tlameha ho khutlisa kaofela kapa ho se be le e 'ngoe ea se ngotsoeng ka write(). Empa opereishene write(), ho latela molao-motheo, ha ho hlokahale hore e qetelle ka ho ngola ntho e ’ngoe le e ’ngoe eo e neng e kōptjoa hore e e ngole. O lumelloa ho ngola karolo feela ea data. Ka mohlala, re ka 'na ra ba le likhoele tse peli e' ngoe le e 'ngoe e kopanyang li-byte tse 1024 ho faele e hlalositsoeng ke tlhaloso e tšoanang ea faele. Ho ea ka pono ea maemo, sephetho se amohelehang e tla ba ha ts'ebetso e 'ngoe le e' ngoe ea ho ngola e ka kenyelletsa li-byte e le 'ngoe feela faeleng. Ts'ebetso ena e tla lula e le athomo, empa ka mor'a hore e phethoe, lintlha tseo ba li ngotseng faeleng li tla kopanngoa. mona puisano e khahlisang haholo mabapi le sehlooho sena mabapi le Stack Overflow.

fsync () le fdatasync () mesebetsi

Mokhoa o bonolo ka ho fetisisa oa ho fetisetsa data ho disk ke ho letsetsa ts'ebetso fsync (). Ts'ebetso ena e kopa sistimi hore e tlose li-blocks tsohle tse fetotsoeng ho tloha ho cache ho ea ho disk. Sena se kenyelletsa metadata eohle ea faele (nako ea phihlello, nako ea phetoho ea faele, joalo-joalo). Ke lumela hore metadata ena ha e hlokehe, kahoo haeba u tseba hore ha e bohlokoa ho uena, u ka sebelisa ts'ebetso. fdatasync(). The Thusa ka fdatasync() e re nakong ea ts'ebetso ea ts'ebetso ena, palo e joalo ea metadata e bolokiloe ho disk, e leng "e hlokahalang bakeng sa ts'ebetso e nepahetseng ea ts'ebetso e latelang ea ho bala data." 'Me sena ke sona seo likopo tse ngata li se tsotellang.

Bothata bo bong bo ka hlahang mona ke hore mekhoa ena ha e tiise hore faele e tla fumanoa ka mor'a ho hlōleha ho ka khonehang. Haholo-holo, ha u theha faele e ncha, u lokela ho letsetsa fsync() bakeng sa directory e nang le eona. Ho seng joalo, ka mor'a ho senyeha, ho ka 'na ha bonahala eka faele ena ha e eo. Lebaka la sena ke hore tlasa UNIX, ka lebaka la ts'ebeliso ea lihokelo tse thata, faele e ka ba teng ka har'a li-directory tse ngata. Ka hona, ha o bitsa fsync() Ha ho na mokhoa oa hore faele e tsebe hore na ke data efe ea directory e lokelang ho fetisetsoa ho disk (mona U ka bala haholoanyane ka sena). Ho bonahala eka sistimi ea faele ea ext4 e khona ho ka bohona sebedisa fsync() ho li-directory tse nang le lifaele tse tsamaellanang, empa sena se kanna sa se be joalo ka litsamaiso tse ling tsa lifaele.

Mokhoa ona o ka sebelisoa ka tsela e fapaneng lits'ebetsong tse fapaneng tsa faele. Ke sebelisitse blktrace ho ithuta ka hore na ke ts'ebetso efe ea disk e sebelisoang lits'ebetsong tsa faele tsa ext4 le XFS. Ka bobeli li fana ka litaelo tse tloaelehileng tsa ho ngola ho disk bakeng sa litaba tsa lifaele le koranta ea sistimi ea faele, hlakola cache ebe u tsoa ka ho etsa FUA (Force Unit Access, ho ngola data ka kotloloho ho disk, ho feta cache) ho ngolla koranta. Mohlomong ba etsa joalo e le ho netefatsa 'nete ea transaction. Ho li-drive tse sa tšehetseng FUA, sena se baka li-cache tse peli. Liteko tsa ka li bontšitse seo fdatasync() kapelenyana fsync(). Tšebeliso blktrace e bontša hore fdatasync() hangata o ngola data e nyane ho disk (ho ext4 fsync() e ngola 20 KB, le fdatasync() Lik'hilograma tse 16). Hape, ke fumane hore XFS e potlakile hanyane ho feta ext4. Mme mona ka thuso blktrace o atlehile ho fumana seo fdatasync() e hlakola data e nyane ho disk (4KiB ho XFS).

Maemo a sa hlakang ha o sebelisa fsync()

Ke nahana ka maemo a mararo a sa hlakang mabapi le fsync()seo ke se boneng ha ke sebetsa.

Ketsahalo ea pele e joalo e etsahetse ka 2008. Ka nako eo, sebopeho sa Firefox 3 se "hatsetsi" haeba palo e kholo ea lifaele e ne e ngolloa disk. Bothata e ne e le hore ts'ebetsong ea sebopeho se sebelisa database ea SQLite ho boloka tlhahisoleseding e mabapi le boemo ba eona. Ka mor'a phetoho e 'ngoe le e' ngoe e etsahetseng sebopeho, mosebetsi o ne o bitsoa fsync(), e faneng ka litiiso tse ntle tsa polokelo ea data e tsitsitseng. Sistimi ea faele ea ext3 e neng e sebelisoa ka nako eo, ts'ebetso fsync() Flushed ho disk maqephe ohle a "litšila" tsamaisong, eseng feela a neng a amana le faele e tsamaellanang. Sena se ne se bolela hore ho tobetsa konopo ho Firefox ho ka etsa hore megabyte ea data e ngoloe ho magnetic disk, e ka nkang metsotsoana e mengata. Tharollo ea bothata, ho ea kamoo ke utloisisang kateng e lintho tse bonahalang, e ne e le ho tsamaisa mosebetsi le database ho ea mesebetsing ea morao-rao e sa tšoaneng. Sena se bolela hore Firefox e ne e tloaetse ho kenya tšebetsong litlhoko tse thata tsa ho boloka polokelo ho feta kamoo ho neng ho hlokahala, 'me likarolo tsa sistimi ea ext3 li mpefalitse bothata bona.

Bothata ba bobeli bo etsahetse ka 2009. Joale, kamora ho putlama ha sistimi, basebelisi ba sistimi e ncha ea faele ea ext4 ba ile ba tobana le taba ea hore lifaele tse ngata tse sa tsoa etsoa li ne li na le bolelele ba zero, empa sena ha sea etsahala ka sistimi ea khale ea ext3. Serapeng se fetileng, ke buile ka hore na ext3 e phalletse data e ngata hakae ho disk, e ileng ea liehisa lintho haholo. fsync(). Ho ntlafatsa maemo, ext4 e hlakola feela maqephe a "tshila" a amanang le faele e itseng. Mme data ea lifaele tse ling e lula e le mohopolong nako e telele ho feta ka ext3. Sena se entsoe ho ntlafatsa ts'ebetso (ka ho sa feleng, data e lula sebakeng sena ka metsotsoana e 30, o ka hlophisa sena o sebelisa ditshila_expire_centisecs; mona u ka fumana lintlha tse ling mabapi le sena). Sena se bolela hore palo e kholo ea data e ka lahleha ka mokhoa o ke keng oa khutlisetsoa kamora ho oa. Tharollo ea bothata bona ke ho sebelisa fsync() lits'ebetsong tse hlokang ho netefatsa polokelo ea data e tsitsitseng le ho li sireletsa ka hohle kamoo ho ka khonehang ho tsoa litlamorao tsa ho hloleha. Mosebetsi fsync() e sebetsa hantle haholo ka ext4 ho feta ka ext3. Bothata ba mokhoa ona ke hore tšebeliso ea eona, joalo ka pele, e liehisa lits'ebetso tse ling, joalo ka ho kenya mananeo. Sheba lintlha tse mabapi le sena mona и mona.

Bothata ba boraro mabapi le fsync(), e qalile ka 2018. Joale, ka har'a moralo oa morero oa PostgreSQL, ho ile ha fumanoa hore haeba mosebetsi o fsync() e kopana le phoso, e tšoaea maqephe a "litšila" e le "hloekile". Ka lebaka leo, mehala e latelang fsync() Ha ba etse letho ka maqephe a joalo. Ka lebaka lena, maqephe a fetotsoeng a bolokiloe mohopolong 'me ha ho mohla a ngolloang ho disk. Ena ke koluoa ​​​​ea sebele, kaha kopo e tla nahana hore data e 'ngoe e ngotsoe ho disk, empa ha e le hantle e ke ke ea e-ba teng. Ho hloleha ho joalo fsync() li sa tloaelehang, kopo maemong a joalo e ka etsa hoo e batlang e se letho ho loantša bothata. Matsatsing ana, ha sena se etsahala, PostgreSQL le lits'ebetso tse ling lia senyeha. ke, sehloohong se reng "Na Likopo li ka Fumana ho Felloa ke Fsync?", Bothata bona bo hlahlojoa ka botlalo. Hajoale tharollo e molemohali ea bothata bona ke ho sebelisa Direct I/O le folakha O_SYNC kapa ka folakha O_DSYNC. Ka mokhoa ona, tsamaiso e tla tlaleha liphoso tse ka 'nang tsa etsahala ha ho etsoa ts'ebetso e itseng ea ho ngola lintlha, empa mokhoa ona o hloka hore kopo e laole li-buffers ka boeona. Bala haholoanyane ka eona mona и mona.

Ho bula lifaele ho sebelisa lifolakha tsa O_SYNC le O_DSYNC

Ha re khutleleng puisanong ea mekhoa ea Linux e fanang ka polokelo ea data e tsitsitseng. E leng, re bua ka ho sebelisa folakha O_SYNC kapa folakha O_DSYNC ha o bula lifaele o sebelisa mohala oa sistimi bula(). Ka mokhoa ona, ts'ebetso e 'ngoe le e' ngoe ea ho ngola data e etsoa joalokaha eka ka mor'a taelo e 'ngoe le e' ngoe write() tsamaiso e fuoa litaelo ho latela fsync() и fdatasync(). The Litlhaloso tsa POSIX sena se bitsoa "Pelo ea Botšepehi ba Faele ea I/O" le "Pheletso ea Botšepehi ba data". Molemo o ka sehloohong oa mokhoa ona ke hore mohala o le mong feela oa tsamaiso o lokela ho etsoa ho netefatsa botšepehi ba data, eseng tse peli (mohlala - write() и fdatasync()). Bothata bo ka sehloohong ba mokhoa ona ke hore mesebetsi eohle ea ho ngola e sebelisa tlhaloso ea faele e lumellanang e tla lumellana, e ka fokotsang bokhoni ba ho hlophisa khoutu ea kopo.

Ho sebelisa Direct I/O le folakha ea O_DIRECT

Mohala oa sistimi open() e tšehetsa folakha O_DIRECT, e etselitsoeng ho feta cache ea tsamaiso ea ts'ebetso, ho etsa ts'ebetso ea I / O, ho sebelisana ka ho toba le disk. Sena, maemong a mangata, se bolela hore litaelo tsa ho ngola tse fanoeng ke lenaneo li tla fetoleloa ka ho toba ho litaelo tse reretsoeng ho sebetsa le disk. Empa, ka kakaretso, mochine ona ha o nke sebaka sa mesebetsi fsync() kapa fdatasync(). 'Nete ke hore disk ka boeona e ka khona tieho kapa polokelo litaelo tse tsamaellanang tsa ho ngola data. 'Me, ho mpefatsa boemo, maemong a mang a khethehileng ts'ebetso ea I / O e etsoa ha ho sebelisoa folakha O_DIRECT, kgaso ts'ebetsong e tloaelehileng ea buffered. Tsela e bonolo ka ho fetisisa ea ho rarolla bothata bona ke ho sebelisa folakha ho bula lifaele O_DSYNC, e leng se tla bolela hore mosebetsi o mong le o mong oa ho ngola o tla lateloa ke mohala fdatasync().

Ho ile ha fumaneha hore sistimi ea XFS e sa tsoa eketsa "tsela e potlakileng" bakeng sa O_DIRECT|O_DSYNC- litlaleho tsa data. Haeba block e overwritten sebelisa O_DIRECT|O_DSYNC, ebe XFS, sebakeng sa ho hlakola cache, e tla phethahatsa taelo ea ho ngola ea FUA haeba sesebelisoa se e tšehetsa. Ke netefalitse sena ka ho sebelisa sesebelisoa blktrace ho sistimi ea Linux 5.4/Ubuntu 20.04. Mokhoa ona o lokela ho ba o sebetsang haholoanyane, kaha ha o sebelisoa, palo e fokolang ea data e ngotsoe ho disk mme ho sebelisoa ts'ebetso e le 'ngoe, ho e-na le tse peli (ho ngola le ho phunya cache). Ke fumane sehokelo ho patch 2018 kernel e sebelisang mochine ona. Ho na le puisano e mabapi le ho sebelisa ts'ebetso ena ho litsamaiso tse ling tsa lifaele, empa ho ea kamoo ke tsebang, XFS ke eona feela sistimi e e tšehetsang ho fihlela joale.

sync_file_range() tshebetso

Linux e na le mohala oa sistimi sync_file_range(), e leng se u lumellang hore u felise karolo feela ea faele ho disk, ho fapana le faele eohle. Mohala ona o qala ts'ebetso e sa ts'oaneng ea data mme ha e emele hore e phethehe. Empa setifikeiting sync_file_range() sehlopha ho thoe se "kotsi haholo". Ha e khothalletsoe ho e sebelisa. Likarolo le likotsi sync_file_range() e hlalositsoe hantle haholo sena thepa. Haholo-holo, mohala ona o bonahala o sebelisa RocksDB ho laola ha kernel e hula "litšila" data ho disk. Empa ka nako e ts'oanang moo, ho netefatsa polokelo ea data e tsitsitseng, e boetse e sebelisoa fdatasync(). The khoutu RocksDB e na le maikutlo a khahlisang mabapi le sehlooho sena. Ka mohlala, e shebahala joaloka mohala sync_file_range() ha o sebelisa ZFS ha e tsamaise data ho disk. Boiphihlelo bo mpolella hore khoutu e sa sebelisoeng hangata e ka ba le litšitšili. Ka hona, ke tla eletsa khahlanong le ho sebelisa mohala oa sistimi ntle le haeba ho hlokahala.

Mehala ea sistimi ho thusa ho netefatsa hore data e tšoarella

Ke fihletse qeto ea hore ho na le mekhoa e meraro e ka sebelisoang ho etsa ts'ebetso e tsitsitseng ea I / O. Kaofela ba hloka mohala oa ts'ebetso fsync() bakeng sa directory moo faele e entsoeng teng. Tsena ke mekhoa:

  1. Mohala oa tšebetso fdatasync() kapa fsync() ka mora mosebetsi write() (ho molemo ho e sebelisa fdatasync()).
  2. Ho sebetsa ka tlhaloso ea faele ho butsoe ka folakha O_DSYNC kapa O_SYNC (ho molemo - ka folakha O_DSYNC).
  3. Tšebeliso ea taelo pwritev2() e nang le folakha RWF_DSYNC kapa RWF_SYNC (haholo-holo ka folakha RWF_DSYNC).

Lintlha tsa Ts'ebetso

Ha kea ka ka lekanya ka hloko tšebetso ea mekhoa e fapaneng eo ke e batlileng. Phapano eo ke e hlokometseng ka lebelo la mosebetsi oa bona e nyane haholo. Sena se bolela hore nka fosa, le hore maemong a mang ntho e tšoanang e ka bontša liphello tse fapaneng. Ntlha ea pele, ke tla bua ka se amang ts'ebetso ho feta, ebe joale, ka se amang ts'ebetso e fokolang.

  1. Ho ngola lintlha tsa faele ho potlakile ho feta ho kenya data faeleng (phaello ea ts'ebetso e ka ba 2-100%). Ho hokela data faeleng ho hloka liphetoho tse ling ho metadata ea faele, le kamora mohala oa sistimi fallocate(), empa boholo ba phello ena bo ka fapana. Ke khothaletsa, bakeng sa ts'ebetso e ntle ka ho fetisisa, ho letsetsa fallocate() ho aba esale pele sebaka se hlokahalang. Ebe sebaka sena se tlameha ho tlatsoa ka ho hlaka ka zero ebe se bitsoa fsync(). Sena se tla etsa hore li-blocks tse tsamaisanang le sistimi ea faele li tšoauoa e le "allocated" ho fapana le "nallocated". Sena se fana ka ntlafatso e nyane (e ka bang 2%) ea ts'ebetso. Hape, li-disk tse ling li ka ba le ts'ebetso ea ho kena butle ea pele ho feta tse ling. Sena se bolela hore ho tlatsa sebaka ka zero ho ka lebisa ntlafatsong ea bohlokoa (e ka bang 100%). Haholo-holo, sena se ka etsahala ka li-disks. AWS EBS (ena ke data e seng molaong, ha kea khona ho e netefatsa). Ho joalo le ka polokelo. GCP Persistant Disk ('me sena se se se ntse se le tlhahisoleseding ea molao, e tiisitsoeng ke liteko). Litsebi tse ling li entse se tšoanang ho shebellae amanang le li-disk tse fapaneng.
  2. Mehala e fokolang ea sistimi, ts'ebetso e phahame haholo (kalo e ka bang 5%). E shebahala joalo ka mohala open() e nang le folakha O_DSYNC kapa letsa pwritev2() e nang le folakha RWF_SYNC pitso e potlakileng fdatasync(). Ke belaela hore taba e teng mona ke hore ka mokhoa ona, taba ea hore mehala e fokolang ea tsamaiso e tlameha ho etsoa ho rarolla mosebetsi o le mong (pitso e le 'ngoe sebakeng sa tse peli) e phetha karolo. Empa phapang ea ts'ebetso e nyane haholo, kahoo o ka e hlokomoloha habonolo mme o sebelisa ntho e itseng ts'ebetsong e sa lebiseng ho rarahanang ha mohopolo oa eona.

Haeba u thahasella sehlooho sa polokelo ea data e tsitsitseng, lisebelisoa tse ling tsa bohlokoa ke tsena:

  • Mekhoa ea ho fihlella ea I/O — kakaretso ea metheo ea mekhoa ea ho kenya / tlhahiso.
  • Etsa bonnete ba hore data e fihla ho disk - pale e mabapi le se etsahalang ho data tseleng ho tloha ho kopo ho disk.
  • Ke neng moo u lokelang ho fsync directory e nang le eona - karabo ea potso ea hore na e sebelisoa neng fsync() bakeng sa li-directory. Ka bokhutšoanyane, hoa fumaneha hore u hloka ho etsa sena ha u theha faele e ncha, 'me lebaka la khothatso ena ke hore ho Linux ho ka ba le litšupiso tse ngata tsa faele e tšoanang.
  • SQL Server ho Linux: FUA Internals - mona ke tlhaloso ea hore na polokelo ea data e phehellang e sebelisoa joang ho SQL Server sethaleng sa Linux. Ho na le lipapiso tse khahlisang lipakeng tsa mehala ea Windows le Linux mona. Ke na le bonnete ba hore e bile ka lebaka la boitsebiso bona boo ke ithutileng bona ka FUA optimization ea XFS.

Na u lahlehetsoe ke data eo u neng u nahana hore e bolokiloe ka mokhoa o sireletsehileng disk?

Bobolokelo ba Boitsebiso bo tšoarellang le li-API tsa Lifaele tsa Linux

Bobolokelo ba Boitsebiso bo tšoarellang le li-API tsa Lifaele tsa Linux

Source: www.habr.com