För att aktivera kÀrnan i Linux 6.2 föreslÄs förbÀttringar av Btrfs som handlar om att ÄtgÀrda problemet med "write hole" i implementeringen av RAID 5/6. KÀrnan i problemet Àr att om det intrÀffar ett systemkraschar under skrivning Àr det frÄn början omöjligt att avgöra vilken block pÄ vilket av RAID-enheterna har skrivits korrekt, och vilken skrivning inte har slutförts. Vid ett försök att ÄterstÀlla RAID i en sÄdan situation kan block som motsvarar de ofullstÀndigt skrivna blocken skadas eftersom statusen för RAID-blocken blir desynkroniserad. Detta problem uppstÄr i alla RAID1/5/6-arrayer dÀr inga sÀrskilda ÄtgÀrder vidtas för att motverka ett sÄdant effekt.
I implementeringen av RAID, liknande RAID1 i btrfs, löses detta problem genom att anvÀnda kontrollsummor i bÄda kopiorna; vid skillnad ÄterstÀlls data helt enkelt frÄn den andra kopian. Denna metod fungerar ocksÄ om en enhet börjar ge felaktiga data i stÀllet för ett totalt fel.
Men i fallet med RAID5/6 lagrar filsystemet inte kontrollsummor för paritetsblock; i normala situationer verifieras blockens korrekthet av det faktum att alla Àr mÀrkta med kontrollsumma, och paritetsblocket kan Äterskapas frÄn data. Men vid partiell skrivning kan denna metod i vissa situationer misslyckas. I detta fall, vid ÄterstÀllning av arrayen, Àr det möjligt att block som har pÄverkas av ofullstÀndig skrivning kan ÄterstÀllas felaktigt.
För btrfs Àr detta problem mest aktuellt om den skrivna datan Àr mindre Àn stripe-storleken. I sÄ fall mÄste filsystemet utföra en lÀs-modifiering-skrivning (read-modify-write, RMW) operation. Om det stöter pÄ block med ofullstÀndig skrivning, kan RMW-operationen orsaka korruptioner som inte kommer att upptÀckas, trots kontrollsummor. Utvecklarna har infört Àndringar dÀr RMW-operationen kontrollerar blockens kontrollsummor innan operationen utförs, och vid behov, nÀr datan ÄterstÀlls, verifierar kontrollsummorna efter skrivningen. TyvÀrr leder denna metod för att hantera ofullstÀndig stripe-skrivning (RMW) till extra overhead för att berÀkna kontrollsummor, men det ökar betydligt tillförlitligheten. För RAID6 Àr en sÄdan logik Ànnu inte klar, men för ett fel i RAID6 krÀvs det att skrivningen misslyckas pÄ tvÄ enheter samtidigt, vilket Àr mindre sannolikt.
Det bör ocksÄ noteras rekommendationerna frÄn utvecklarna angÄende anvÀndningen av RAID5/6, som i korthet innebÀr att i Btrfs kan lagringsprofilen för metadata och data skilja sig Ät. HÀr kan man anvÀnda RAID1-profilen (spegel) eller till och med RAID1C3 (3 kopior) för metadata, medan man för data kan anvÀnda RAID5 eller RAID6. Detta ger en pÄlitlig skydd för metadata och eliminerar "write hole" pÄ ena sidan, samt en mer effektiv anvÀndning av utrymme som kÀnnetecknas av RAID5/6 pÄ andra sidan. Detta hjÀlper till att undvika korruptioner i metadata, och datakorruptioner kan ÄtgÀrdas.
Det Ă€r ocksĂ„ vĂ€rt att nĂ€mna att för SSD kommer Btrfs i kĂ€rna 6.2 som standard att aktivera asynkron utförande av operationen "discard" (markera frigjorda block som inte lĂ€ngre behöver lagras fysiskt). Fördelen med detta lĂ€ge Ă€r hög prestanda tack vare effektiv gruppering av "discard"-operationer i köer och fortsatt behandling av köen av en bakgrundsbehandlare, vilket gör att normala filsystemoperationer inte fördröjs, till skillnad frĂ„n vid synkron "discard" nĂ€r block frigörs, och SSD kan fatta bĂ€ttre beslut. Ă
andra sidan kommer det inte lÀngre att vara nödvÀndigt att anvÀnda verktyg som fstrim, eftersom alla tillgÀngliga block kommer att rensas i filsystemet utan behov av ytterligare skanning och utan att verksamheterna saktas ner.
KĂ€lla: opennet.ru
