Teuina o Fa'amatalaga Tumama ma Linux File APIs

O aʻu, suʻesuʻeina le mautu o le teuina o faʻamaumauga i faiga o ao, na ou filifili e faʻataʻitaʻi aʻu lava, ia mautinoa ou te malamalama i mea masani. I amata i le faitauina o le NVMe spec ina ia malamalama po o le a le faʻamaoniga e uiga i faʻamaumauga tumau (o lona uiga, faʻamautinoa o le a maua faʻamatalaga pe a maeʻa le faaletonu o le polokalama) tuʻuina mai ia i matou tisiki NMVe. Na ou faia faʻaiuga autu nei: e tatau ona e mafaufau i faʻamaumauga ua faʻaleagaina mai le taimi na tuʻuina atu ai le faʻatonuga tusitusi faʻamaumauga, ma seʻia oʻo i le taimi e tusi ai i le mea e teu ai. Ae ui i lea, i le tele o polokalame, telefoni feaveaʻi e faʻaoga saogalemu e tusi ai faʻamatalaga.

I totonu o lenei tusiga, ou te suʻesuʻeina le faʻaogaina o masini e saunia e le Linux faila APIs. E foliga mai e tatau ona faigofie mea uma iinei: o le polokalama e taʻua le poloaiga write(), ma a maeʻa le faʻatinoga o lenei faʻatonuga, o faʻamatalaga o le a teuina ma le saogalemu i luga o le disk. Ae write() na'o le kopiina o fa'amatalaga talosaga i le kernel cache o lo'o i totonu o le RAM. Ina ia faʻamalosia le faiga e tusi faʻamaumauga i le tisiki, e tatau ona faʻaogaina nisi auala faʻaopoopo.

Teuina o Fa'amatalaga Tumama ma Linux File APIs

I le aotelega, o lenei mea o se tuufaatasiga o faʻamatalaga e fesoʻotaʻi ma mea na ou aʻoaʻoina i se autu e fiafia ia te aʻu. Afai tatou te talanoa puʻupuʻu e uiga i le mea e sili ona taua, e foliga mai o le faʻatulagaina o le teuina o faʻamaumauga gafataulimaina e te manaʻomia le faʻaogaina o le poloaiga. fdatasync() pe tatala faila i le fu'a O_DSYNC. Afai e te fiafia e aʻoaʻo atili e uiga i mea e tupu i faʻamatalaga i luga o le auala mai le code i le disk, vaʻai i lenei tala.

Vaega o le faʻaaogaina o le galuega write().

System telefoni write() fa'amatalaina i le tulaga fa'ata'atia IEEE POSIX o se taumafaiga e tusi faʻamatalaga i se faila faila. A mae'a manuia galuega write() fa'amaumauga faitau fa'agaioiga e tatau ona toe fa'afo'i sa'o le bytes na tusia muamua, faia e tusa lava pe maua fa'amaumauga mai isi faiga po'o filo (faauta vaega tutusa o le tulaga POSIX). o, i le vaega i luga o le auala e fegalegaleai ai filo ma faʻagaioiga faila masani, o loʻo i ai se faʻamatalaga e fai mai afai e lua filo e taʻu taʻitasi nei galuega, e tatau ona vaʻaia e le telefoni iʻuga uma o le isi valaau, pe leai. taunuuga. O lenei mea e taʻitaʻia ai le faʻaiuga o faila I/O uma e tatau ona taofi se loka i luga o le punaoa o loʻo latou faʻaogaina.

O lona uiga o le taotoga write() e atomic? Mai se vaaiga faʻapitoa, ioe. O fa'agaioiga faitau fa'amaumauga e tatau ona toe fa'afo'i uma pe leai se mea na tusia ai write(). Ae o le taotoga write(), e tusa ai ma le tulaga, e le tatau ona muta, ina ua uma ona tusia mea uma na talosagaina o ia e tusi i lalo. E fa'atagaina ona tusia na'o se vaega o fa'amaumauga. Mo se faʻataʻitaʻiga, atonu e lua a tatou vaitafe e faʻapipiʻi 1024 paita i se faila e faʻamatalaina e le faila faila e tasi. Mai le vaaiga o le tulaga masani, o le taunuuga o le a taliaina pe a mafai e galuega tusitusi taitasi ona faʻapipiʻi naʻo le tasi byte i le faila. O nei gaioiga o le a tumau atomic, ae a maeʻa, o faʻamaumauga latou te tusia i le faila o le a faʻafefiloi. iinei manaia tele talanoaga i luga o lenei autu i luga o le Stack Overflow.

fsync() ma fdatasync() galuega

O le auala pito sili ona faigofie e faʻafefe ai faʻamatalaga i le disk o le valaʻau lea o le galuega fsync(). O lenei galuega e talosagaina le faiga faʻaogaina e faʻanofo uma poloka faʻaleleia mai le cache i le disk. E aofia ai metadata uma o le faila (taimi avanoa, taimi e sui ai faila, ma isi). Ou te talitonu e seasea manaʻomia lenei metadata, o lea afai e te iloa e le taua ia te oe, e mafai ona e faʻaogaina le galuega fdatasync(). le fesoasoani i fdatasync() o loʻo faʻapea mai i le taimi o le faʻatinoga o lenei galuega, o se aofaʻi o metadata o loʻo faʻasaoina i le tisiki, lea e "manaʻomia mo le faʻatinoina saʻo o faʻamatalaga faitau faʻamatalaga nei." Ma o le mea tonu lava lea e popole i ai le tele o talosaga.

O le tasi faʻafitauli e mafai ona tulaʻi mai iinei o nei faiga e le faʻamautinoa ai e mafai ona maua le faila pe a maeʻa se faaletonu. Aemaise lava, pe a faia se faila fou, e tatau ona valaʻau se tasi fsync() mo le lisi o loo i ai. A leai, pe a maeʻa se faʻalavelave, e ono foliga mai e le o iai lenei faila. O le mafuaʻaga o lenei mea i lalo ole UNIX, ona o le faʻaogaina o fesoʻotaʻiga faigata, e mafai ona iai se faila i le tele o faʻamaumauga. O le mea lea, pe a valaʻau fsync() e leai se auala mo se faila e iloa ai po o fea faʻamaumauga faʻamaumauga e tatau foi ona faʻafefe i le disk (iinei e mafai ona e faitau atili e uiga i lenei mea). E foliga mai e mafai e le faila faila ext4 otometi faʻaaoga fsync() i fa'atonuga o lo'o i ai faila e fetaui, ae atonu e le o le tulaga lea i isi faiga faila.

O lenei masini e mafai ona faʻatinoina eseese i faila faila eseese. Sa ou faaaogaina blktrace e a'oa'o po'o a fa'agaioiga tisiki o lo'o fa'aogaina i le ext4 ma le XFS file system. E tuʻuina atu uma e lua le faʻatonuga tusitusi masani i le tisiki mo mea uma o faila ma le faila faila, faʻamalo le cache ma alu ese e ala i le faia o se FUA (Force Unit Access, tusia saʻo faʻamatalaga i le tisiki, alo ese le cache) tusi i le api talaaga. Atonu latou te faia lena mea ina ia faʻamaonia ai le mea moni o le fefaʻatauaiga. I ta'avale e le lagolagoina le FUA, o le mea lea e mafua ai le lua fa'afefe. O aʻu suʻesuʻega na faʻaalia ai lena mea fdatasync() fai sina vave fsync(). Fa'aoga blktrace faailoa mai lena fdatasync() e masani ona tusia ni faʻamatalaga itiiti i le disk (i le ext4 fsync() tusia 20 KiB, ma fdatasync() - 16 KiB). E le gata i lea, na ou iloa o le XFS e sili atu le vave nai lo ext4. Ma iinei ma le fesoasoani blktrace na mafai ona iloa lena mea fdatasync() fa'amama fa'aitiiti fa'amatalaga i le tisiki (4 KiB i le XFS).

Tulaga le mautonu pe a faʻaaoga fsync()

E mafai ona ou mafaufau i ni tulaga le mautonu se tolu e uiga i fsync()lea ua ou maua i le faatinoga.

O le mea muamua na tupu i le 2008. I lena taimi, o le Firefox 3 faʻafesoʻotaʻi "malosi" pe a fai o se numera tele o faila o loʻo tusia i le disk. O le faʻafitauli o le faʻatinoina o le atinaʻe na faʻaaogaina ai se database SQLite e teu ai faʻamatalaga e uiga i lona setete. A maeʻa suiga taʻitasi na tupu i totonu o le atinaʻe, na valaʻau le galuega fsync(), lea na maua ai fa'amautinoaga lelei o le teuina o fa'amaumauga mautu. I le faʻaogaina o le ext3 file system, o le galuega fsync() fa'amulumulu i le ti'eti'e uma itulau "palapala" i totonu o le faiga, ae le na'o i latou e feso'ota'i ma le faila tutusa. O lona uiga o le kilikiina o se ki i Firefox e mafai ona mafua ai le megabytes o faʻamaumauga e tusia i se tisiki maneta, lea e ono alu ai le tele o sekone. O le fofo o le faafitauli, e pei ona ou malamalama i ai na mea, o le faʻanofoina lea o le galuega ma le faʻamaumauga i galuega faʻasolosolo faʻatasi. O lona uiga na faʻaaogaina e Firefox le faʻaogaina o manaʻoga tumau e teu ai nai lo le mea na manaʻomia, ma o le ext3 filesystem na faʻateleina ai lenei faʻafitauli.

O le faafitauli lona lua na tupu i le 2009. Ma, ina ua maeʻa se faʻalavelave faʻafuaseʻi, na maua e tagata faʻaoga o le ext4 faila faila o le tele o faila fou na faia e leai se umi, ae e leʻi tupu i le faila faila ext3 tuai. I le parakalafa muamua, na ou talanoa ai pe faʻafefea ona lafoaʻi e ext3 le tele o faʻamaumauga i luga o le disk, lea na faʻagesegese ai mea i lalo. fsync(). Ina ia faʻaleleia le tulaga, ext4 faʻafefe naʻo na itulau "palapala" e talafeagai i se faila patino. Ma o faʻamatalaga o isi faila e tumau pea i le mafaufau mo se taimi umi atu nai lo le ext3. Na faia lenei mea e faʻaleleia ai le faʻatinoga (e ala i le le mafai, o faʻamaumauga e tumau i lenei setete mo le 30 sekone, e mafai ona e faʻaogaina lenei faʻaoga dirty_expire_centisecs; iinei e mafai ona e mauaina nisi faʻamatalaga i lenei mea). O lona uiga o se aofaiga tele o faʻamaumauga e mafai ona le toe maua mai pe a uma se faʻalavelave. O le fofo i lenei faʻafitauli o le faʻaaogaina fsync() i talosaga e manaʻomia le tuʻuina atu o faʻamaumauga mautu ma puipuia i latou i le tele e mafai ai mai taunuuga o le toilalo. Galuega fsync() e sili atu ona lelei le galue i le ext4 nai lo le ext3. O le le lelei o lenei auala o lona faʻaaogaina, e pei ona i ai muamua, faʻagesegese nisi gaioiga, e pei o le faʻapipiʻiina o polokalame. Va'ai fa'amatalaga i lenei mea iinei и iinei.

O le faafitauli lona tolu e faatatau i fsync(), na afua mai i le 2018. Ona, i totonu o le faʻavae o le PostgreSQL poloketi, na maua ai pe afai o le galuega fsync() e fetaiai ma se mea sese, e faailoga itulau "palapala" o le "mama". O le i'uga, ua vala'au mai nei fsync() leai se mea e fai i itulau faapena. Ona o lenei mea, o itulau ua suia e teuina i le manatua ma e le tusia i le disk. O se faʻalavelave moni lea, aua o le talosaga o le a manatu o nisi faʻamatalaga o loʻo tusia i le disk, ae o le mea moni o le a le. O ia faaletonu fsync() e seasea, o le faʻaaogaina i ia tulaga e toetoe lava a leai se mea e faʻafefe ai le faʻafitauli. O nei aso, pe a tupu lenei mea, PostgreSQL ma isi talosaga e paʻu. o, i le tusiga "E mafai ona toe maua mai talosaga mai fsync Failures?", O lenei faʻafitauli o loʻo suʻesuʻeina auiliili. Ole taimi nei ole fofo sili ile fa'afitauli ole fa'aoga Direct I/O ile fu'a O_SYNC po o le fu'a O_DSYNC. Faatasi ai ma lenei faiga, o le a lipotia e le polokalama ni mea sese e ono tupu i le taimi o galuega tusitusi patino, ae o lenei auala e manaʻomia ai le talosaga e pulea ai le paʻu lava ia. Faitau atili e uiga i lenei mea iinei и iinei.

Tatala faila e fa'aaoga ai fu'a O_SYNC ma O_DSYNC

Sei o tatou toe foʻi i le talanoaga o faiga Linux e maua ai faʻamaumauga tumau. O lona uiga, o loʻo tatou talanoa e uiga i le faʻaaogaina o le fuʻa O_SYNC po o le fu'a O_DSYNC pe a tatalaina faila e faʻaaoga ai le system call tatala(). Faatasi ai ma lenei auala, o faʻamaumauga tusitusia taʻitasi e faia e pei o le maeʻa o poloaiga taʻitasi write() o le faiga ua tuuina atu, faasologa, poloaiga fsync() и fdatasync(). le POSIX faʻamatalaga ua ta'ua lea o le "Fa'amae'aina o le Fa'atonu I/O faila" ma le fa'amae'aina o fa'amaumauga. O le aoga autu o lenei faiga e na o le tasi le telefoni e manaʻomia ona faʻatinoina e faʻamautinoa ai le faʻamaoni o faʻamaumauga, ae le o le lua (mo se faʻataʻitaʻiga - write() и fdatasync()). O le faʻaletonu autu o lenei faiga o le a faʻapipiʻiina uma tusitusiga e faʻaaoga ai le faila faila, lea e mafai ona faʻatapulaʻaina le mafai ona faʻatulagaina le code talosaga.

Fa'aaogā le I/O sa'o ma le fu'a O_DIRECT

System telefoni open() lagolago fu'a O_DIRECT, lea ua mamanuina e faʻafefe ai le faʻaogaina o le cache system, faʻatino galuega I / O, fegalegaleai saʻo ma le disk. O lenei, i le tele o tulaga, o lona uiga o le tusi tusi na tuʻuina atu e le polokalame o le a faʻaliliu saʻo i poloaiga e faʻatatau i le galue ma le disk. Ae, i se tulaga lautele, o lenei masini e le o se sui mo galuega fsync() poʻo fdatasync(). O le mea moni e mafai e le disk lava ia tuai po'o le fa'aoga poloaiga talafeagai mo le tusiaina o fa'amaumauga. Ma, e sili atu le leaga, i nisi tulaga faʻapitoa, o le I / O gaioiga na faia pe a faʻaaogaina le fuʻa O_DIRECT, fa'asalalauga i fa'agaioiga fa'apolopolo masani. O le auala pito sili ona faigofie e foia ai lenei faʻafitauli o le faʻaaogaina lea o le fuʻa e tatala ai faila O_DSYNC, o lona uiga o galuega tusitusi taitasi o le a sosoo ma se valaau fdatasync().

Na aliali mai o le XFS filesystem talu ai nei na faʻaopoopoina se "ala vave" mo O_DIRECT|O_DSYNC-faʻamaumauga faʻamaumauga. Afai o le poloka o loʻo faʻaaogaina O_DIRECT|O_DSYNC, ona XFS, nai lo le fufuluina o le cache, o le a faʻatino le FUA tusitusi poloaiga pe a lagolagoina e le masini. Na ou faʻamaonia lenei mea e faʻaaoga ai le aoga blktrace luga ole Linux 5.4/Ubuntu 20.04 system. O lenei faiga e tatau ona sili atu ona lelei, talu ai e tusia le aofaʻi maualalo o faʻamaumauga i le tisiki ma faʻaoga tasi le gaioiga, ae le o le lua (tusi ma fufulu le cache). Na ou mauaina se sootaga i patch 2018 kernel o loʻo faʻaaogaina lenei masini. O loʻo i ai se talanoaga e uiga i le faʻaogaina o lenei faʻataʻitaʻiga i isi faila faila, ae e pei ona ou iloa, o le XFS e naʻo le pau lea o faila faila e lagolagoina i le taimi nei.

sync_file_range() galuega

O loʻo i ai i le Linux se telefoni faʻapitoa sync_file_range(), lea e mafai ai ona e fufuluina na o se vaega o le faila i le disk, ae le o le faila atoa. O lenei vala'au e amata ai se fa'amulumulu e le fa'atasi ma e le fa'atali se'i mae'a. Ae i le faasinomaga i sync_file_range() o lenei poloaiga ua fai mai e "matua matautia". E le fautuaina e faʻaaogaina. Vaega ma tulaga lamatia sync_file_range() faʻamatalaina lelei i totonu lenei meafaitino. Aemaise lava, o lenei valaau e foliga mai e faʻaaoga RocksDB e pulea ai pe a faʻafefe e le fatu faʻamaumauga "palapala" i le disk. Ae i le taimi lava e tasi iina, ina ia mautinoa le teuina o faamaumauga mautu, e faʻaaogaina foi fdatasync(). le numera RocksDB o loʻo iai ni faʻamatalaga manaia i lenei mataupu. Mo se faʻataʻitaʻiga, e foliga mai o le telefoni sync_file_range() pe a faʻaogaina le ZFS e le faʻafefeina faʻamatalaga i le disk. O le poto masani e taʻu mai ia te aʻu o code e seasea faʻaaogaina e ono iai ni faʻailoga. O le mea lea, ou te fautua atu e aua le faʻaogaina lenei telefoni seʻi vagana ua matua manaʻomia.

Fa'atonu telefoni e fesoasoani e fa'amautinoa le tumau o fa'amaumauga

Ua ou oʻo mai i le faaiuga e tolu auala e mafai ona faʻaogaina e faʻatino ai galuega faifai pea I/O. Latou te manaʻomia uma se telefoni faʻatino fsync() mo le lisi na faia ai le faila. O auala nei:

  1. Valaauga galuega fdatasync() poʻo fsync() ina ua uma galuega write() (sili atu le faʻaaogaina fdatasync()).
  2. O le galue ma se fa'amatalaga faila na tatalaina i se fu'a O_DSYNC poʻo O_SYNC (sili atu - ma se fuʻa O_DSYNC).
  3. Fa'aoga fa'atonu pwritev2() ma le fu'a RWF_DSYNC poʻo RWF_SYNC (sili atu ma se fuʻa RWF_DSYNC).

Fa'amatalaga Fa'atinoga

Ou te lei fuaina ma le faaeteete le faatinoga o faiga eseese na ou suesueina. O eseesega na ou matauina i le saoasaoa o la latou galuega e matua laiti lava. O lona uiga e mafai ona ou sese, ma i isi tulaga o le mea lava e tasi e mafai ona faʻaalia iʻuga eseese. Muamua, o le a ou talanoa e uiga i mea e aʻafia atili ai le faʻatinoga, ona sosoo ai lea, e uiga i mea e faʻaitiitia ai le faʻatinoga.

  1. O le fa'aliliuina o fa'amaumauga faila e sili atu le vave nai lo le fa'apipi'iina o fa'amaumauga i se faila (o le fa'atinoga e mafai ona 2-100%). O le fa'apipi'iina o fa'amaumauga i se faila e mana'omia ai suiga fa'aopoopo i metadata a le faila, tusa lava pe ua uma le telefoni fallocate(), ae o le tele o lenei aafiaga atonu e eseese. Ou te fautuaina, mo le faatinoga sili ona lelei, e valaau fallocate() e mua'i fa'asoa le avanoa e mana'omia. Ona tatau lea ona matua fa'atumuina lea avanoa i zeros ma vala'au fsync(). O lenei mea o le a mafua ai ona faʻailogaina poloka tutusa i le faila faila o le "faʻasoa" nai lo le "le faʻasoa". E maua ai se la'ititi (pe tusa ma le 2%) le fa'aleleia atili o galuega. E le gata i lea, o nisi tisiki e ono fa'agesegese le fa'aogaina o poloka muamua nai lo isi. O lona uiga o le faʻatumuina o le avanoa i zeros e mafai ona taʻitaʻia ai se faʻaleleia tele (tusa ma le 100%). Aemaise lava, e mafai ona tupu lenei mea i tisiki. AWS EBS (o faʻamatalaga le aloaia lea, e le mafai ona ou faʻamaonia). E faapena foi mo le teuina. GCP Pisinisi Tumau (ma o faʻamatalaga aloaʻia lea, faʻamaonia e suʻega). Ua faia foʻi faapena e isi tagata atamamai mata'itufeso'ota'i ma tisiki eseese.
  2. O le itiiti ifo o le telefoni feaveaʻi, o le maualuga o le faʻatinoga (o le maua e mafai ona tusa ma le 5%). E foliga mai o se valaau open() ma le fu'a O_DSYNC pe valaau pwritev2() ma le fu'a RWF_SYNC telefoni vave fdatasync(). Ou te masalo o le manatu iinei o le faʻatasi ai ma lenei faiga, o le mea moni o le itiiti ifo o le telefoni feaveaʻi e tatau ona faia e foia ai le galuega lava e tasi (tasi le telefoni nai lo le lua) e iai sona sao. Ae o le eseesega o le faatinoga e matua laʻititi lava, o lea e faigofie ai ona e le amanaiaina ma faʻaaoga se mea i totonu o le talosaga e le oʻo atu ai i le faʻalavelave o lona manatu.

Afai e te fiafia i le autu o le teuina o faʻamaumauga gafataulimaina, o nisi nei o mea aoga:

  • I/O Avanoa auala - o se faʻamatalaga lautele o faʻavae o faʻaoga / faʻaogaina masini.
  • Faʻamautinoa e oʻo atu faʻamatalaga i le disk - o se tala e uiga i le mea e tupu i faʻamatalaga i luga o le ala mai le talosaga i le disk.
  • O le a le taimi e tatau ai ona e fa'afetaui le lisi o lo'o iai - o le tali i le fesili o le taimi e talosaga ai fsync() mo directories. I se faapuupuuga, e foliga mai e tatau ona e faia lenei mea pe a fatuina se faila fou, ma o le mafuaʻaga o lenei fautuaga o le Linux e mafai ona tele faʻamatalaga i le faila lava e tasi.
  • SQL Server i luga ole Linux: FUA Internals - o se faʻamatalaga lea o le faʻaogaina o faʻamaumauga tumau i le SQL Server i luga o le Linux platform. O loʻo i ai ni faʻatusatusaga manaia i le va o Windows ma Linux system calls iinei. E toetoe lava a ou mautinoa o le faʻafetai i lenei mea na ou aʻoaʻoina e uiga i le FUA optimization o le XFS.

Na e leiloa fa'amatalaga na e manatu na teuina lelei i luga ole tisiki?

Teuina o Fa'amatalaga Tumama ma Linux File APIs

Teuina o Fa'amatalaga Tumama ma Linux File APIs

puna: www.habr.com