Fitehirizana angona maharitra sy Linux File API

Izaho, mikaroka ny fahamarinan'ny fitahirizana angon-drakitra amin'ny rafitra rahona, dia nanapa-kevitra ny hitsapa ny tenako, mba hahazoana antoka fa azoko ny zavatra fototra. aho nanomboka tamin'ny famakiana ny NVMe spec mba hahatakarana ny antoka momba ny faharetan'ny angon-drakitra (izany hoe miantoka fa ho azo ny angon-drakitra aorian'ny tsy fahombiazan'ny rafitra) dia omeo anay ny disks NMVe. Nanao ireto fehin-kevitra lehibe manaraka ireto aho: mila mandinika ny angon-drakitra simba ianao manomboka amin'ny fotoana nanomezana ny baiko fanoratana data, ary mandra-pahatongan'ny fotoana nanoratana azy ireo amin'ny fitaovana fitahirizana. Na izany aza, amin'ny ankamaroan'ny programa, ny antso an-tariby dia azo ampiasaina tsara hanoratana angona.

Ato amin'ity lahatsoratra ity dia mandinika ny mekanika maharitra omen'ny API rakitra Linux aho. Toa tokony ho tsotra ny zava-drehetra eto: miantso ny baiko ny programa write(), ary rehefa vita io baiko io dia ho voatahiry tsara ao anaty kapila ny angona. SAINGY write() ny angon-drakitra fampiharana ihany no mandika ny cache kernel hita ao amin'ny RAM. Mba hanerena ny rafitra hanoratra angona amin'ny kapila, dia tsy maintsy ampiasaina ny mekanika fanampiny sasany.

Fitehirizana angona maharitra sy Linux File API

Amin'ny ankapobeny, ity fitaovana ity dia andian-tsoratra mifandraika amin'ny zavatra nianarako momba ny lohahevitra mahaliana ahy. Raha miresaka fohy momba ny zava-dehibe indrindra isika, dia hita fa mba handaminana ny fitahirizana angon-drakitra maharitra dia mila mampiasa ny baiko ianao. fdatasync() na sokafy ny rakitra misy saina O_DSYNC. Raha liana amin'ny fianarana bebe kokoa momba ny zava-mitranga amin'ny angon-drakitra amin'ny lalana mankany amin'ny kaody mankany amin'ny kapila ianao dia jereo ny izany lahatsoratra.

Endri-javatra amin'ny fampiasana ny asa write().

System antso write() voafaritra ao amin'ny fenitra IEEE POSIX ho fanandramana hanoratra angona amin'ny mpamoritra rakitra. Rehefa vita soa aman-tsara ny asa write() Ny asa famakiana angon-drakitra dia tsy maintsy mamerina ny bytes izay nosoratana teo aloha, manao izany na dia miditra amin'ny dingana na kofehy hafa aza ny data (eto fizarana mifanaraka amin'ny fenitra POSIX). izany, ao amin'ny fizarana momba ny fifandraisan'ny kofehy miaraka amin'ny fampandehanana rakitra tsy tapaka, dia misy fanamarihana milaza fa raha misy kofehy roa samy miantso ireo fiasa ireo, ny antso tsirairay dia tsy maintsy mahita ny voka-dratsiny rehetra izay mitarika amin'ny fanatanterahana ny antso hafa, na tsia. tsy mahita vokany mihitsy. Izany dia mitarika amin'ny fanatsoahan-kevitra fa ny hetsika I/O rehetra dia tsy maintsy mitazona hidy amin'ny loharano miasa.

Midika ve izany fa ny fandidiana write() atomika ve? Raha ny lafiny teknika, eny. Ny asa famakiana angon-drakitra dia tsy maintsy mamerina na ny rehetra na tsy misy amin'izay nosoratana write(). Fa ny fandidiana write(), araka ny fenitra, dia tsy voatery hifarana, rehefa nanoratra izay rehetra nasaina nosoratany. Azo atao ny manoratra ampahany amin'ny angona. Ohatra, mety manana renirano roa isika tsirairay ampiana 1024 bytes amin'ny rakitra iray voafaritry ny mpamoritra rakitra iray ihany. Avy amin'ny fomba fijerin'ny fenitra, ny vokatra dia azo ekena rehefa ny asa fanoratana tsirairay dia tsy afaka mampiditra afa-tsy byte iray amin'ny rakitra. Hijanona ho atomika ireo asa ireo, fa rehefa vita izy ireo, dia hikorontana ny angon-drakitra soratany amin'ny rakitra. eto adihevitra tena mahaliana momba ity lohahevitra ity amin'ny Stack Overflow.

fsync() sy fdatasync().

Ny fomba tsotra indrindra hanesorana ny angona amin'ny kapila dia ny fiantsoana ny fiasa fsync(). Ity asa ity dia mangataka ny rafitra miasa mba hamindra ny sakana rehetra novaina avy amin'ny cache mankany amin'ny kapila. Anisan'izany ny metadata rehetra amin'ny rakitra (fotoana fidirana, fotoana fanovana rakitra, sns). Mino aho fa zara raha ilaina io metadata io, ka raha fantatrao fa tsy zava-dehibe aminao izany, dia azonao ampiasaina ilay fiasa fdatasync(). The Vonjeo amin'ny fdatasync() Milaza izy io fa mandritra ny fampandehanana an'io fiasa io dia voatahiry ao anaty kapila ny metadata toy izany, izay "ilaina amin'ny fanatanterahana tsara ny asa famakiana angon-drakitra manaraka." Ary izany indrindra no karakarain'ny ankamaroan'ny fampiharana.

Ny olana iray mety hipoitra eto dia ny tsy fisian'ireo mekanika ireo fa ho hita ny rakitra aorian'ny mety ho tsy fahombiazana. Indrindra indrindra, rehefa misy rakitra vaovao noforonina, dia tokony hiantso fsync() ho an'ny lahatahiry misy azy. Raha tsy izany, aorian'ny fianjerana dia mety ho hita fa tsy misy io rakitra io. Ny anton'izany dia eo ambanin'ny UNIX, noho ny fampiasana rohy mafy, misy rakitra iray mety misy amin'ny lahatahiry maro. Noho izany, rehefa miantso fsync() Tsy misy fomba ahafantaran'ny rakitra iray hoe iza amin'ireo angona lahatahiry no tokony hosorina amin'ny kapila (eto afaka mamaky bebe kokoa momba izany ianao). Toa ny ext4 filesystem dia mahavita azy ho azy to apply fsync() mankany amin'ny lahatahiry misy ireo rakitra mifanaraka amin'izany, saingy mety tsy izany no mitranga amin'ny rafi-drakitra hafa.

Ity mekanika ity dia azo ampiharina amin'ny fomba hafa amin'ny rafi-drakitra samihafa. nampiasako blktrace mba hianarana momba ny fiasan'ny kapila ampiasaina amin'ny rafitra rakitra ext4 sy XFS. Samy mamoaka ny baiko fanoratana mahazatra amin'ny kapila ho an'ny votoatin'ny rakitra sy ny diarin'ny rafi-drakitra, esory ny cache ary mivoaka amin'ny alΓ lan'ny fanaovana FUA (Force Unit Access, manoratra mivantana amin'ny kapila, miala ny cache) manoratra amin'ny diary. Azo inoana fa manao izany izy ireo mba hanamafisana ny zava-misy amin'ny fifanakalozana. Amin'ny kapila tsy mahazaka FUA, izany no mahatonga ny cache roa. Ny fanandramana nataoko dia naneho izany fdatasync() somary haingana kokoa fsync(). Utility blktrace milaza izany fdatasync() matetika manoratra data kely kokoa amin'ny kapila (amin'ny ext4 fsync() manoratra 20 KiB, ary fdatasync() - 16 KiB). Ary koa, hitako fa XFS dia somary haingana kokoa noho ny ext4. Ary eto miaraka amin'ny fanampiana blktrace afaka nahalala izany fdatasync() dia mamoaka angona kely kokoa amin'ny kapila (4 KiB amin'ny XFS).

Toe-javatra tsy mazava rehefa mampiasa fsync()

Afaka mieritreritra toe-javatra telo tsy mazava momba izany aho fsync()izay hitako tamin'ny fampiharana.

Tamin'ny taona 2008 no nitrangan'izany voalohany. Tamin'izany fotoana izany, ny interface tsara Firefox 3 dia "mivaingana" raha misy rakitra marobe nosoratana tamin'ny kapila. Ny olana dia ny fampiharana ny interface dia nampiasa angon-drakitra SQLite hitahiry vaovao momba ny toerany. Taorian'ny fanovana tsirairay nitranga tao amin'ny interface, dia nantsoina ny fiasa fsync(), izay nanome antoka tsara ny fitahirizana angon-drakitra marin-toerana. Ao amin'ny rafitra fichier ext3 ampiasaina avy eo, ny asa fsync() nesorina tamin'ny kapila ny pejy "maloto" rehetra ao amin'ny rafitra, fa tsy ireo izay mifandray amin'ny rakitra mifanaraka amin'izany ihany. Midika izany fa ny fipihana bokotra iray ao amin'ny Firefox dia mety hahatonga ny angona megabytes hosoratana amin'ny kapila magnetika, izay mety haharitra segondra maro. Ny vahaolana amin'ny olana, raha ny fahazoako azy izany fitaovana, dia ny hamindra ny asa miaraka amin'ny angon-drakitra ho amin'ny asa asynchronous background. Midika izany fa nampiasa ny Firefox nametraka fepetra fitahirizana henjana kokoa noho ny tena nilaina, ary ny endri-javatra ext3 filesystem dia vao mainka nampitombo ity olana ity.

Ny olana faharoa dia niseho tamin'ny taona 2009. Avy eo, taorian'ny fianjeran'ny rafitra, ireo mpampiasa ny rafitra fichier ext4 vaovao dia nahita fa maro ireo rakitra vao noforonina dia tsy lava, saingy tsy nitranga tamin'ny rafitra rakitra ext3 taloha izany. Tamin'ny fehintsoratra teo aloha dia niresaka momba ny fomba nanarian'ny ext3 angona be loatra tamin'ny kapila aho, izay nampihena be ny zavatra. fsync(). Mba hanatsara ny toe-javatra, ny ext4 dia tsy manala afa-tsy ireo pejy "maloto" izay mifandraika amin'ny rakitra iray. Ary ny angon-drakitra amin'ny rakitra hafa dia mijanona ao anaty fitadidiana mandritra ny fotoana lava kokoa noho ny amin'ny ext3. Natao izany mba hanatsarana ny fampisehoana (amin'ny alΓ lan'ny default, mijanona ao amin'io fanjakana io mandritra ny 30 segondra ny angon-drakitra, azonao atao ny manitsy izany dirty_expire_centisecs; eto afaka mahita fampahalalana bebe kokoa momba izany ianao). Midika izany fa be dia be ny angon-drakitra mety ho very irretrievably aorian'ny fianjerana. Ny vahaolana amin'ity olana ity dia ny fampiasana fsync() amin'ny fampiharana izay mila manome fitahirizana angon-drakitra marin-toerana ary miaro azy ireo araka izay azo atao amin'ny vokatry ny tsy fahombiazana. asa fsync() miasa mahomby kokoa amin'ny ext4 noho ny amin'ny ext3. Ny tsy fahampian'io fomba fiasa io dia ny fampiasana azy, toy ny teo aloha, dia mampihena ny asa sasany, toy ny fametrahana programa. Jereo ny antsipiriany momba izany eto ΠΈ eto.

Ny olana fahatelo momba ny fsync(), nivoaka tamin'ny taona 2018. Avy eo, tao anatin'ny rafitry ny tetikasa PostgreSQL, dia hita fa raha ny asa fsync() sendra misy hadisoana, manamarika ny pejy "maloto" ho "madio". Vokany, miantso ireto manaraka ireto fsync() tsy manao na inona na inona amin'ny pejy toy izany. Noho izany, ny pejy novaina dia voatahiry ao anaty fitadidiana ary tsy soratana amin'ny kapila. Tena loza tokoa izany, satria ny fampiharana dia hihevitra fa ny angon-drakitra sasany dia nosoratana tamin'ny kapila, fa raha ny marina dia tsy ho. Tsy fahombiazana toy izany fsync() tsy fahita firy, ny fampiharana amin'ny toe-javatra toy izany dia tsy afaka manao na inona na inona hiadiana amin'ny olana. Amin'izao andro izao, rehefa mitranga izany, ny PostgreSQL sy ny fampiharana hafa dia mianjera. izany, ao amin'ny lahatsoratra "Afaka sitrana ve ny fampiharana amin'ny tsy fahombiazan'ny fsync?", nodinihina amin'ny antsipiriany ity olana ity. Amin'izao fotoana izao, ny vahaolana tsara indrindra amin'ity olana ity dia ny fampiasana Direct I/O miaraka amin'ny saina O_SYNC na misy saina O_DSYNC. Miaraka amin'io fomba fiasa io, ny rafitra dia hitatitra ny fahadisoana mety hitranga rehefa manao asa fanoratana data manokana, saingy io fomba fiasa io dia mitaky ny fampiharana hitantana ny buffers. Vakio bebe kokoa momba izany eto ΠΈ eto.

Manokatra rakitra mampiasa ny saina O_SYNC sy O_DSYNC

Andao hiverina amin'ny fifanakalozan-kevitra momba ny mekanika Linux izay manome fitahirizana angon-drakitra maharitra. Izany hoe, miresaka momba ny fampiasana ny saina isika O_SYNC na saina O_DSYNC rehefa manokatra rakitra mampiasa system call misokatra (). Amin'ity fomba ity, ny asa fanoratana data tsirairay dia atao toy ny hoe aorian'ny baiko tsirairay write() ny rafitra dia omena, tsirairay avy, baiko fsync() ΠΈ fdatasync(). The POSIX fepetra arahana izany dia antsoina hoe "Famenoana ny fahatsoram-po amin'ny I/O File" sy ny "Famenoana ny fahamendrehan'ny angona". Ny tombony lehibe amin'ity fomba ity dia ny antson'ny rafitra iray ihany no ilaina mba hiantohana ny fahamarinan'ny angona, fa tsy roa (ohatra - write() ΠΈ fdatasync()). Ny fatiantoka lehibe amin'ity fomba fiasa ity dia ny fampifanarahana ny asa fanoratana rehetra amin'ny alΓ lan'ny famaritana ny rakitra mifanaraka amin'izany, izay afaka mametra ny fahafaha-manarafitra ny kaody fampiharana.

Mampiasa I/O mivantana miaraka amin'ny saina O_DIRECT

System antso open() manohana ny saina O_DIRECT, izay natao hialana amin'ny cache rafitra miasa, hanao asa I / O, mifandray mivantana amin'ny kapila. Izany, amin'ny tranga maro, dia midika fa ny baiko fanoratana navoakan'ny programa dia hadika mivantana amin'ny baiko mikendry ny hiasa amin'ny kapila. Saingy, amin'ny ankapobeny, ity mekanika ity dia tsy fanoloana ireo fiasa fsync() na fdatasync(). Ny zava-misy dia ny kapila mihitsy no afaka fanemorana na cache baiko mety amin'ny fanoratana angona. Ary, ratsy kokoa aza, amin'ny tranga manokana sasany, ny hetsika I / O dia natao rehefa mampiasa saina O_DIRECT, fampitana amin'ny asa mahazatra buffered. Ny fomba tsotra indrindra hamahana ity olana ity dia ny fampiasana ny saina hanokafana rakitra O_DSYNC, izay midika fa ny asa fanoratana tsirairay dia arahina antso fdatasync().

Hita fa ny XFS filesystem dia nanampy "lalana haingana" ho an'ny O_DIRECT|O_DSYNC- angona rakitra. Raha voasoritra ny sakana amin'ny fampiasana O_DIRECT|O_DSYNC, avy eo XFS, fa tsy mandroaka ny cache, dia hanatanteraka ny baiko fanoratana FUA raha manohana azy ilay fitaovana. Nanamarina izany aho tamin'ny fampiasana ny utility blktrace amin'ny rafitra Linux 5.4/Ubuntu 20.04. Ity fomba fiasa ity dia tokony hahomby kokoa, satria manoratra ny habetsaky ny angon-drakitra kely indrindra amin'ny kapila izy ary mampiasa fandidiana iray, fa tsy roa (manoratra sy manala ny cache). Nahita rohy mankany aho damba kernel 2018 izay mampihatra io mekanika io. Misy ny adihevitra momba ny fampiharana io fanatsarana io amin'ny rafitra fichier hafa, fa raha ny fahafantarako azy dia XFS no hany rakitra manohana azy hatreto.

sync_file_range() function

Linux dia manana antso an-tariby sync_file_range(), izay ahafahanao mandrotsaka ampahany amin'ny rakitra amin'ny kapila, fa tsy ny rakitra manontolo. Ity antso ity dia manomboka fanerena asynchronous ary tsy miandry azy ho vita. Fa amin'ny reference sync_file_range() io baiko io dia lazaina fa "tena mampidi-doza". Tsy soso-kevitra ny hampiasa azy io. Toetra sy loza sync_file_range() tena voafaritra tsara ao izany fitaovana. Indrindra indrindra, toa mampiasa RocksDB io antso io mba hifehezana rehefa mandroaka ny angona "maloto" amin'ny kapila ny kernel. Saingy miaraka amin'izay koa, mba hiantohana ny fitahirizana angon-drakitra marin-toerana, dia ampiasaina ihany koa fdatasync(). The fehezan-dalΓ na RocksDB dia manana fanehoan-kevitra mahaliana momba ity lohahevitra ity. Ohatra, toa ny antso sync_file_range() rehefa mampiasa ZFS dia tsy mandroaka angona amin'ny kapila. Ny traikefa dia milaza amiko fa ny kaody zara raha ampiasaina dia mety misy bibikely. Noho izany, manoro hevitra aho mba tsy hampiasa ity antso an-tariby ity raha tsy tena ilaina.

Miantso ny rafitra mba hiantohana ny faharetan'ny angona

Tonga tamin'ny fanatsoahan-kevitra aho fa misy fomba telo azo ampiasaina hanatanterahana ny asa I/O maharitra. Izy rehetra dia mila antso an-tariby fsync() ho an'ny lahatahiry nanaovana ny rakitra. Ireto ny fomba fiasa:

  1. Function call fdatasync() na fsync() aorian'ny asa write() (tsara kokoa ny mampiasa fdatasync()).
  2. Miasa miaraka amin'ny famaritana rakitra misokatra amin'ny saina O_DSYNC na O_SYNC (tsara kokoa - miaraka amin'ny sainam-pirenena O_DSYNC).
  3. Fampiasana baiko pwritev2() miaraka amin'ny saina RWF_DSYNC na RWF_SYNC (tsara indrindra amin'ny saina RWF_DSYNC).

Fanamarihana Fampisehoana

Tsy nanao fandrefesana tsara momba ireo mekanika isan-karazany nojereko aho. Kely dia kely ny fahasamihafana tsikaritra teo amin’ny hafainganan’ny asany. Midika izany fa mety ho diso aho, ary amin'ny toe-javatra hafa dia mety haneho valiny hafa ny zavatra mitovy. Voalohany, hiresaka momba ny zavatra misy fiantraikany bebe kokoa amin'ny fampisehoana aho, ary avy eo, momba izay tsy misy fiantraikany amin'ny fampisehoana.

  1. Haingana kokoa noho ny fampidirana angon-drakitra amin'ny rakitra iray ny fanonerana angon-drakitra (mety ho 2-100%) ny tombony azo amin'ny asa. Mila fanovana fanampiny amin'ny metadatan'ilay rakitra ny fametahana angona amin'ny rakitra, na dia aorian'ny antson'ny rafitra aza fallocate(), saingy mety hiovaova ny halehiben'io fiantraikany io. Manoro hevitra aho, ho an'ny fampisehoana tsara indrindra, hiantso fallocate() atokana mialoha ny toerana ilaina. Avy eo io habaka io dia tokony ho feno aotra mazava ary antsoina fsync(). Izany dia hahatonga ireo sakana mifanaraka amin'ny rafitra fichier ho voamarika ho "natokana" fa tsy "tsy misy". Izany dia manome fanatsarana fampisehoana kely (eo amin'ny 2%). Fanampin'izany, ny kapila sasany dia mety manana hetsika fidirana amin'ny fanakanana voalohany miadana kokoa noho ny hafa. Midika izany fa ny famenoana ny habaka amin'ny aotra dia mety hitondra fanatsarana lehibe (eo amin'ny 100%). Indrindra indrindra, mety hitranga amin'ny kapila izany. AWS EBS (Angon-drakitra tsy ofisialy ity, tsy afaka nanamarina azy ireo aho). Toy izany koa ny fitahirizana. GCP Persistent Disk (ary efa vaovao ofisialy izany, nohamafisin'ny fitsapana). Nanao toy izany koa ny manam-pahaizana hafa fandinihanamifandraika amin'ny kapila samihafa.
  2. Ny antso an-tariby vitsy kokoa, ny avo kokoa ny fampisehoana (mety ho eo amin'ny 5%) ny tombony. Toa antso izany open() miaraka amin'ny saina O_DSYNC na miantso pwritev2() miaraka amin'ny saina RWF_SYNC antso haingana kokoa fdatasync(). Miahiahy aho fa ny teboka eto dia ny hoe miaraka amin'ity fomba fiasa ity, ny hoe vitsy kokoa ny antso an-tariby tsy maintsy atao mba hamahana ny asa mitovy (antso iray fa tsy roa) dia mitana anjara toerana. Fa ny fahasamihafan'ny fampisehoana dia tena kely, noho izany dia azonao atao ny tsy miraharaha azy mora foana ary mampiasa zavatra ao amin'ny fampiharana izay tsy mitarika ho amin'ny fahasarotan'ny lojikany.

Raha liana amin'ny lohahevitra momba ny fitahirizana angon-drakitra maharitra ianao dia ireto misy fitaovana ilaina:

  • Fomba fidirana I/O - topimaso momba ny fototry ny mekanika fampidirana / famoahana.
  • Miantoka ny angon-drakitra tonga any amin'ny kapila - tantara momba ny zava-mitranga amin'ny angon-drakitra eny an-dalana avy amin'ny fampiharana mankany amin'ny kapila.
  • Rahoviana ianao no tokony hsync ny lahatahiry misy - ny valin'ny fanontaniana hoe rahoviana ny hampihatra fsync() ho an'ny lahatahiry. Raha fintinina dia hita fa mila manao izany ianao rehefa mamorona rakitra vaovao, ary ny anton'ity fanolorana ity dia ny hoe ao amin'ny Linux dia mety misy references maro amin'ny rakitra iray ihany.
  • SQL Server amin'ny Linux: FUA Internals - Ity misy famaritana ny fomba fampiharana ny fitahirizana data maharitra amin'ny SQL Server amin'ny sehatra Linux. Misy fampitahana mahaliana eo amin'ny Windows sy Linux system call eto. Saika azoko antoka fa noho ity fitaovana ity no nianarako momba ny fanatsarana ny FUA an'ny XFS.

Efa very angona noheverinao fa voatahiry tsara ao anaty kapila ve ianao?

Fitehirizana angona maharitra sy Linux File API

Fitehirizana angona maharitra sy Linux File API

Source: www.habr.com