Rokiroki Raraunga Roa me nga API Kōnae Linux

I a au e rangahau ana mo te mau tonu o te rokiroki raraunga i roto i nga punaha kapua, i whakatau ahau ki te whakamatau i a au ano kia mohio kei te mohio ahau ki nga mea taketake. I i timata ma te panui i te tohu NVMe kia mohio ai koe he aha nga whakapumau mo te rokiroki raraunga toimau (ara, ka taurangi ka waatea nga raraunga i muri i te korenga o te punaha) ka tukuna mai e nga kōpae NMVe ki a matou. I mahia e au nga whakatau matua e whai ake nei: me whakaaro nga raraunga kua pakaru mai i te wa i tukuna ai te whakahau ki te tuhi raraunga tae noa ki te wa ka tuhia ki te waahi rokiroki. Heoi, ko te nuinga o nga papatono kei te harikoa ki te whakamahi waea punaha ki te tuhi raraunga.

I roto i tenei pou, ka tirotirohia e au nga tikanga rokiroki pumau e whakaratohia ana e nga API konae Linux. Te ahua nei me ngawari nga mea katoa i konei: ka karangahia e te papatono te whakahau write(), a ka mutu tenei whakahau, ka tiakina pai nga raraunga ki te kōpae. Engari write() ka kape anake i nga raraunga tono ki te keteroki kernel kei roto i te RAM. Kia kaha ai te punaha ki te tuhi raraunga ki te kōpae, me whakamahi etahi atu tikanga.

Rokiroki Raraunga Roa me nga API Kōnae Linux

I te katoa, he kohinga tuhipoka tenei rauemi e pa ana ki nga mea kua akohia e au mo tetahi kaupapa e pai ana ki ahau. Mena ka korero poto tatou mo te mea tino nui, ka puta ko te whakarite mo te rokiroki raraunga pumau me whakamahi koe i te whakahau fdatasync() whakatuwhera ranei i nga konae me te haki O_DSYNC. Mena kei te pirangi koe ki te ako atu mo nga mea ka pa ki nga raraunga mai i te waehere ki te kōpae, tirohia tenei tuhinga.

Nga ahuatanga o te whakamahi i te mahi tuhi().

Waea punaha write() kua tautuhia i roto i te paerewa IEEE POSIX hei ngana ki te tuhi raraunga ki tetahi kaiwhakaahua konae. I muri i te otinga angitu write() Ko nga mahi panui raraunga me whakahoki rite nga paita i tuhia i mua, me mahi tenei ahakoa ka uru mai nga raraunga mai i etahi atu tukanga, miro ranei (nana te waahanga whaitake o te paerewa POSIX). ko te reira, i roto i te waahanga mo te taunekeneke o nga miro ki nga mahi konae noa, he tuhipoka e kii ana mena e rua nga miro e karanga ana i enei mahi, katahi ka kite ia waea i nga hua katoa kua tohua o tera atu waea, kaore ranei. mau hopearaa. Ka puta tenei ki te whakatau ko nga mahinga I/O katoa me pupuri he raka ki runga i te rauemi e mahi ana ratou.

Ko te tikanga tenei ko te mahi write() he ngota? Mai i te tirohanga hangarau, ae. Ko nga mahi panui raraunga me whakahoki mai te katoa, te kore ranei o nga mea i tuhia me write(). Engari ko te mahi write(), e ai ki te paerewa, ehara i te mea me mutu ma te tuhi i nga mea katoa i tonoa kia tuhia. Ka whakaaetia ia ki te tuhi i tetahi waahanga o nga raraunga. Hei tauira, e rua pea nga miro hei taapiri i te 1024 paita ki tetahi konae e whakaahuatia ana e te kaiwhakaahua konae ano. Mai i te tirohanga o te paerewa, he hua pai ka taea e ia mahi tuhi te taapiri kotahi noa te paita ki te konae. Ko enei mahinga ka noho ngota, engari ka oti, ka uru nga raraunga i tuhia e ratou ki te konae. konei tino pai nga korero mo tenei kaupapa mo Stack Overflow.

fsync() me te fdatasync() mahi

Ko te huarahi ngawari ki te horoi i nga raraunga ki te kōpae ko te karanga i te mahi fsync(). Ka tono tenei mahi ki te punaha whakahaere ki te whakawhiti i nga poraka whakarereke katoa mai i te keteroki ki te kōpae. Kei roto i tenei ko nga metadata katoa o nga konae (waa uru, wa whakarereke konae, aha atu). E whakapono ana ahau he iti noa tenei metadata e hiahiatia ana, na, ki te mohio koe ehara i te mea nui ki a koe, ka taea e koe te whakamahi i te mahi fdatasync(). Ko te awhina i runga i fdatasync() E kiia ana i te wa e mahi ana tenei mahi, ka tiakina te nui o nga metadata ki te kōpae "e tika ana mo te mahi tika o nga mahi panui raraunga e whai ake nei." A koinei tonu te mea e aro nui ana te nuinga o nga tono.

Ko tetahi raruraru ka ara ake i konei ko te kore o enei tikanga e kii ka kitea te konae i muri i te rahua. Ina koa, ka hangaia he konae hou, me waea koe fsync() mo te whaiaronga kei roto. Ki te kore, i muri i te rahungatanga, ka puta pea karekau tenei konae. Ko te take mo tenei ko te UNIX, na te whakamahi i nga hononga pakeke, ka taea e te konae te noho ki roto i nga raarangi maha. Na reira, ka karanga fsync() karekau he huarahi mo te konae ki te mohio ko wai nga raraunga whaiaronga me pura ki te kōpae (konei Ka taea e koe te panui atu mo tenei). Ko te ahua kei te kaha te punaha konae ext4 aunoa ki te tono fsync() ki nga whaiaronga kei roto nga konae e rite ana, engari kaore pea tenei e pa ki etahi atu punaha konae.

He rereke te whakatinanatanga o tenei tikanga ki runga i nga punaha konae rereke. I whakamahia e ahau blktrace ki te ako mo nga mahi kōpae e whakamahia ana i roto i nga punaha konae ext4 me XFS. Ka tukuna e rua nga whakahau tuhi auau ki te kopae mo nga ihirangi o nga konae me te hautaka punaha konae, horoia te keteroki, ka puta ma te mahi i te FUA (Whakauru Waehe Whakahau, tuhi tika i nga raraunga ki te kopae, maataki i te keteroki) tuhia ki te hautaka. Ka mahia pea e ratou tenei hei whakapumau kua puta te tauwhitinga. I runga i nga puku karekau e tautoko ana i te FUA, e rua nga rerenga keteroki. I whakaatuhia e aku whakamatautau fdatasync() he iti ake te tere fsync(). Whakamahinga blktrace e tohu ana tera fdatasync() he iti ake nga raraunga ka tuhia ki te kōpae (i roto i te ext4 fsync() tuhi 20 KiB, a fdatasync() - 16 KiB). Ano, i kitea e ahau he tere ake te XFS i te ext4. Na konei me te awhina blktrace i kaha ki te kimi i tera fdatasync() he iti ake nga raraunga ki te kopae (4 KiB i te XFS).

Nga ahuatanga rangirua ka ara ake ina whakamahi ana i te fsync()

Ka taea e au te whakaaro mo nga ahuatanga rangirua e toru fsync()i tutaki ahau ki te mahi.

Ko te keehi tuatahi penei i te tau 2008. Katahi ka whakatio te atanga Firefox 3 mena he maha nga konae i tuhia ki te kōpae. Ko te raruraru ko te whakatinanatanga o te atanga i whakamahia he papaaarangi SQLite hei penapena korero mo tona ahuatanga. I muri i ia huringa i puta i te atanga, ka karangahia te mahi fsync(), i homai he taurangi pai mo te rokiroki raraunga pumau. I roto i te punaha konae ext3 ka whakamahia, ko te mahi fsync() i tukuna nga wharangi "paru" katoa o te punaha ki te kopae, kaua ko nga mea e pa ana ki te konae e pa ana. Ko te tikanga ko te panui i te paatene i Firefox ka taea te whakaputa megabytes o nga raraunga kia tuhia ki te kōpae autō, he maha nga hēkona. Ko te otinga o te raru, ki taku mohio mai reira Ko nga rauemi ko te whakawhiti mahi me te patengi raraunga ki nga mahi papamuri tukutahi. Ko te tikanga tenei i whakatinanahia e Firefox i mua ake nga whakaritenga rokiroki kaha atu i te mea e hiahiatia ana, a ko nga ahuatanga o te punaha konae ext3 i kaha ake tenei raru.

Ko te raruraru tuarua i puta i te tau 2009. Na, i muri i te tukinga o te punaha, ko nga kaiwhakamahi o te punaha konae ext4 hou i aro ki te meka he maha nga konae hou i hangaia he kore te roa, engari kaore tenei i pa ki te punaha konae ext3 tawhito. I te whiti o mua, i korero ahau mo te pewhea o te ext3 ki te whakaheke i nga raraunga ki te kōpae, na te mea i tino whakaheke haere. fsync(). Hei whakapai ake i te ahuatanga, i roto i te ext4 ko nga wharangi paru e whai paanga ana ki tetahi konae ka peia ki te kōpae. A ko nga raraunga mai i etahi atu konae kei te maumahara mo te wa roa atu i te ext3. I mahia tenei hei whakapai ake i te mahi (ma te taunoa, ka noho nga raraunga ki tenei ahua mo te 30 hēkona, ka taea e koe te whirihora i tenei ma te whakamahi dirty_expire_centisecs; konei Ka kitea e koe etahi atu rauemi mo tenei). Ko te tikanga ka ngaro te nui o nga raraunga i muri i te korenga. Ko te otinga ki tenei raru ko te whakamahi fsync() i roto i nga tono e hiahia ana ki te whakarite kia mau te rokiroki raraunga me te tiaki i a raatau mai i nga hua o nga rahunga. Mahi fsync() He pai ake te mahi ina whakamahi ext4 i te wa e whakamahi ana ext3. Ko te kino o tenei huarahi ko tana whakamahinga, pera i mua, ka whakaroa i te mahi o etahi mahi, penei i te whakauru i nga kaupapa. Tirohia nga korero mo tenei konei и konei.

Ko te raruraru tuatoru mo fsync(), i ahu mai i te tau 2018. Na, i roto i te anga o te kaupapa PostgreSQL, i kitea mena mena ko te mahi fsync() ka tutaki he hapa, ka tohuhia nga wharangi "paru" he "ma". Ko te mutunga, ko nga waea e whai ake nei fsync() Kaore ratou e mahi i tetahi mea ki nga wharangi penei. Na tenei, ka penapenahia nga wharangi kua whakarereketia ki roto i te mahara, kaore ano kia tuhia ki te kōpae. He tino kino tenei, na te mea ka whakaaro te tono ka tuhia etahi raraunga ki te kopae, engari karekau. Ko enei rahunga fsync() he onge, te tono i roto i nga ahuatanga penei kaore e taea te mahi ki te whawhai i te raru. I enei ra, ka pa ana tenei, ka pakaru te PostgreSQL me etahi atu tono. ko te reira, i roto i te rauemi "Ka taea e nga tono te whakaora mai i nga rahunga fsync?", ka tirotirohia tenei raru. I tenei wa ko te otinga pai mo tenei raru ko te whakamahi Direct I/O me te haki O_SYNC me te haki ranei O_DSYNC. Ma tenei huarahi, ka ripoatahia e te punaha nga hapa ka puta pea i te waa o nga mahi tuhi motuhake, engari ko tenei huarahi me tono te tono ki te whakahaere i nga parepare. Pānuihia atu mo tenei konei и konei.

Te whakatuwhera i nga konae ma te whakamahi i nga haki O_SYNC me O_DSYNC

Me hoki ano ki te korero mo nga tikanga Linux e whakarato ana i te rokiroki raraunga pumau. Ara, e korero ana matou mo te whakamahi i te haki O_SYNC haki ranei O_DSYNC i te wa e whakatuwhera ana i nga konae ma te whakamahi waea punaha tuwhera(). Ma tenei huarahi, ka mahia nga mahi tuhi raraunga me te mea i muri i ia whakahau write() ka hoatu nga whakahau ki te punaha fsync() и fdatasync(). Ko te Ko nga korero a POSIX ka kiia tenei ko "Tukutahi I/O Kōnae Whakaotinga Tikanga" me te "Whakaotinga Tikanga Raraunga". Ko te painga nui o tenei huarahi ko te whakarite kia pono nga raraunga, me mahi kotahi te waea punaha, kaua ki te rua (hei tauira - write() и fdatasync()). Ko te tino kino o tenei huarahi ko nga tuhi katoa ma te whakamahi i te whakaahuatanga konae e rite ana ka tukutahia, ka taea te whakaiti i te kaha ki te hanga i te waehere tono.

Te whakamahi i te I/O Direct me te haki O_DIRECT

Waea punaha open() tautoko haki O_DIRECT, he mea hoahoa ki te karo i te keteroki o te punaha whakahaere ki te mahi I/O ma te mahi tika me te kōpae. Ko tenei, i roto i te maha o nga keehi, ko te tikanga ko nga whakahau tuhi ka tukuna e te hotaka ka whakamaoritia tika ki nga whakahau e whai ana ki te mahi me te kōpae. Engari, i te nuinga, ehara tenei tikanga i te whakakapi mo nga mahi fsync() ranei fdatasync(). Ko te meka ka taea e te kōpae ake whakaroa, keteroki ranei whakahau tuhi raraunga e rite ana. A, ki te kino ake, i etahi keehi motuhake ka mahia nga mahi I/O i te wa e whakamahi ana i te haki O_DIRECT, haapurororaa ki roto i nga mahi tuku iho. Ko te huarahi ngawari ki te whakaoti i tenei raru ko te whakamahi i te haki hei whakatuwhera i nga konae O_DSYNC, ko te tikanga ko ia mahi tuhi ka whai i te waea fdatasync().

I puta mai ko te punaha konae XFS kua taapirihia he "ara tere" mo O_DIRECT|O_DSYNC- tuhi raraunga. Mena ka tuhia ano he poraka ma te whakamahi O_DIRECT|O_DSYNC, katahi ka mahia e XFS te whakahau tuhi FUA mena ka tautokohia e te taputapu. I manatoko ahau i tenei ma te whakamahi i te whaipainga blktrace i runga i te punaha Linux 5.4/Ubuntu 20.04. Me pai ake tenei huarahi, mai i te wa e whakamahia ana, he iti noa nga raraunga ka tuhia ki te kōpae me te whakamahi kotahi mahi, kaua ki te rua (tuhi me te horoi i te keteroki). I kitea e ahau he hononga ki paepae 2018 kernel, e whakatinana ana i tenei tikanga. He korero kei reira mo te tono i tenei arotautanga ki etahi atu punaha konae, engari ki taku mohio, ko XFS anake te punaha konae e tautoko ana i tenei waa.

sync_file_range() mahi

He waea punaha a Linux sync_file_range(), ka taea e koe te horoi i tetahi waahanga o te konae ki te kōpae, kaua ki te konae katoa. Ko tenei waea ka timata i te pupuhi raraunga tukutahi ka kore e tatari kia oti. Engari i roto i te tiwhikete sync_file_range() e kiia ana he "tino kino" te kapa. Kaore i te tūtohutia kia whakamahia. Ngā āhuatanga me ngā mōrearea sync_file_range() tino pai te whakaahuatanga i roto tenei rauemi. Ko te ahua o tenei waea ka whakamahi i a RocksDB hei whakahaere i te wa e taia ana e te kernel nga raraunga paru ki te kōpae. Engari i te wa ano, ki te whakarite i te rokiroki raraunga pumau, ka whakamahia ano hoki fdatasync(). Ko te waehere Kei a RocksDB etahi korero pai mo tenei kaupapa. Hei tauira, ka puta ko te karanga sync_file_range() I te wa e whakamahi ana i te ZFS, kaore e pupuhi nga raraunga ki te kōpae. Ko nga wheako e kii mai ana ko te waehere kaore e whakamahia ana he ngarara kei roto. Na reira, ka tohutohu ahau kia kaua e whakamahi i tenei waea punaha mena ka tino tika.

Ko nga waea a te punaha ka awhina i te mau tonu o nga raraunga

Kua tae mai ahau ki te whakatau e toru nga huarahi ka taea te whakamahi ki te whakahaere i nga mahi I/O hei whakarite kia mau tonu nga raraunga. Ka hiahiatia e ratou katoa he waea mahi fsync() mo te whaiaronga i hangaia ai te konae. Ko enei nga huarahi:

  1. Te karanga i tetahi mahi fdatasync() ranei fsync() i muri i te mahi write() (he pai ake te whakamahi fdatasync()).
  2. Ko te mahi me tetahi kaiwhakaahua konae ka whakatuwherahia me te haki O_DSYNC ranei O_SYNC (he pai ake - me te haki O_DSYNC).
  3. Te whakamahi i te whakahau pwritev2() me te haki RWF_DSYNC ranei RWF_SYNC (he pai ake me te haki RWF_DSYNC).

Nga Panui Mahi

Kare ano au i ata ine i nga mahi o nga momo tikanga kua tirohia e au. Ko nga rereketanga i kite ahau i te tere o a raatau mahi he iti rawa. Ko te tikanga kei te he ahau, a, i raro i nga ahuatanga rereke ka puta nga hua rereke. Tuatahi, ka korero ahau mo nga mea e pa ana ki nga mahi, katahi ka iti ake te pa ki nga mahi.

  1. He tere ake te tuhi i nga raraunga konae i te taapiri i nga raraunga ki tetahi konae (ko te painga o te mahinga ko te 2-100%). Ko te taapiri i nga raraunga ki tetahi konae me whakarereke atu ki nga metadata o te konae, ahakoa i muri i te waeatanga punaha fallocate(), engari ka rereke pea te nui o tenei paanga. Ka tūtohu ahau, mo te mahi pai, me waea atu fallocate() ki te toha i mua i te waahi e hiahiatia ana. Na me tino whakakiia tenei mokowā ki te kore ka karangahia fsync(). Ma tenei ka whakarite ko nga poraka e rite ana i roto i te punaha konae ka tohua "kua tohatohahia" kaore i "kaore i tohatohahia". He iti (mo te 2%) te whakapai ake i nga mahi. I tua atu, he puhoi ake pea te uru tuatahi ki tetahi paraka i etahi atu. Ko te tikanga ko te whakakii i te waahi ki te kore ka taea te nui (mo te 100%) te whakapai ake i te mahi. Ina koa, ka pa tenei ki nga kopae AWS EBS (he raraunga kore mana tenei, kaore i taea e au te whakaū). He pera ano mo te rokiroki Kopae Tonu GCP (a he korero mana tenei, kua whakapumautia e nga whakamatautau). Kua pera ano etahi atu tohunga tirohanga, e pa ana ki nga momo kōpae.
  2. Ko te iti ake o nga waea a te punaha, ka nui ake te mahi (ko te whiwhinga ka tata ki te 5%). He wero te ahua open() me te haki O_DSYNC waea ranei pwritev2() me te haki RWF_SYNC tere ake i te waea fdatasync(). Ki taku whakaaro ko te take i konei ko te whai waahi o tenei huarahi i te mea he iti ake nga waea punaha hei whakaoti i te raru kotahi (kotahi waea kaua e rua). Engari he iti rawa te rereketanga o nga mahi, na reira ka taea e koe te warewarehia me te whakamahi i tetahi mea i roto i te tono e kore e whakararu i tana arorau.

Mena kei te pirangi koe ki te kaupapa mo te rokiroki raraunga taumau, koinei etahi rauemi whai hua:

  • Tikanga Uru I/O — he tirohanga whanui mo nga tikanga o te whakaurunga/whakaputa.
  • Te whakarite kia tae te raraunga ki te kōpae — he korero mo nga mea ka pa ki nga raraunga i te huarahi mai i te tono ki te kōpae.
  • Ahea koe e tukutahi ai i te whaiaronga kei roto - te whakautu ki te patai mo te wa e whakamahia ai fsync() mo nga whaiaronga. Hei whakamaarama i tenei, ka puta mai me mahi koe i te wa e hanga ana i tetahi konae hou, a ko te take o tenei taunakitanga ko te mea i roto i te Linux he maha nga tohutoro mo te konae kotahi.
  • SQL Server i runga i te Linux: FUA Internals — Anei he whakamaarama me pehea te whakatinanatanga o te rokiroki raraunga i roto i te SQL Server i runga i te papaaho Linux. He whakataurite pai i waenga i nga waea punaha Windows me Linux i konei. Kei te tino mohio ahau na tenei rauemi i ako ahau mo te FUA arotautanga o XFS.

Kua ngaro koe i nga raraunga i whakaaro koe he mea rongoa i runga i te kōpae?

Rokiroki Raraunga Roa me nga API Kōnae Linux

Rokiroki Raraunga Roa me nga API Kōnae Linux

Source: will.com