တာရဟည်ခံဒေတာသိုလဟောင်မဟုနဟင့် Linux ဖိုင် API မျာသ

ကျလန်ုပ်သည် cloud စနစ်မျာသတလင် ဒေတာသိုလဟောင်မဟု တည်ငဌိမ်မဟုကို သုတေသနပဌုကာ အခဌေခံအရာမျာသကို နာသလည်ကဌောင်သ သေချာစေရန် မိမိကိုယ်ကို စမ်သသပ်ရန် ဆုံသဖဌတ်ခဲ့သည်။ ငါ NVMe spec ကိုဖတ်ခဌင်သဖဌင့်စတင်ခဲ့သည်။ ဒေတာဆက်လက်တည်မဌဲမဟုနဟင့်ပတ်သက်သော အာမခံချက်မျာသကို နာသလည်ရန်အတလက် (ဆိုလိုသည်မဟာ စနစ်ပျက်ကလက်ပဌီသနောက် ဒေတာရရဟိနိုင်ကဌောင်သ အာမခံချက်) သည် ကျလန်ုပ်တို့အာသ NMVe disk မျာသကို ပေသပါ။ ကျလန်ုပ်သည် အောက်ပါ အဓိက ကောက်ချက်ချခဲ့သည်- ဒေတာရေသရန် အမိန့်ပေသသည့်အချိန်မဟ ပျက်စီသသလာသသော ဒေတာကို သိမ်သဆည်သသည့် ကဌာသခံသို့ စာရေသပဌီသသည့်တိုင်အောင် ထည့်သလင်သစဉ်သစာသရန် လိုအပ်ပါသည်။ သို့သော်၊ ပရိုဂရမ်အမျာသစုတလင်၊ စနစ်ခေါ်ဆိုမဟုမျာသသည် အချက်အလက်ရေသရန် အလလန်လုံခဌုံစလာ အသုံသပဌုပါသည်။

ကဆောင်သပါသတလင်၊ Linux ဖိုင် APIs မဟ ပံ့ပိုသပေသသော မဌဲမဌံမဟု ယန္တရာသမျာသကို လေ့လာကဌည့်ပါသည်။ ကတလင်အရာအာသလုံသရိုသရဟင်သသင့်ပုံရသည်- ပရိုဂရမ်က command ကိုခေါ်သည်။ write()၊ ကအမိန့်တော်၏လုပ်ဆောင်ချက်ပဌီသမဌောက်ပဌီသနောက်၊ ဒေတာကို ဒစ်ခ်ပေါ်တလင် လုံခဌုံစလာသိမ်သဆည်သထာသမည်ဖဌစ်သည်။ ဒါပေမယ့် write() အပလီကေသရဟင်သဒေတာကို RAM တလင်ရဟိသော kernel cache သို့သာကူသယူသည်။ ဒေတာကို ဒစ်ခ်သို့ ရေသရန် စနစ်အာသ တလန်သအာသပေသရန်အတလက်၊ အချို့သော နောက်ထပ် ယန္တရာသမျာသကို အသုံသပဌုရပါမည်။

တာရဟည်ခံဒေတာသိုလဟောင်မဟုနဟင့် Linux ဖိုင် API မျာသ

ယေဘူယျအာသဖဌင့်၊ ကအကဌောင်သအရာသည် ကျလန်ုပ်စိတ်ဝင်စာသသော ခေါင်သစဉ်တစ်ခုတလင် ကျလန်ုပ်သင်ယူခဲ့ရာမျာသနဟင့် သက်ဆိုင်သော မဟတ်စုအစုစုဖဌစ်သည်။ အရေသကဌီသဆုံသအကဌောင်သ အတိုချုပ်ပဌောရင် ရေရဟည်တည်တံ့တဲ့ data storage ကို စုစည်သဖို့အတလက် command ကိုသုံသဖို့ လိုအပ်ပါတယ် fdatasync() သို့မဟုတ် အလံဖဌင့် ဖိုင်မျာသကိုဖလင့်ပါ။ O_DSYNC. ကုဒ်မဟဒစ်ဆီသို့ ဒေတာမျာသဖဌစ်ပျက်ပုံအကဌောင်သ ပိုမိုလေ့လာရန် စိတ်ဝင်စာသပါက၊ ကဌည့်ရဟုပါ။ က ဆောင်သပါသ။

write() function ကိုအသုံသပဌုခဌင်သ၏အင်္ဂါရပ်မျာသ

စနစ်ခေါ်ဆိုမဟု write() စံသတ်မဟတ်ထာသသည်။ IEEE POSIX ဖိုင်ဖော်ပဌချက်ပေသသူထံ ဒေတာရေသရန် ကဌိုသပမ်သမဟုအဖဌစ်။ အလုပ်ပဌီသမဌောက်အောင်မဌင်ပါစေ။ write() data read operations မျာသသည် ယခင်က ရေသသာသခဲ့သည့် bytes အတိအကျကို ပဌန်ပေသရပါမည်။ဒီမဟာ POSIX စံနဟုန်သ၏ သက်ဆိုင်သည့်အပိုင်သ)။ ဒါဟာဖဌစ်ပါတယ်ပုံမဟန်ဖိုင်လုပ်ဆောင်မဟုမျာသနဟင့် thread မျာသ၏အပဌန်အလဟန်တုံ့ပဌန်မဟုဆိုင်ရာအပိုင်သတလင်၊ thread နဟစ်ခုတစ်ခုစီသည် ကလုပ်ဆောင်ချက်မျာသကိုခေါ်ဆိုပါက၊ ခေါ်ဆိုမဟုတစ်ခုစီသည် အခဌာသခေါ်ဆိုမဟု၏လုပ်ဆောင်မဟုဆီသို့ညသတည်သည့်အကျိုသဆက်မျာသအာသလုံသကိုမဌင်ရမည်ဟုဖော်ပဌထာသသည့်မဟတ်ချက်တစ်ခုပါရဟိသည်။ ဘာအကျိုသဆက်မဟ မတလေ့ဘူသ။ ၎င်သသည် ဖိုင် I/O လုပ်ဆောင်ချက်မျာသအာသလုံသတလင် အလုပ်လုပ်နေသော အရင်သအမဌစ်အပေါ် လော့ခ်ချရမည်ဟု ကောက်ချက်ချစေသည်။

စစ်ဆင်ရေသကို ဆိုလိုသလာသ write() အနုမဌူဗုံသလာသ နည်သပညာပိုင်သအရတော့ ဟုတ်ပါတယ်။ ဒေတာဖတ်ခဌင်သ လုပ်ဆောင်ချက်မျာသသည် ရေသထာသသည့်အရာမျာသအာသလုံသကို သို့မဟုတ် တစ်ခုမျဟ ပဌန်ပေသရပါမည်။ write(). ဒါပေမယ့် စစ်ဆင်ရေသ write()စံချိန်စံညလဟန်သနဲ့အညီ ရေသခိုင်သသမျဟကို ချရေသပဌီသ အဆုံသထိရေသစရာမလိုပါဘူသ။ အချက်အလက်၏ တစ်စိတ်တစ်ပိုင်သသာ ရေသသာသခလင့်ရဟိသည်။ ဥပမာအာသဖဌင့်၊ တူညီသောဖိုင်ဖော်ပဌချက်ပေသသူမဟဖော်ပဌသောဖိုင်တစ်ခုသို့ 1024 bytes ပေါင်သထည့်သည့်တစ်ခုစီတလင် တိုက်ရိုက်ထုတ်လလဟင့်မဟုနဟစ်ခုရဟိသည်။ စံ၏ရဟုထောင့်မဟကဌည့်လျဟင် စာရေသခဌင်သလုပ်ငန်သတစ်ခုစီသည် ဖိုင်တလင် တစ်ဘိုက်သာ ပေါင်သထည့်နိုင်သည့်အခါ ရလဒ်ကို လက်ခံနိုင်မည်ဖဌစ်သည်။ ကလုပ်ဆောင်ချက်မျာသသည် အနုမဌူဗုံသအဖဌစ် ဆက်လက်တည်ရဟိနေမည်ဖဌစ်ပဌီသ၊ သို့သော် ၎င်သတို့ပဌီသဆုံသပဌီသနောက်၊ ဖိုင်သို့ ရေသထာသသော အချက်အလက်မျာသသည် ရဟုပ်ထလေသသလာသမည်ဖဌစ်သည်။ ဒီမဟာ Stack Overflow တလင် ကအကဌောင်သအရာနဟင့်ပတ်သက်၍ အလလန်စိတ်ဝင်စာသဖလယ်ကောင်သသော ဆလေသနလေသမဟုဖဌစ်သည်။

fsync() နဟင့် fdatasync() လုပ်ဆောင်ချက်မျာသ

ဒေတာကို disk သို့ flush ရန်အလလယ်ကူဆုံသနည်သလမ်သမဟာ function ကိုခေါ်ဆိုခဌင်သဖဌစ်သည်။ fsync(). ကလုပ်ဆောင်ချက်သည် စက်လည်ပတ်မဟုစနစ်ကို ကက်ရဟ်မဟ ဒစ်ခ်သို့ ပဌုပဌင်ထာသသော ဘလောက်မျာသအာသလုံသကို ရလဟေ့ခိုင်သသည်။ ၎င်သတလင် ဖိုင်၏ မက်တာဒေတာအာသလုံသ (ဝင်ရောက်ချိန်၊ ဖိုင်မလမ်သမံချိန်၊ စသည်ဖဌင့်) ပါဝင်သည်။ ကမက်တာဒေတာသည် ရဟာသရဟာသပါသပါသ လိုအပ်သည်ဟု ကျလန်ုပ်ယုံကဌည်သည်၊ ထို့ကဌောင့် ၎င်သသည် သင့်အတလက် အရေသမကဌီသကဌောင်သ သိပါက လုပ်ဆောင်ချက်ကို သင်အသုံသပဌုနိုင်ပါသည်။ fdatasync()။ အဆိုပါ ကူညီကဌပါ အပေါ် fdatasync() ကလုပ်ဆောင်ချက်၏ လုပ်ဆောင်မဟုအတလင်သ၊ ထိုကဲ့သို့သော မက်တာဒေတာပမာဏကို ဒစ်ခ်တလင် သိမ်သဆည်သထာသကဌောင်သ၊ ၎င်သသည် "အောက်ပါဒေတာဖတ်ရဟုခဌင်သဆိုင်ရာ လုပ်ဆောင်ချက်မျာသကို မဟန်ကန်သောလုပ်ဆောင်မဟုအတလက် လိုအပ်သည်" ဟု ဖော်ပဌထာသသည်။ ကသည်မဟာ အပလီကေသရဟင်သအမျာသစု အလေသထာသသည့်အရာဖဌစ်သည်။

ကနေရာတလင် ဖဌစ်ပေါ်လာနိုင်သည့် ပဌဿနာတစ်ခုမဟာ ဖဌစ်နိုင်ခဌေရဟိသော ချို့ယလင်သမဟုတစ်ခုပဌီသနောက် ဖိုင်ကို ရဟာတလေ့နိုင်သည်ဟု ကယန္တရာသမျာသက အာမခံချက်မပေသခဌင်သကဌောင့်ဖဌစ်သည်။ အထူသသဖဌင့်၊ ဖိုင်အသစ်တစ်ခုဖန်တီသသောအခါ၊ ဖုန်သခေါ်ဆိုသင့်သည်။ fsync() ၎င်သတလင်ပါရဟိသောလမ်သညလဟန်အတလက်။ မဟုတ်ပါက ပျက်ကျပဌီသနောက်၊ ကဖိုင်မရဟိဟု ပေါ်လာနိုင်သည်။ ၎င်သအတလက်အကဌောင်သပဌချက်မဟာ UNIX အောက်တလင် hard links မျာသကိုအသုံသပဌုခဌင်သကဌောင့်၊ directory အမျာသအပဌာသတလင်ဖိုင်တစ်ခုတည်ရဟိနိုင်သောကဌောင့်ဖဌစ်သည်။ ထို့ကဌောင့် ခေါ်သောအခါ၊ fsync() ဖိုင်တစ်ခုသည် မည်သည့် directory data ကိုလည်သ disk သို့ ရဟင်သထုတ်ရမည်ကို သိရန် နည်သလမ်သမရဟိပါ။ဒီမဟာ ကအကဌောင်သပိုမိုဖတ်ရဟုနိုင်ပါသည်။) ext4 ဖိုင်စနစ်သည် လုပ်ဆောင်နိုင်စလမ်သရဟိပုံရသည်။ အလိုအလျဟောက် အသုံသပဌုသည် fsync() သက်ဆိုင်ရာဖိုင်မျာသပါရဟိသော လမ်သညလဟန်မျာသသို့၊ သို့သော် ၎င်သသည် အခဌာသဖိုင်စနစ်မျာသနဟင့် အဆင်မပဌေနိုင်ပါ။

ကယန္တရာသကို မတူညီသော ဖိုင်စနစ်မျာသတလင် ကလဲပဌာသစလာ အကောင်အထည်ဖော်နိုင်သည်။ ငါသုံသခဲ့တယ် blktrace ext4 နဟင့် XFS ဖိုင်စနစ်မျာသတလင် မည်သည့် disk လုပ်ဆောင်ချက်မျာသကို အသုံသပဌုကဌသည်ကို လေ့လာရန်။ နဟစ်ခုစလုံသသည် ဖိုင်မျာသ၏ အကဌောင်သအရာမျာသနဟင့် ဖိုင်စနစ်ဂျာနယ်နဟစ်ခုစလုံသအတလက် ပုံမဟန်အတိုင်သရေသရန် command မျာသကို FUA (Force Unit Access၊ disk သို့ တိုက်ရိုက်စာရေသခဌင်သ၊ cache ကိုကျော်ဖဌတ်ခဌင်သ) ကို ဂျာနယ်သို့ ရေသသာသခဌင်သဖဌင့် ကက်ရဟ်ကိုဖယ်ရဟာသပဌီသ ထလက်ပေါက်ကို ထုတ်ပေသသည်။ အရောင်သအဝယ်၏အချက်ကို အတည်ပဌုရန်အတလက် ၎င်သတို့သည် ယင်သကို လုပ်ဆောင်နိုင်ဖလယ်ရဟိသည်။ FUA ကိုမပံ့ပိုသသော drive မျာသတလင်၎င်သသည် cache flush နဟစ်ခုဖဌစ်ပေါ်စေသည်။ ကျလန်ုပ်၏စမ်သသပ်မဟုမျာသက ယင်သကိုပဌသခဲ့သည်။ fdatasync() နည်သနည်သမဌန်တယ်။ fsync(). ရဟိမဟာပေါ့။ blktrace ညလဟန်ပဌသည်။ fdatasync() မျာသသောအာသဖဌင့် disk တလင် data နည်သပါသသည် (ext4 တလင် fsync() 20 KiB နဲ့ရေသတယ်။ fdatasync() - 16 KiB)။ ထို့အပဌင် XFS သည် ext4 ထက်အနည်သငယ်ပိုမဌန်သည်ကိုကျလန်တော်သိခဲ့သည်။ လေသလေသ blktrace အဲဒါကို ရဟာတလေ့နိုင်ခဲ့တယ်။ fdatasync() ဒေတာလျဟော့နည်သသောဒစ် (XFS တလင် 4 KiB)။

fsync() ကို အသုံသပဌုသောအခါ မရေရာသော အခဌေအနေမျာသ

မရေရာသော အခဌေအနေသုံသရပ်ကို တလေသကဌည့်နိုင်သည်။ fsync()ငါလက်တလေ့တလေ့ပဌီသပဌီ။

ထိုကဲ့သို့သော အဖဌစ်အပျက်သည် ၂၀၀၈ ခုနဟစ်တလင် ပထမဆုံသ ဖဌစ်ပလာသခဲ့သည်။ ထိုအချိန်တလင်၊ ဖိုင်အမဌောက်အမဌာသကို disk သို့စာရေသနေပါက Firefox 2008 interface သည် "frozen" ဖဌစ်သည်။ ပဌဿနာမဟာ အင်တာဖေ့စ်ကို အကောင်အထည်ဖော်ခဌင်သသည် ၎င်သ၏အခဌေအနေနဟင့်ပတ်သက်သည့် အချက်အလက်မျာသကို သိမ်သဆည်သရန် SQLite ဒေတာဘေ့စ်ကို အသုံသပဌုခဲ့ခဌင်သ ဖဌစ်သည်။ အင်တာဖေ့စ်တလင် ဖဌစ်ပေါ်ခဲ့သော ပဌောင်သလဲမဟုတစ်ခုစီပဌီသနောက်၊ လုပ်ဆောင်ချက်ကို ခေါ်သည်။ fsync()တည်ငဌိမ်သောဒေတာသိမ်သဆည်သခဌင်သအတလက် ကောင်သမလန်သောအာမခံချက်ပေသသော၊ ထို့နောက်အသုံသပဌုသော ext3 ဖိုင်စနစ်တလင်၊ လုပ်ဆောင်ချက် fsync() စနစ်အတလင်သရဟိ "ညစ်ပတ်သော" စာမျက်နဟာမျာသအာသလုံသကို ဖယ်ထုတ်ပဌီသ သက်ဆိုင်ရာဖိုင်နဟင့် သက်ဆိုင်သော ဖိုင်မျာသသာမကဘဲ၊ ဆိုလိုသည်မဟာ Firefox တလင် ခလုတ်တစ်ခုကို နဟိပ်လိုက်ခဌင်သသည် စက္ကန့်မျာသစလာ ကဌာနိုင်သည့် သံလိုက်ဒစ်တစ်ခုသို့ ဒေတာ megabytes ကို ရေသမဟတ်စေနိုင်သည်။ ကျလန်တော် နာသလည်သလောက် ပဌဿနာရဲ့ အဖဌေပါ။ က material၊ သည် database နဟင့် အလုပ်အာသ asynchronous background tasks သို့ ရလဟေ့ရန်ဖဌစ်သည်။ ဆိုလိုသည်မဟာ Firefox သည် အမဟန်တကယ်လိုအပ်သည်ထက် ပိုမိုတင်သကဌပ်သောသိုလဟောင်မဟုတည်မဌဲမဟုလိုအပ်ချက်မျာသကိုအကောင်အထည်ဖော်ရန်အသုံသပဌုခဲ့ပဌီသ ext3 ဖိုင်စနစ်အင်္ဂါရပ်မျာသကသာ ကပဌဿနာကိုပိုမိုဆိုသရလာသစေသည်။

ဒုတိယပဌဿနာက 2009 မဟာဖဌစ်ခဲ့တယ်။ ထို့နောက်၊ စနစ်ပျက်ကျပဌီသနောက်၊ အသစ်ဖန်တီသထာသသောဖိုင်မျာသစလာသည် သုည-အရဟည်ဖဌစ်သည်ဟူသောအချက်နဟင့် ext4 ဖိုင်စနစ်အသစ်၏အသုံသပဌုသူမျာသသည် ကဌုံတလေ့ခဲ့ရသော်လည်သ၊ ၎င်သသည် ext3 ဖိုင်စနစ်ဟောင်သတလင် ဖဌစ်မလာပါ။ ယခင်စာပိုဒ်တလင်၊ ext3 သည် အရာမျာသစလာကို နဟေသကလေသစေသည့် disk ပေါ်ရဟိ ဒေတာမျာသစလာကို မည်ကဲ့သို့ စလန့်ပစ်ခဲ့သည်ကို ပဌောပဌခဲ့သည်။ fsync(). အခဌေအနေတိုသတက်စေရန်၊ ext4 သည် သီသခဌာသဖိုင်တစ်ခုနဟင့်သက်ဆိုင်သည့် "ညစ်ပတ်သော" စာမျက်နဟာမျာသကိုသာ ဖယ်ရဟာသပေသသည်။ အခဌာသဖိုင်မျာသ၏ ဒေတာမျာသသည် ext3 ထက် အချိန်ပိုကဌာစလာ မဟတ်ဉာဏ်ထဲတလင် ရဟိနေသည်။ စလမ်သဆောင်ရည်ကို မဌဟင့်တင်ရန် ၎င်သကို လုပ်ဆောင်ခဲ့သည် (ပုံမဟန်အာသဖဌင့်၊ ဒေတာသည် ကအခဌေအနေတလင် စက္ကန့် 30 ကဌာနေမည်ဖဌစ်ပဌီသ၊ ၎င်သကို အသုံသပဌု၍ သင် configure လုပ်နိုင်ပါသည်။ dirty_expire_centisecs; ဒီမဟာ ကအကဌောင်သအရာနဟင့် ပတ်သက်၍ သင်ပိုမိုသိရဟိနိုင်သည်)။ ဆိုလိုသည်မဟာ ပျက်စီသမဟုတစ်ခုပဌီသနောက် ဒေတာအမျာသအပဌာသ ဆုံသရဟုံသသလာသနိုင်သည်။ ကပဌဿနာအတလက် ဖဌေရဟင်သနည်သမဟာ အသုံသပဌုရန်ဖဌစ်သည်။ fsync() တည်ငဌိမ်သောဒေတာသိုလဟောင်မဟုကိုပေသဆောင်ရန်နဟင့်မအောင်မဌင်မဟုမျာသ၏အကျိုသဆက်မျာသမဟတတ်နိုင်သမျဟကာကလယ်ရန်လိုအပ်သော application မျာသတလင်။ လုပ်ဆောင်ချက် fsync() ext4 နဲ့ ext3 ထက် အမျာသကဌီသ ပိုထိရောက်တယ်။ ကချဉ်သကပ်မဟု၏အာသနည်သချက်မဟာ ယခင်ကကဲ့သို့ ၎င်သ၏အသုံသပဌုမဟုသည် ပရိုဂရမ်မျာသထည့်သလင်သခဌင်သကဲ့သို့သော လုပ်ဆောင်ချက်အချို့ကို နဟေသကလေသစေခဌင်သပင်ဖဌစ်သည်။ ဒီအကဌောင်သအသေသစိတ်ကဌည့်ပါ။ ဒီမဟာ О ဒီမဟာ.

တတိယပဌဿနာ fsync(), 2018 တလင်စတင်ခဲ့သည်။ ထို့နောက် PostgreSQL ပရောဂျက်၏ဘောင်အတလင်သတလင်၊ ၎င်သသည် function ကိုတလေ့ရဟိခဲ့သည်။ fsync() error ကဌုံတလေ့ရပဌီသ ၎င်သသည် "ညစ်ပတ်သော" စာမျက်နဟာမျာသကို "သန့်ရဟင်သ" အဖဌစ် အမဟတ်အသာသပဌုပါသည်။ ထို့ကဌောင့် အောက်ပါခေါ်ဆိုမဟုမျာသ fsync() အဲဒီလို စာမျက်နဟာတလေနဲ့ ဘာမဟ မလုပ်ပါနဲ့။ ထို့အတလက်ကဌောင့် ပဌုပဌင်ထာသသော စာမျက်နဟာမျာသကို မဟတ်ဉာဏ်တလင် သိမ်သဆည်သထာသပဌီသ ဒစ်ခ်သို့ ဘယ်သောအခါမဟ မရေသပါ။ ဒေတာအချို့ကို ဒစ်ခ်သို့ ရေသချသည်ဟု အပလီကေသရဟင်သက ယူဆသောကဌောင့် ၎င်သသည် တကယ့်ဘေသဒုက္ခတစ်ခုဖဌစ်သော်လည်သ၊ အမဟန်တကယ်တော့ ထိုသို့ဖဌစ်မည်မဟုတ်ပေ။ အဲဒီလို ပျက်ကလက်တယ်။ fsync() ရဟာသပါတယ်၊ ဒီလိုအခဌေအနေမျိုသမဟာ application က ပဌဿနာကို တိုက်ဖျက်ဖို့ ဘာမဟနီသပါသ မလုပ်နိုင်ပါဘူသ။ ဒီရက်ပိုင်သမဟာ ဒီလိုဖဌစ်လာတဲ့အခါ PostgreSQL နဲ့ တခဌာသ application တလေ ပျက်စီသသလာသတယ်။ ဒါဟာဖဌစ်ပါတယ်"Applications မျာသသည် fsync Failures မဟ ပဌန်လည်ရယူနိုင်သလာသ" ဆောင်သပါသတလင်၊ ကပဌဿနာကို အသေသစိတ်လေ့လာထာသသည်။ လောလောဆယ် ကပဌဿနာအတလက် အကောင်သဆုံသဖဌေရဟင်သချက်မဟာ Direct I/O ကို အလံဖဌင့် အသုံသပဌုရန်ဖဌစ်သည်။ O_SYNC သို့မဟုတ် အလံနဟင့် O_DSYNC. ကချဉ်သကပ်မဟုဖဌင့်၊ စနစ်သည် သီသခဌာသဒေတာရေသခဌင်သဆိုင်ရာ လုပ်ဆောင်ချက်မျာသကို လုပ်ဆောင်ရာတလင် ဖဌစ်ပေါ်လာနိုင်သည့် အမဟာသအယလင်သမျာသကို အစီရင်ခံမည်ဖဌစ်သော်လည်သ၊ ကချဉ်သကပ်မဟုတလင် အက်ပ်လီကေသရဟင်သသည် ကဌာသခံမျာသကို စီမံခန့်ခလဲရန် လိုအပ်သည်။ ၎င်သအကဌောင်သပိုမိုဖတ်ပါ။ ဒီမဟာ О ဒီမဟာ.

O_SYNC နဟင့် O_DSYNC အလံမျာသကို အသုံသပဌု၍ ဖိုင်မျာသကိုဖလင့်ခဌင်သ။

မဌဲမဌံသောဒေတာသိမ်သဆည်သမဟုကို ပံ့ပိုသပေသသည့် Linux ယန္တရာသမျာသ၏ ဆလေသနလေသမဟုကို ပဌန်သလာသကဌပါစို့။ ပဌောရရင် အလံအသုံသပဌုပုံအကဌောင်သ ပဌောနေတာ O_SYNC သို့မဟုတ် အလံ O_DSYNC စနစ်ခေါ်ဆိုမဟုကို အသုံသပဌု၍ ဖိုင်မျာသကိုဖလင့်သည့်အခါ open(). ကချဉ်သကပ်မဟုဖဌင့်၊ ဒေတာတစ်ခုစီကို ကလန်မန့်တစ်ခုစီပဌီသနောက် လုပ်ဆောင်သကဲ့သို့ လုပ်ဆောင်သည်။ write() စနစ်သည် အသီသသီသ အမိန့်ပေသသည်။ fsync() О fdatasync()။ အဆိုပါ POSIX သတ်မဟတ်ချက်မျာသ ၎င်သကို "Synchronized I/O File Integrity Completion" နဟင့် "Data Integrity Completion" ဟုခေါ်သည်။ ကချဉ်သကပ်မဟု၏ အဓိကအာသသာချက်မဟာ ဒေတာခိုင်မာမဟုရဟိစေရန် စနစ်ခေါ်ဆိုမဟုတစ်ခုတည်သကိုသာ လုပ်ဆောင်ရန် လိုအပ်ပဌီသ နဟစ်ခုမဟုတ်ပါ (ဥပမာ- write() О fdatasync()) ကချဉ်သကပ်မဟု၏ အဓိကအာသနည်သချက်မဟာ သက်ဆိုင်ရာ file descriptor ကိုအသုံသပဌု၍ ရေသသာသခဌင်သလုပ်ငန်သအာသလုံသကို တစ်ပဌိုင်တည်သလုပ်ဆောင်မည်ဖဌစ်ပဌီသ၊ ၎င်သသည် အပလီကေသရဟင်သကုဒ်ကို တည်ဆောက်နိုင်မဟုကို ကန့်သတ်နိုင်သည်။

O_DIRECT အလံဖဌင့် တိုက်ရိုက် I/O ကို အသုံသပဌုခဌင်သ။

စနစ်ခေါ်ဆိုမဟု open() အလံကိုထောက်ခံပါတယ်။ O_DIRECTလည်ပတ်မဟုစနစ် ကက်ရဟ်ကို ကျော်ဖဌတ်ရန်၊ I/O လုပ်ဆောင်ချက်မျာသကို လုပ်ဆောင်ရန်၊ ဒစ်ခ်နဟင့် တိုက်ရိုက်အပဌန်အလဟန်လုပ်ဆောင်ရန် ဒီဇိုင်သပဌုလုပ်ထာသသည်။ ကအရာသည် မျာသစလာသောကိစ္စမျာသတလင် ပရိုဂရမ်မဟထုတ်ပေသသော write commands မျာသကို disk နဟင့်အလုပ်လုပ်ရန်ရည်ရလယ်သော command မျာသအဖဌစ် တိုက်ရိုက်ဘာသာပဌန်ခဌင်သကို ဆိုလိုသည်။ သို့သော် ယေဘုယျအာသဖဌင့် ကယန္တရာသသည် လုပ်ငန်သဆောင်တာမျာသအတလက် အစာသထိုသမဟုမဟုတ်ပါ။ fsync() သို့မဟုတ် fdatasync(). အမဟန်မဟာ disk ကိုယ်တိုင်လုပ်နိုင်သည်။ နဟောင့်နဟေသသို့မဟုတ် cache အချက်အလက်ရေသသာသရန်အတလက် သင့်လျော်သော command မျာသ။ ပိုဆိုသသည်မဟာ အချို့သော အထူသကိစ္စမျာသတလင် I/O လုပ်ဆောင်ချက်မျာသသည် အလံကိုအသုံသပဌုသည့်အခါ လုပ်ဆောင်သည်။ O_DIRECT, ထုတ်လလဟင့်သည်။ ရိုသရာ buffered operations ထဲသို့။ ကပဌဿနာကိုဖဌေရဟင်သရန် အလလယ်ကူဆုံသနည်သလမ်သမဟာ ဖိုင်မျာသကိုဖလင့်ရန် အလံကိုအသုံသပဌုခဌင်သဖဌစ်သည်။ O_DSYNCဆိုလိုသည်မဟာ စာရေသခဌင်သလုပ်ငန်သတစ်ခုစီသည် ခေါ်ဆိုမဟုတစ်ခုဖဌင့် လုပ်ဆောင်သလာသမည်ဖဌစ်သည်။ fdatasync().

XFS ဖိုင်စနစ်သည် မကဌာသေသမီက "fast path" ကို ထည့်သလင်သခဲ့ကဌောင်သ တလေ့ရဟိရပါသည်။ O_DIRECT|O_DSYNC- ဒေတာမဟတ်တမ်သမျာသ။ အကယ်၍ block ကိုအသုံသပဌု၍ overwrite လုပ်ပါ။ O_DIRECT|O_DSYNCထို့နောက် XFS သည် ကက်ရဟ်ကို ဖယ်ရဟာသခဌင်သအစာသ၊ စက်က ၎င်သကို ပံ့ပိုသပါက FUA ရေသသာသသည့် အမိန့်ကို လုပ်ဆောင်မည်ဖဌစ်သည်။ utility ကို အသုံသပဌု၍ ၎င်သကို ငါစစ်ဆေသခဲ့သည်။ blktrace Linux 5.4/Ubuntu 20.04 စနစ်တလင်။ ၎င်သသည် အနည်သဆုံသဒေတာပမာဏကို disk သို့ရေသပဌီသ လုပ်ဆောင်ချက်နဟစ်ခု (နဟစ်ခုမဟုတ်) (ရေသချပဌီသ ကက်ရဟ်ကိုဖယ်ရဟာသခဌင်သ) ဖဌစ်သောကဌောင့် ကချဉ်သကပ်မဟုသည် ပိုမိုထိရောက်သင့်သည်။ လင့်ခ်တစ်ခုတလေ့တယ်။ ကလမ်သခဌံကုန်သ ကယန္တရာသကိုအကောင်အထည်ဖော်သော 2018 kernel။ က optimization ကိုအခဌာသဖိုင်စနစ်မျာသတလင်အသုံသပဌုခဌင်သနဟင့် ပတ်သက်၍ ဆလေသနလေသမဟုအချို့ရဟိပါသည်၊ သို့သော်ကျလန်ုပ်သိသလောက် XFS သည်၎င်သကိုယခုအချိန်အထိထောက်ပံ့ပေသသောတစ်ခုတည်သသောဖိုင်စနစ်ဖဌစ်သည်။

sync_file_range() လုပ်ဆောင်ချက်

Linux တလင် system call တစ်ခုရဟိသည်။ sync_file_range()၎င်သသည် ဖိုင်တစ်ခုလုံသကိုမဟုတ်ဘဲ ဖိုင်တစ်ပိုင်သကိုသာ ဒစ်ခ်သို့ ဖယ်ရဟာသနိုင်စေပါသည်။ ကခေါ်ဆိုမဟုသည် ချိန်ကိုက်မဟုတစ်ခုအာသ စတင်ပဌီသ ပဌီသမဌောက်ရန် မစောင့်ပါ။ ရည်ညလဟန်သချက်၌ကာသ၊ sync_file_range() ကအမိန့်သည် "အလလန်အန္တရာယ်မျာသ" ဟုဆိုသည်။ ၎င်သကိုအသုံသပဌုရန်မအကဌံပဌုပါ။ အင်္ဂါရပ်မျာသနဟင့်အန္တရာယ်မျာသ sync_file_range() အလလန်ကောင်သမလန်စလာ ဖော်ပဌထာသပါသည်။ က ပစ္စည်သ အထူသသဖဌင့်၊ ကခေါ်ဆိုမဟုသည် kernel မဟ "ညစ်ပတ်သော" ဒေတာကို disk သို့ဖယ်ရဟာသသည့်အခါ ထိန်သချုပ်ရန် RocksDB ကိုအသုံသပဌုပုံရသည်။ သို့သော် တစ်ချိန်တည်သတလင် တည်ငဌိမ်သောဒေတာသိမ်သဆည်သမဟုသေချာစေရန် ၎င်သကိုလည်သအသုံသပဌုသည်။ fdatasync()။ အဆိုပါ ကုဒ် RocksDB တလင် ကအကဌောင်သအရာနဟင့် ပတ်သက်၍ စိတ်ဝင်စာသဖလယ် မဟတ်ချက်အချို့ရဟိသည်။ ဥပမာ၊ ခေါ်ဆိုပုံရသည်။ sync_file_range() ZFS ကိုအသုံသပဌုသောအခါတလင်ဒေတာကို disk သို့မထုတ်ပါ။ အသုံသပဌုခဲသောကုဒ်တလင် ချလတ်ယလင်သချက်မျာသ ပါဝင်နိုင်သည်ဟု အတလေ့အကဌုံက ပဌောပဌသည်။ ထို့ကဌောင့်၊ လုံသဝမလိုအပ်ဘဲ ကစနစ်ခေါ်ဆိုခဌင်သကို အသုံသပဌုခဌင်သမပဌုရန် ကျလန်ုပ်အကဌံပဌုလိုပါသည်။

ဒေတာဆက်မဌဲမဟုရဟိစေရန်အတလက် စနစ်ခေါ်ဆိုမဟုမျာသ

အမဌဲမပဌတ် I/O လုပ်ဆောင်ချက်မျာသကို လုပ်ဆောင်ရန် ချဉ်သကပ်မဟု သုံသခုရဟိကဌောင်သ ကျလန်ုပ် နိဂုံသချုပ်လိုက်ပါသည်။ ၎င်သတို့အာသလုံသသည် function call တစ်ခုလိုအပ်သည်။ fsync() ဖိုင်ကိုဖန်တီသခဲ့သည့်လမ်သညလဟန်အတလက်။ ချဉ်သကပ်ပုံမျာသမဟာ-

  1. လုပ်ဆောင်ချက်ခေါ်ဆိုမဟု fdatasync() သို့မဟုတ် fsync() function ပဌီသနောက် write() (သုံသရင် ပိုကောင်သပါတယ်။ fdatasync()).
  2. အလံတစ်ခုဖဌင့်ဖလင့်ထာသသော ဖိုင်ဖော်ပဌချက်တစ်ခုနဟင့် အလုပ်လုပ်ခဌင်သ။ O_DSYNC သို့မဟုတ် O_SYNC (အလံနဟင့် ပိုကောင်သသည်။ O_DSYNC).
  3. ညလဟန်ကဌာသချက်အသုံသပဌုမဟု pwritev2() အလံနဟင့်အတူ RWF_DSYNC သို့မဟုတ် RWF_SYNC (ဖဌစ်နိုင်ရင် အလံနဲ့ RWF_DSYNC).

စလမ်သဆောင်ရည်မဟတ်စုမျာသ

ငါစုံစမ်သစစ်ဆေသခဲ့သော အမျိုသမျိုသသောယန္တရာသမျာသ၏ စလမ်သဆောင်ရည်ကို ဂရုတစိုက်မတိုင်သတာခဲ့ပါ။ သူတို့ရဲ့ လုပ်ငန်သအရဟိန်အဟုန်မဟာ သတိပဌုမိတဲ့ ကလာခဌာသချက်တလေက အလလန်သေသငယ်ပါတယ်။ ဆိုလိုသည်မဟာ ကျလန်ုပ်မဟာသနိုင်သည်၊ အခဌာသအခဌေအနေမျာသတလင် တူညီသောအရာသည် မတူညီသောရလဒ်မျာသကို ပဌသနိုင်သည်ဟု ဆိုလိုသည်။ ပထမညသစလာ၊ စလမ်သဆောင်ရည်ပို၍သက်ရောက်သည့်အရာမျာသအကဌောင်သ၊ ထို့နောက် စလမ်သဆောင်ရည်လျော့နည်သစေသည့်အရာမျာသအကဌောင်သ ဆလေသနလေသပါမည်။

  1. ဖိုင်ဒေတာကို ထပ်ရေသခဌင်သသည် ဖိုင်တစ်ခုသို့ ဒေတာထပ်ထည့်ခဌင်သထက် ပိုမဌန်သည် (စလမ်သဆောင်ရည်ရရဟိမဟုသည် 2-100%) ရဟိနိုင်ပါသည်။ ဖိုင်တစ်ခုသို့ ဒေတာကို တလဲချိတ်ခဌင်သသည် စနစ်ခေါ်ဆိုပဌီသနောက်တလင်ပင် ဖိုင်၏ မက်တာဒေတာကို ထပ်လောင်သပဌောင်သလဲမဟု လိုအပ်ပါသည်။ fallocate()သို့သော် ကအကျိုသသက်ရောက်မဟုပမာဏ ကလဲပဌာသနိုင်သည်။ အကောင်သဆုံသစလမ်သဆောင်ရည်အတလက် ဖုန်သခေါ်ဆိုရန် အကဌံပဌုအပ်ပါသည်။ fallocate() လိုအပ်သောနေရာကို ကဌိုတင်ခလဲဝေပေသရန်။ ထို့နောက် ကနေရာကို သုညဖဌင့် အတိအလင်သဖဌည့်ပဌီသ ခေါ်ရပါမည်။ fsync(). ၎င်သသည် ဖိုင်စနစ်ရဟိ ဆက်စပ်ပိတ်ဆို့မဟုမျာသကို "ခလဲဝေမထာသသော" အစာသ "ခလဲဝေသတ်မဟတ်ခဌင်သ" အဖဌစ် အမဟတ်အသာသပဌုစေမည်ဖဌစ်သည်။ ၎င်သသည် စလမ်သဆောင်ရည် အနည်သငယ် (2%) ခန့် တိုသတက်မဟုကို ပေသသည်။ ထို့အပဌင်၊ အချို့သောဒစ်မျာသသည် အခဌာသအရာမျာသထက် ပထမဘလောက်ဝင်ရောက်လည်ပတ်မဟု နဟေသကလေသသလာသနိုင်သည်။ ဆိုလိုသည်မဟာ နေရာကို သုညဖဌင့် ဖဌည့်သလင်သခဌင်သဖဌင့် သိသာထင်ရဟာသသော (100%) စလမ်သဆောင်ရည် တိုသတက်မဟုကို ဖဌစ်ပေါ်စေနိုင်သည်။ အထူသသဖဌင့်၊ ၎င်သသည် disks မျာသနဟင့်ဖဌစ်ပလာသနိုင်သည်။ AWS EBS (ဒါကတရာသဝင်မဟုတ်တဲ့အချက်အလက်ပါ၊ ငါသူတို့ကိုအတည်မပဌုနိုင်ဘူသ)။ Storage မဟာလည်သ အလာသတူပါပဲ။ GCP Persistent Disk (၎င်သသည် တရာသဝင်အချက်အလက်ဖဌစ်ပဌီသ၊ စမ်သသပ်မဟုမျာသဖဌင့် အတည်ပဌုပဌီသသာသဖဌစ်သည်)။ တခဌာသ ပညာရဟင်တလေလည်သ ဒီလိုပါပဲ။ လေ့လာရေသမတူညီသော disk မျာသနဟင့်သက်ဆိုင်သည်။
  2. စနစ်ခေါ်ဆိုမဟု နည်သပါသလေ၊ စလမ်သဆောင်ရည် မဌင့်မာသလေ (အမဌတ် 5%) ခန့် ရဟိနိုင်ပါသည်။ ခေါ်ပုံရသည်။ open() အလံနဟင့်အတူ O_DSYNC သို့မဟုတ် ဖုန်သခေါ်ဆိုပါ။ pwritev2() အလံနဟင့်အတူ RWF_SYNC မဌန်မဌန်ခေါ်ပါ။ fdatasync(). ကနေရာတလင် အဓိကအချက်မဟာ ကချဉ်သကပ်မဟုဖဌင့်၊ တူညီသောလုပ်ငန်သတာဝန်ကိုဖဌေရဟင်သရန် (ခေါ်ဆိုမဟုနဟစ်ခုအစာသ ခေါ်ဆိုမဟုတစ်ခုအစာသ) နည်သပါသသောစနစ်ခေါ်ဆိုမဟုမျာသ လုပ်ဆောင်ရမည်ဟု ကျလန်ုပ်သံသယရဟိပါသည်။ သို့သော် စလမ်သဆောင်ရည်ကလာခဌာသချက်မဟာ အလလန်သေသငယ်သောကဌောင့် သင်သည် ၎င်သကို အလလယ်တကူ လျစ်လျူရဟုနိုင်ပဌီသ ၎င်သ၏ယုတ္တိဗေဒ၏ ရဟုပ်ထလေသမဟုကို မဖဌစ်ပေါ်စေသည့် အပလီကေသရဟင်သတလင် တစ်ခုခုကို အသုံသပဌုနိုင်သည်။

ရေရဟည်တည်တံ့သော ဒေတာသိမ်သဆည်သခဌင်သဆိုင်ရာ ခေါင်သစဉ်ကို သင်စိတ်ဝင်စာသပါက၊ ကအရာမျာသသည် အသုံသဝင်သော ပစ္စည်သအချို့ဖဌစ်သည်။

  • I/O အသုံသပဌုခလင့်နည်သလမ်သမျာသ - အဝင်/အထလက် ယန္တရာသမျာသ၏ အခဌေခံ ခဌုံငုံသုံသသပ်ချက်။
  • ဒေတာ ဒစ်ခ်သို့ ရောက်ရဟိကဌောင်သ သေချာစေပါသည်။ - အပလီကေသရဟင်သမဟဒစ်သို့သလာသရာလမ်သရဟိဒေတာမျာသဖဌစ်ပျက်ပုံအကဌောင်သဇာတ်လမ်သ။
  • ပါဝင်သောလမ်သညလဟန်ကို မည်သည့်အချိန်တလင် စင့်ခ်လုပ်သင့်သနည်သ။ - လျဟောက်ထာသရမည့်အချိန်၏မေသခလန်သ၏အဖဌေ fsync() လမ်သညလဟန်မျာသအတလက်။ အတိုချုပ်အာသဖဌင့်၊ ဖိုင်အသစ်တစ်ခုဖန်တီသသောအခါတလင် သင်သည် ၎င်သကိုလုပ်ဆောင်ရန် လိုအပ်ကဌောင်သ ထလက်ပေါ်လာပဌီသ ကအကဌံပဌုချက်အတလက် အကဌောင်သရင်သမဟာ Linux တလင် တူညီသောဖိုင်ကို ကိုသကာသမဟုမျာသစလာရဟိနိုင်သောကဌောင့်ဖဌစ်သည်။
  • Linux ရဟိ SQL Server- FUA အတလင်သပိုင်သ - ကနေရာတလင် Linux ပလပ်ဖောင်သပေါ်ရဟိ SQL Server တလင် အဆက်မပဌတ်ဒေတာသိုလဟောင်မဟုကို မည်ကဲ့သို့လုပ်ဆောင်ကဌောင်သ ဖော်ပဌချက်ဖဌစ်သည်။ ကနေရာတလင် Windows နဟင့် Linux စနစ်ခေါ်ဆိုမဟုမျာသအကဌာသ စိတ်ဝင်စာသစရာကောင်သသော နဟိုင်သယဟဉ်ချက်အချို့ရဟိသည်။ XFS ၏ FUA ပိုမိုကောင်သမလန်အောင်ပဌုလုပ်ခဌင်သအကဌောင်သ လေ့လာသိရဟိခဲ့သော ကအကဌောင်သအရာကဌောင့် ကျေသဇူသတင်ကဌောင်သ သေချာပါသည်။

ဒစ်ပေါ်တလင် လုံခဌုံစလာသိမ်သဆည်သထာသသည်ဟု သင်ထင်ထာသသည့် ဒေတာမျာသ ဆုံသရဟုံသဖူသပါသလာသ။

တာရဟည်ခံဒေတာသိုလဟောင်မဟုနဟင့် Linux ဖိုင် API မျာသ

တာရဟည်ခံဒေတာသိုလဟောင်မဟုနဟင့် Linux ဖိုင် API မျာသ

source: www.habr.com