eBPF/BCC ကို အသုံသပဌု၍ High Ceph Latency မဟ Kernel Patch သို့

eBPF/BCC ကို အသုံသပဌု၍ High Ceph Latency မဟ Kernel Patch သို့

Linux တလင် kernel နဟင့် အပလီကေသရဟင်သမျာသကို အမဟာသရဟာရန် ကိရိယာမျာသစလာရဟိသည်။ ၎င်သတို့ထဲမဟ အမျာသစုသည် အက်ပလီကေသရဟင်သစလမ်သဆောင်ရည်အပေါ် အပျက်သဘောဆောင်သော သက်ရောက်မဟုရဟိပဌီသ ထုတ်လုပ်ရေသတလင် အသုံသမပဌုနိုင်ပါ။

လလန်ခဲ့တဲ့ နဟစ်နဟစ်လောက်က ရဟိခဲ့တယ်။ အခဌာသ tool ကိုတီထလင်ခဲ့သည်။ - eBPF ၎င်သသည် kernel နဟင့် user applications မျာသကို low overhead ဖဌင့် ခဌေရာခံနိုင်ပဌီသ ပရိုဂရမ်မျာသကို ပဌန်လည်တည်ဆောက်ရန်နဟင့် kernel အတလင်သသို့ ပဌင်ပမဟ module မျာသကို တင်ရန်မလိုအပ်ဘဲ ခဌေရာခံနိုင်စေသည်။

eBPF ကိုအသုံသပဌုသည့် အသုံသချပလီကေသရဟင်သမျာသစလာရဟိနေပဌီဖဌစ်ပဌီသ၊ ကဆောင်သပါသတလင် စာကဌည့်တိုက်ကိုအခဌေခံ၍ သင်၏ကိုယ်ပိုင် profileing utility ကိုမည်သို့ရေသသာသရမည်ကိုကဌည့်ရဟုပါမည်။ PythonBCC. ဆောင်သပါသသည် တကယ့်အဖဌစ်အပျက်မျာသကို အခဌေခံထာသသည်။ သတ်သတ်မဟတ်မဟတ်အခဌေအနေမျာသတလင် ရဟိပဌီသသာသ utilities မျာသကိုမည်သို့အသုံသပဌုနိုင်ကဌောင်သပဌသရန် ပဌဿနာမျာသမဟဖဌေရဟင်သရန် ကျလန်ုပ်တို့သလာသပါမည်။

Ceph နဟေသတယ်။

လက်ခံသူအသစ်ကို Ceph အစုအဝေသသို့ ပေါင်သထည့်ထာသသည်။ ဒေတာအချို့ကို ၎င်သထံ ပဌောင်သရလဟေ့ပဌီသနောက်၊ ၎င်သမဟ ရေသသာသတောင်သဆိုမဟုမျာသကို လုပ်ဆောင်ခဌင်သ၏အမဌန်နဟုန်သသည် အခဌာသဆာဗာမျာသထက် မျာသစလာနိမ့်ကျသည်ကို သတိပဌုမိပါသည်။

eBPF/BCC ကို အသုံသပဌု၍ High Ceph Latency မဟ Kernel Patch သို့
အခဌာသပလပ်ဖောင်သမျာသနဟင့်မတူဘဲ၊ ကအိမ်ရဟင်သည် bcache နဟင့် linux 4.15 kernel အသစ်ကို အသုံသပဌုခဲ့သည်။ ကဖလဲ့စည်သပုံကို ကနေရာတလင် ပထမဆုံသအကဌိမ် အသုံသပဌုခဌင်သဖဌစ်သည်။ ထိုအချိန်တလင် ပဌဿနာ၏ အရင်သမဌစ်သည် သီအိုရီအရ မည်သည့်အရာမဆို ဖဌစ်နိုင်ကဌောင်သ ထင်ရဟာသပါသည်။

အိမ်ရဟင်ကို စုံစမ်သစစ်ဆေသခဌင်သ။

ceph-osd လုပ်ငန်သစဉ်အတလင်သ ဘာတလေဖဌစ်မလဲဆိုတာကို ကဌည့်ကဌရအောင်။ ဒီအတလက် ကျလန်တော်တို့ သုံသမယ်။ ပဌီသပဌည့်စုံသော О flamescope (နောက်ထပ် သင်ဖတ်ရဟုနိုင်သည် ဒီမဟာ):

eBPF/BCC ကို အသုံသပဌု၍ High Ceph Latency မဟ Kernel Patch သို့
ပုံက function ကိုပဌောပဌတယ်။ fdatasync() လုပ်ငန်သဆောင်တာမျာသသို့ တောင်သဆိုချက်တစ်ခုပေသပို့ရန် အချိန်မျာသစလာ ကုန်ဆုံသခဲ့သည်။ generic_make_request(). ဆိုလိုသည်မဟာ ပဌဿနာမျာသ၏ အကဌောင်သရင်သမဟာ osd daemon ကိုယ်တိုင်၏ အပဌင်ဘက်တစ်နေရာတလင် ရဟိနေသည်ဟု ဆိုလိုသည်။ ၎င်သသည် kernel သို့မဟုတ် disk မျာသဖဌစ်နိုင်သည်။ iostat output သည် bcache disks မျာသမဟ တောင်သဆိုမဟုမျာသကို လုပ်ဆောင်ရာတလင် ကဌာမဌင့်ချိန်ကို ပဌသခဲ့သည်။

host ကိုစစ်ဆေသသောအခါ၊ systemd-udevd daemon သည် cores အမျာသအပဌာသတလင် 20% ခန့် CPU time အမျာသအပဌာသစာသသုံသသည်ကိုတလေ့ရဟိရသည်။ ဒါက ထူသဆန်သတဲ့ အပဌုအမူဖဌစ်လို့ ဘာကဌောင့်လဲဆိုတာ သိဖို့ လိုပါတယ်။ Systemd-udevd သည် uevents မျာသနဟင့်အလုပ်လုပ်သောကဌောင့်၊ ၎င်သတို့ကိုကဌည့်ရဟုရန်ဆုံသဖဌတ်ခဲ့သည်။ udevadm မော်နီတာ. စနစ်ရဟိ ဘလောက်ကိရိယာတစ်ခုစီအတလက် ပဌောင်သလဲမဟုဖဌစ်ရပ်မျာသစလာကို ထုတ်ပေသခဲ့ကဌောင်သ တလေ့ရဟိရပါသည်။ ဒါဟာ အတော်လေသကို ဆန်သကဌယ်တဲ့အတလက် ဒီဖဌစ်ရပ်တလေအာသလုံသကို ဖဌစ်ပေါ်စေတဲ့ အရာတလေကို ကဌည့်ရပါလိမ့်မယ်။

BCC Toolkit ကိုအသုံသပဌုခဌင်သ။

ကျလန်ုပ်တို့သိရဟိထာသပဌီသဖဌစ်သည့်အတိုင်သ၊ kernel (စနစ်ခေါ်ဆိုမဟုတလင် ceph daemon) သည် အချိန်မျာသစလာကုန်ဆုံသသည်။ generic_make_request(). ဒီလုပ်ဆောင်ချက်ရဲ့ အမဌန်နဟုန်သကို တိုင်သတာကဌည့်ရအောင်။ IN BCC အံ့သဌစရာကောင်သတဲ့ အသုံသဝင်မဟုတစ်ခု ရဟိနေပဌီ- Funclatency. အထလက်မျာသနဟင့် ရလဒ်ကို မီလီစက္ကန့်အတလင်သ ထုတ်ပေသခဌင်သကဌာသ 1 စက္ကန့်ကဌာသကာလဖဌင့် daemon ကို ၎င်သ၏ PID ဖဌင့် ခဌေရာခံပါမည်။

eBPF/BCC ကို အသုံသပဌု၍ High Ceph Latency မဟ Kernel Patch သို့
ကအင်္ဂါရပ်သည် အမျာသအာသဖဌင့် လျင်မဌန်စလာ အလုပ်လုပ်ပါသည်။ ၎င်သအရာအာသလုံသသည် စက်ပစ္စည်သဒရိုင်ဘာတန်သစီသို့ တောင်သဆိုချက်ကို ပေသပို့ခဌင်သဖဌစ်သည်။

Bcache အမဟန်တကယ်တော့ disk သုံသခုပါ၀င်တဲ့ ရဟုပ်ထလေသတဲ့ကိရိယာတစ်ခုဖဌစ်ပါတယ်။

  • ကျောထောက်နောက်ခံကိရိယာ (cached disk) ကကိစ္စတလင်၎င်သသည်နဟေသကလေသသော HDD ဖဌစ်သည်။
  • caching device (caching disk)၊ ကတလင်၎င်သသည် NVMe ကိရိယာ၏အပိုင်သတစ်ခုဖဌစ်သည်။
  • အပလီကေသရဟင်သလည်ပတ်သည့် bcache virtual ကိရိယာ။

တောင်သဆိုချက် ပေသပို့မဟု နဟေသကလေသကဌောင်သ ကျလန်ုပ်တို့ သိထာသသော်လည်သ ကစက်ပစ္စည်သမျာသထဲမဟ မည်သည့်အတလက်ကဌောင့်လဲ။ ဒါကို ငါတို့ နည်သနည်သကဌာမဟ ဖဌေရဟင်သမယ်။

အဖဌစ်အပျက်မျာသသည် ပဌဿနာမျာသဖဌစ်စေနိုင်ဖလယ်ရဟိကဌောင်သ ယခု ကျလန်ုပ်တို့သိပါသည်။ သူတို့ရဲ့ မျိုသဆက်တလေကို အတိအကျ ရဟာတလေ့ဖို့က သိပ်မလလယ်ပါဘူသ။ ၎င်သသည် အခါအာသလျော်စလာ ထလက်ရဟိသည့် ဆော့ဖ်ဝဲလ်တစ်မျိုသဖဌစ်သည်ဟု ယူဆကဌပါစို့။ script ကိုအသုံသပဌု၍ system ပေါ်တလင်မည်သည့်ဆော့ဖ်ဝဲကိုလုပ်ဆောင်သည်ကိုကဌည့်ကဌပါစို့ execsnoop အတူတူပါပဲ။ BCC အသုံသဝင်ပစ္စည်သအစုံ. အဲဒါကို run ပဌီသ output ကို ဖိုင်တစ်ခုဆီ ပို့လိုက်ကဌရအောင်။

ဥပမာ ကကဲ့သို့သော

/usr/share/bcc/tools/execsnoop  | tee ./execdump

ကနေရာတလင် execsnoop ၏ အပဌည့်အ၀ကို ပဌသမည်မဟုတ်သော်လည်သ ကျလန်ုပ်တို့အတလက် စိတ်ဝင်စာသသည့် စာကဌောင်သတစ်ကဌောင်သမဟာ ကကဲ့သို့ဖဌစ်သည်-

sh 1764905 5802 0 sudo arcconf getconfig 1 AD | grep Temperature | awk -F '[:/]' '{print $2}' | sed 's/^ ([0-9]*) C.*/1/'

တတိယကော်လံသည် လုပ်ငန်သစဉ်၏ PPID (ပင်မ PID) ဖဌစ်သည်။ PID 5802 ပါသော လုပ်ငန်သစဉ်သည် ကျလန်ုပ်တို့၏ စောင့်ကဌည့်ရေသစနစ်၏ လမ်သကဌောင်သမျာသထဲမဟ တစ်ခုဖဌစ်လာခဲ့သည်။ စောင့်ကဌည့်ရေသစနစ်၏ ဖလဲ့စည်သမဟုပုံစံကို စစ်ဆေသသောအခါ မဟာသယလင်သသော ဘောင်မျာသကို တလေ့ရဟိခဲ့သည်။ HBA adapter ၏ အပူချိန်ကို စက္ကန့် 30 တိုင်သတိုင်သသည်၊ ၎င်သသည် လိုအပ်သည်ထက် မကဌာခဏ ပိုပါသည်။ စစ်ဆေသမဟုကဌာသကာလကို ပိုရဟည်သည့်တစ်ခုသို့ ပဌောင်သပဌီသနောက်၊ က host တလင် တောင်သဆိုချက်လုပ်ဆောင်ခဌင်သ အချိန်ကဌာချိန်သည် အခဌာသ host မျာသနဟင့် နဟိုင်သယဟဉ်ပါက ထူသခဌာသကဌောင်သ တလေ့ရဟိရပါသည်။

သို့သော် bcache စက်ပစ္စည်သသည် အဘယ်ကဌောင့် ကမျဟနဟေသကလေသသည်ကို မသိရသေသပါ။ ကျလန်ုပ်တို့သည် ထပ်တူပုံစံဖလဲ့စည်သမဟုတစ်ခုဖဌင့် စမ်သသပ်ပလပ်ဖောင်သတစ်ခုကို ပဌင်ဆင်ခဲ့ပဌီသ uevents မျာသထုတ်လုပ်ရန်အတလက် အခါအာသလျော်စလာ fio bcache ကိုဖလင့်ကာ udevadm trigger ကိုအသုံသပဌုခဌင်သဖဌင့် ပဌဿနာကိုပဌန်လည်ထုတ်လုပ်ရန်ကဌိုသစာသခဲ့သည်။

BCC-Based Tools မျာသရေသသာသခဌင်သ။

အနဟေသဆုံသခေါ်ဆိုမဟုမျာသကို ခဌေရာခံရန်နဟင့် အနဟေသဆုံသခေါ်ဆိုမဟုမျာသကို ပဌသရန် ရိုသရဟင်သသော utility တစ်ခုကို ရေသကဌည့်ကဌပါစို့ generic_make_request(). ကလုပ်ဆောင်ချက်ကို ခေါ်သည့် drive အမည်ကိုလည်သ ကျလန်ုပ်တို့ စိတ်ဝင်စာသပါသည်။

အစီအစဉ်သည် ရိုသရဟင်သသည်-

  • မဟတ်ပုံတင်ပါ။ kprobe အပေါ် generic_make_request():
    • ကျလန်ုပ်တို့သည် function argument မဟတဆင့်ဝင်ရောက်နိုင်သော disk အမည်ကို memory တလင်သိမ်သဆည်သပါသည်။
    • ကျလန်ုပ်တို့သည် အချိန်တံဆိပ်ကို သိမ်သဆည်သပါသည်။

  • မဟတ်ပုံတင်ပါ။ kretprobe မဟပဌန်လာဘို့ generic_make_request():
    • ကျလန်ုပ်တို့သည် လက်ရဟိအချိန်တံဆိပ်ကို ရရဟိပါသည်။
    • ကျလန်ုပ်တို့သည် သိမ်သဆည်သထာသသော အချိန်တံဆိပ်ကို ရဟာဖလေပဌီသ ၎င်သကို လက်ရဟိအချိန်နဟင့် နဟိုင်သယဟဉ်ပါ။
    • ရလဒ်သည် သတ်မဟတ်ထာသသော တစ်ခုထက် ကဌီသပါက၊ သိမ်သဆည်သထာသသော ဒစ်ခ်အမည်ကို တလေ့ရဟိပဌီသ ၎င်သကို terminal တလင် ပဌသမည်ဖဌစ်သည်။

Kprobes О kretprobes လုပ်ဆောင်ချက်ကုဒ်ကို အမဌန်ပဌောင်သရန် breakpoint ယန္တရာသကို အသုံသပဌုပါ။ ဖတ်လို့ရတယ်။ စာရလက်စာတမ်သ О ကောင်သတယ် ကအကဌောင်သအရာအပေါ်ဆောင်သပါသ။ အမျိုသမျိုသသော utilities မျာသတလင် ကုဒ်မျာသကို လေ့လာကဌည့်လျဟင် BCCဒါဆိုရင် သူတို့မဟာ တူညီတဲ့ဖလဲ့စည်သပုံရဟိတယ်ဆိုတာ သင်တလေ့နိုင်ပါတယ်။ ထို့ကဌောင့် ကဆောင်သပါသတလင် ကျလန်ုပ်တို့သည် ခလဲခဌမ်သစိတ်ဖဌာထာသသော ဇာတ်ညလဟန်သဆိုင်ရာ အငဌင်သအခုံမျာသကို ကျော်သလာသကာ BPF ပရိုဂရမ်သို့ ဆက်သလာသပါမည်။

python script အတလင်သရဟိ eBPF စာသာသသည် ကကဲ့သို့ ဖဌစ်သည်-

bpf_text = “”” # Here will be the bpf program code “””

လုပ်ဆောင်ချက်မျာသအကဌာသ ဒေတာဖလဟယ်ရန် eBPF ပရိုဂရမ်မျာသကို အသုံသပဌုသည်။ hash ဇယာသမျာသ. အတူတူလုပ်မယ်။ ကျလန်ုပ်တို့သည် လုပ်ငန်သစဉ် PID ကို သော့အဖဌစ်အသုံသပဌုပဌီသ တည်ဆောက်ပုံကို တန်ဖိုသအဖဌစ် သတ်မဟတ်ပါမည်-

struct data_t {
	u64 pid;
	u64 ts;
	char comm[TASK_COMM_LEN];
	u64 lat;
	char disk[DISK_NAME_LEN];
};

BPF_HASH(p, u64, struct data_t);
BPF_PERF_OUTPUT(events);

ကတလင်ကျလန်ုပ်တို့ခေါ်သော hash table ကိုစာရင်သသလင်သပါ။ pသော့အမျိုသအစာသဖဌင့်၊ u64 အမျိုသအစာသ၏တန်ဖိုသ struct data_t. ကျလန်ုပ်တို့၏ BPF ပရိုဂရမ်၏ အခဌေအနေတလင် ဇယာသကို ရရဟိနိုင်ပါသည်။ BPF_PERF_OUTPUT မက်ခရိုသည် ခေါ်သော အခဌာသဇယာသကို မဟတ်ပုံတင်သည်။ ဖဌစ်ရပ်မျာသ, မျာသအတလက်အသုံသပဌုသည်။ ဒေတာထုတ်လလဟင့်မဟု အသုံသပဌုသူအာကာသထဲသို့။

လုပ်ဆောင်ချက်တစ်ခုခေါ်ဆိုခဌင်သနဟင့် ၎င်သမဟပဌန်လာခဌင်သကဌာသ နဟောင့်နဟေသမဟုကို တိုင်သတာသည့်အခါ သို့မဟုတ် မတူညီသောလုပ်ဆောင်ချက်မျာသသို့ ခေါ်ဆိုမဟုမျာသကဌာသတလင်၊ လက်ခံရရဟိသည့်ဒေတာသည် တူညီသောအကဌောင်သအရာနဟင့်သက်ဆိုင်ကဌောင်သ ထည့်သလင်သစဉ်သစာသရန် လိုအပ်ပါသည်။ တစ်နည်သဆိုရသော်၊ ဖဌစ်နိုင်ချေရဟိသော အပဌိုင်လုပ်ဆောင်မဟုမျာသ၏ လုပ်ဆောင်ချက်မျာသကို မဟတ်သာသထာသရန် လိုအပ်သည်။ လုပ်ငန်သစဉ်တစ်ခု၏အခဌေအနေတလင် လုပ်ဆောင်ချက်တစ်ခုအာသ ခေါ်ဆိုခဌင်သနဟင့် အခဌာသလုပ်ငန်သစဉ်တစ်ခု၏အခဌေအနေတလင် ထိုလုပ်ဆောင်ချက်မဟ ပဌန်လာခဌင်သအကဌာသ latency ကို တိုင်သတာနိုင်သော်လည်သ ၎င်သသည် အသုံသမဝင်ဖလယ်ရဟိသည်။ ကနေရာတလင် ဥပမာကောင်သတစ်ခု ဖဌစ်လိမ့်မည်။ biolatency အသုံသဝင်မဟုhash table key ကို pointer မဟ သတ်မဟတ်သည်။ struct တောင်သဆိုချက်တစ်ခုသော disk တောင်သဆိုချက်ကို ရောင်ပဌန်ဟပ်သည့်၊

ထို့နောက်၊ လေ့လာမဟုအောက်ရဟိ function ကိုခေါ်သောအခါတလင်လည်ပတ်မည့်ကုဒ်ကိုရေသရန်လိုအပ်သည်-

void start(struct pt_regs *ctx, struct bio *bio) {
	u64 pid = bpf_get_current_pid_tgid();
	struct data_t data = {};
	u64 ts = bpf_ktime_get_ns();
	data.pid = pid;
	data.ts = ts;
	bpf_probe_read_str(&data.disk, sizeof(data.disk), (void*)bio->bi_disk->disk_name);
	p.update(&pid, &data);
}

ကနေရာတလင် ခေါ်ထာသသော function ၏ ပထမအငဌင်သအခုံကို ဒုတိယအငဌင်သအခုံအဖဌစ် အစာသထိုသမည်ဖဌစ်သည်။ generic_make_request(). ၎င်သနောက်၊ ကျလန်ုပ်တို့လုပ်ဆောင်နေသည့်အခဌေအနေတလင် လုပ်ငန်သစဉ်၏ PID နဟင့် လက်ရဟိအချိန်တံဆိပ်ကို နာနိုစက္ကန့်အတလင်သ ရရဟိပါသည်။ ကျလန်ုပ်တို့သည် ၎င်သအာသလုံသကို လတ်လတ်ဆတ်ဆတ် ရလေသချယ်ထာသသော ပုံစံဖဌင့် ချရေသပါ။ struct data_t ဒေတာ. ကျလန်ုပ်တို့သည် ဖလဲ့စည်သပုံမဟ disk အမည်ကို ရယူသည်။ ဇီဝခေါ်သောအခါ လလန်သလာသသော၊ generic_make_request()၊ တူညီသောဖလဲ့စည်သပုံတလင်သိမ်သဆည်သပါ။ ဒေတာ. နောက်ဆုံသအဆင့်မဟာ စောစောကဖော်ပဌခဲ့သော hash table သို့ entry ကိုထည့်ရန်ဖဌစ်သည်။

အောက်ပါ function ကို return from ဟုခေါ်ပါမည်။ generic_make_request():

void stop(struct pt_regs *ctx) {
    u64 pid = bpf_get_current_pid_tgid();
    u64 ts = bpf_ktime_get_ns();
    struct data_t* data = p.lookup(&pid);
    if (data != 0 && data->ts > 0) {
        bpf_get_current_comm(&data->comm, sizeof(data->comm));
        data->lat = (ts - data->ts)/1000;
        if (data->lat > MIN_US) {
            FACTOR
            data->pid >>= 32;
            events.perf_submit(ctx, data, sizeof(struct data_t));
        }
        p.delete(&pid);
    }
}

ကလုပ်ဆောင်ချက်သည် ယခင်လုပ်ဆောင်ချက်နဟင့် ဆင်တူသည်- ကျလန်ုပ်တို့သည် လုပ်ငန်သစဉ်၏ PID နဟင့် အချိန်တံဆိပ်ကို ရဟာဖလေသော်လည်သ ဒေတာဖလဲ့စည်သပုံအသစ်အတလက် မဟတ်ဉာဏ်ကို ခလဲဝေမထာသပါ။ ယင်သအစာသ၊ ကျလန်ုပ်တို့သည် သော့ == လက်ရဟိ PID ကို အသုံသပဌု၍ ရဟိနဟင့်ပဌီသသာသ ဖလဲ့စည်သပုံအတလက် hash table ကို ရဟာဖလေသည်။ ဖလဲ့စည်သတည်ဆောက်ပုံကို တလေ့ရဟိပါက၊ ကျလန်ုပ်တို့သည် လုပ်ဆောင်နေသည့် လုပ်ငန်သစဉ်အမည်ကို ရဟာဖလေပဌီသ ၎င်သတလင် ထည့်သလင်သပါ။

thread GID ကိုရယူရန် ကနေရာတလင် ကျလန်ုပ်တို့အသုံသပဌုသည့် binary shift သည် လိုအပ်ပါသည်။ အဲဒါတလေ ကျလန်ုပ်တို့လုပ်ဆောင်နေသည့်အကဌောင်သအရာတလင် thread ကိုစတင်သည့် အဓိကလုပ်ငန်သစဉ်၏ PID။ Function လို့ခေါ်တယ်။ bpf_get_current_pid_tgid() thread ၏ GID နဟင့် ၎င်သ၏ PID နဟစ်ခုလုံသကို 64-bit တန်ဖိုသတစ်ခုတည်သဖဌင့် ပဌန်ပေသသည်။

terminal သို့ ထုတ်ပေသသည့်အခါ၊ ကျလန်ုပ်တို့သည် လောလောဆယ်တလင် thread ကို စိတ်မဝင်စာသသော်လည်သ ပင်မလုပ်ငန်သစဉ်ကို စိတ်ဝင်စာသပါသည်။ ပေသထာသသော အဆင့်တစ်ခုနဟင့် ရလဒ်နဟောင့်နဟေသမဟုကို နဟိုင်သယဟဉ်ပဌီသနောက်၊ ကျလန်ုပ်တို့၏ ဖလဲ့စည်သပုံကို ကျော်သလာသပါသည်။ ဒေတာ ဇယာသမဟတဆင့် user space ထဲသို့ ဖဌစ်ရပ်မျာသထို့နောက် ကျလန်ုပ်တို့သည် ဝင်ခလင့်ကို ဖျက်လိုက်ပါသည်။ p.

ကကုဒ်ကိုဖလင့်မည့် python script တလင်၊ ကျလန်ုပ်တို့သည် MIN_US နဟင့် FACTOR ကို နဟောင့်နဟေသမဟုအဆင့်မျာသနဟင့် အချိန်ယူနစ်မျာသဖဌင့် အစာသထိုသရန်လိုအပ်သည်၊၊

bpf_text = bpf_text.replace('MIN_US',str(min_usec))
if args.milliseconds:
	bpf_text = bpf_text.replace('FACTOR','data->lat /= 1000;')
	label = "msec"
else:
	bpf_text = bpf_text.replace('FACTOR','')
	label = "usec"

ယခုကျလန်ုပ်တို့မဟတစ်ဆင့် BPF ပရိုဂရမ်ကိုပဌင်ဆင်ရန်လိုအပ်သည်။ BPF ရိုက်လို့ရတယ်။ နမူနာမျာသကို စာရင်သသလင်သပါ-

b = BPF(text=bpf_text)
b.attach_kprobe(event="generic_make_request",fn_name="start")
b.attach_kretprobe(event="generic_make_request",fn_name="stop")

ဆုံသဖဌတ်ရပါလိမ့်မယ်။ struct data_t ကျလန်ုပ်တို့၏ ဇာတ်ညလဟန်သတလင်၊ မဟုတ်ပါက ကျလန်ုပ်တို့သည် မည်သည့်အရာကိုမျဟ ဖတ်နိုင်မည်မဟုတ်ပါ-

TASK_COMM_LEN = 16	# linux/sched.h
DISK_NAME_LEN = 32	# linux/genhd.h
class Data(ct.Structure):
	_fields_ = [("pid", ct.c_ulonglong),
            	("ts", ct.c_ulonglong),
            	("comm", ct.c_char * TASK_COMM_LEN),
            	("lat", ct.c_ulonglong),
            	("disk",ct.c_char * DISK_NAME_LEN)]

နောက်ဆုံသအဆင့်မဟာ terminal သို့ data ထုတ်ပေသရန်ဖဌစ်သည်

def print_event(cpu, data, size):
    global start
    event = ct.cast(data, ct.POINTER(Data)).contents
    if start == 0:
        start = event.ts
    time_s = (float(event.ts - start)) / 1000000000
    print("%-18.9f %-16s %-6d   %-1s %s   %s" % (time_s, event.comm, event.pid, event.lat, label, event.disk))

b["events"].open_perf_buffer(print_event)
# format output
start = 0
while 1:
    try:
        b.perf_buffer_poll()
    except KeyboardInterrupt:
        exit()

ဇာတ်ညလဟန်သကိုယ်တိုင်က ရနိုင်ပါတယ်။ GITHub. fio လည်ပတ်နေသည့် စမ်သသပ်ပလက်ဖောင်သပေါ်တလင် ၎င်သကို bcache သို့ စာရေသပဌီသ udevadm monitor ကို ခေါ်ကဌပါစို့။

eBPF/BCC ကို အသုံသပဌု၍ High Ceph Latency မဟ Kernel Patch သို့
နောက်ဆုံသတော့! ရပ်တန့်နေသည့် bcache စက်နဟင့်တူသည့်အရာသည် အမဟန်တကယ် ရပ်တန့်နေသည့်ခေါ်ဆိုမဟုဖဌစ်ကဌောင်သ ယခုကျလန်ုပ်တို့မဌင်သည်။ generic_make_request() ကက်ရဟ်ဒစ်တစ်ခုအတလက်။

Kernel ကိုတူသပါ။

တောင်သဆိုချက် ပေသပို့မဟုတလင် အတိအကျ အဘယ်အရာ နဟေသကလေသနေသနည်သ။ တောင်သဆိုမဟုစာရင်သပဌုစုခဌင်သမစတင်မီတလင်ပင် ကဌန့်ကဌာမဟုဖဌစ်ပေါ်သည်ကို ကျလန်ုပ်တို့မဌင်ရသည်၊ ဆိုလိုသည်မဟာ၊ ၎င်သတလင် စာရင်သဇယာသမျာသ၏ နောက်ထပ်ထလက်ရဟိမဟုအတလက် သီသခဌာသတောင်သဆိုချက် (/proc/diskstats သို့မဟုတ် iostat) ကို စာရင်သပဌုစုခဌင်သမဟာ မစတင်သေသပါ။ ပဌဿနာကို ပဌန်လည်ထုတ်လုပ်နေစဉ်တလင် iostat ကိုအသုံသပဌုခဌင်သဖဌင့် ၎င်သကို အလလယ်တကူအတည်ပဌုနိုင်သည်။ BCC script biolatencyတောင်သဆိုမဟုစာရင်သအင်သ၏အစနဟင့်အဆုံသအပေါ်အခဌေခံသည်။ ကက်ရဟ်ဒစ်သို့ တောင်သဆိုမဟုမျာသအတလက် ကအသုံသအဆောင်မျာသ တစ်ခုမဟ ပဌဿနာမျာသကို ပဌသမည်မဟုတ်ပါ။

function ကိုကဌည့်မယ်ဆိုရင် generic_make_request()၊ ထို့နောက် တောင်သဆိုချက်သည် စာရင်သကိုင်ခဌင်သမစတင်မီတလင် နောက်ထပ် လုပ်ဆောင်ချက်မျာသ နဟစ်ခုကို ခေါ်ဆိုကဌောင်သ ကျလန်ုပ်တို့တလေ့ရပါမည်။ ပထမ- generic_make_request_checks()၊ ဒစ်ခ်ဆက်တင်မျာသနဟင့်ပတ်သက်၍ တောင်သဆိုချက်၏တရာသဝင်မဟုကို စစ်ဆေသမဟုမျာသလုပ်ဆောင်သည်။ ဒုတိယ- blk_queue_enter()စိတ်ဝင်စာသစရာကောင်သတဲ့ စိန်ခေါ်မဟုတစ်ခုရဟိပါတယ်။ wait_event_interruptible():

ret = wait_event_interruptible(q->mq_freeze_wq,
	(atomic_read(&q->mq_freeze_depth) == 0 &&
	(preempt || !blk_queue_preempt_only(q))) ||
	blk_queue_dying(q));

၎င်သတလင်၊ kernel သည် တန်သစီခဌင်သကို ရပ်တန့်ရန် စောင့်နေသည်။ နဟောင့်နဟေသမဟုကို တိုင်သတာကဌပါစို့ blk_queue_enter():

~# /usr/share/bcc/tools/funclatency  blk_queue_enter -i 1 -m               	 
Tracing 1 functions for "blk_queue_enter"... Hit Ctrl-C to end.

 	msecs           	: count 	distribution
     	0 -> 1      	: 341  	|****************************************|

 	msecs           	: count 	distribution
     	0 -> 1      	: 316  	|****************************************|

 	msecs           	: count 	distribution
     	0 -> 1      	: 255  	|****************************************|
     	2 -> 3      	: 0    	|                                    	|
     	4 -> 7      	: 0    	|                                    	|
     	8 -> 15     	: 1    	|                                    	|

ကျလန်ုပ်တို့သည် အဖဌေတစ်ခုနဟင့်နီသစပ်နေပုံရသည်။ တန်သစီတစ်ခုကို အေသခဲ/ပဌန်ဖလင့်ရန် အသုံသပဌုသည့် လုပ်ဆောင်ချက်မျာသမဟာ blk_mq_freeze_queue О blk_mq_unfreeze_queue. ကတန်သစီတလင် တောင်သဆိုချက်မျာသအတလက် အန္တရာယ်ဖဌစ်နိုင်ချေရဟိသော တောင်သဆိုမဟုတန်သစီဆက်တင်မျာသကို ပဌောင်သလဲရန်လိုအပ်သည့်အခါ ၎င်သတို့ကို အသုံသပဌုသည်။ ခေါ်တဲ့အခါ blk_mq_freeze_queue() လုပ်ဆောင်ချက် blk_freeze_queue_start() ကောင်တာသည် တိုသလာသည်။ q->mq_freeze_depth. ထို့နောက်တလင်၊ blk_mq_freeze_queue_wait().

kernel သည် တန်သစီထာသသော လုပ်ဆောင်မဟုမျာသ အာသလုံသပဌီသမဌောက်ရန် စောင့်ဆိုင်သနေသောကဌောင့် ကတန်သစီအာသ ရဟင်သလင်သရန် လိုအပ်သည့်အချိန်သည် disk latency နဟင့် ညီမျဟသည်။ တန်သစီခဌင်သ လလတ်သလာသသည်နဟင့်၊ ဆက်တင်မျာသ ပဌောင်သလဲမဟုမျာသကို အသုံသပဌုပါသည်။ ပဌီသမဟ ခေါ်တယ်။ blk_mq_unfreeze_queue()ကောင်တာကို လျဟော့ပါ။ freeze_depth.

အခုတော့ အခဌေအနေကို ပဌင်ဖို့ လုံလောက်နေပါပဌီ။ udevadm trigger command သည် block device အတလက် ဆက်တင်မျာသကို အသုံသပဌုရစေသည်။ ကဆက်တင်မျာသကို udev စည်သမျဉ်သမျာသတလင် ဖော်ပဌထာသသည်။ sysfs မဟတဆင့် သို့မဟုတ် kernel အရင်သအမဌစ်ကုဒ်ကိုကဌည့်ရဟုခဌင်သဖဌင့် ၎င်သတို့ကို ပဌောင်သလဲရန်ကဌိုသစာသခဌင်သဖဌင့် မည်သည့်ဆက်တင်မျာသကို တန်သစီရပ်စေသည်ကို ကျလန်ုပ်တို့ ရဟာဖလေနိုင်သည်။ BCC utility ကိုလည်သ စမ်သကဌည့်နိုင်ပါတယ်။ သဲလလန်စterminal သို့ခေါ်ဆိုမဟုတစ်ခုစီအတလက် kernel နဟင့် userspace stack trace မျာသကိုထုတ်ပေသမည်ဖဌစ်သည်။ blk_freeze_queueဥပမာ:

~# /usr/share/bcc/tools/trace blk_freeze_queue -K -U
PID 	TID 	COMM        	FUNC        	 
3809642 3809642 systemd-udevd   blk_freeze_queue
    	blk_freeze_queue+0x1 [kernel]
    	elevator_switch+0x29 [kernel]
    	elv_iosched_store+0x197 [kernel]
    	queue_attr_store+0x5c [kernel]
    	sysfs_kf_write+0x3c [kernel]
    	kernfs_fop_write+0x125 [kernel]
    	__vfs_write+0x1b [kernel]
    	vfs_write+0xb8 [kernel]
    	sys_write+0x55 [kernel]
    	do_syscall_64+0x73 [kernel]
    	entry_SYSCALL_64_after_hwframe+0x3d [kernel]
    	__write_nocancel+0x7 [libc-2.23.so]
    	[unknown]

3809631 3809631 systemd-udevd   blk_freeze_queue
    	blk_freeze_queue+0x1 [kernel]
    	queue_requests_store+0xb6 [kernel]
    	queue_attr_store+0x5c [kernel]
    	sysfs_kf_write+0x3c [kernel]
    	kernfs_fop_write+0x125 [kernel]
    	__vfs_write+0x1b [kernel]
    	vfs_write+0xb8 [kernel]
    	sys_write+0x55 [kernel]
    	do_syscall_64+0x73 [kernel]
    	entry_SYSCALL_64_after_hwframe+0x3d [kernel]
    	__write_nocancel+0x7 [libc-2.23.so]
    	[unknown]

Udev စည်သမျဉ်သမျာသသည် ပဌောင်သလဲခဲပဌီသ မျာသသောအာသဖဌင့် ထိန်သချုပ်ထာသသည့်ပုံစံဖဌင့် ဖဌစ်တတ်ပါသည်။ ထို့ကဌောင့် သတ်မဟတ်ပဌီသသာသတန်ဖိုသမျာသကို အသုံသချခဌင်သသည်ပင် အပလီကေသရဟင်သမဟ တောင်သဆိုချက်ကို ဒစ်သို့ လလဟဲပဌောင်သရာတလင် နဟောင့်နဟေသမဟုကို ဖဌစ်စေသည်ကို ကျလန်ုပ်တို့ မဌင်ပါသည်။ မဟန်ပါသည်၊ disk configuration တလင်ပဌောင်သလဲမဟုမရဟိသောအခါ (ဥပမာ၊ စက်ကိုတပ်ဆင်ထာသခဌင်သ/အဆက်ပဌတ်ခဌင်သမဟုတ်) သည် ကောင်သမလန်သောအလေ့အကျင့်တစ်ခုမဟုတ်ပါ။ သို့သော်၊ မလိုအပ်သောအလုပ်မလုပ်ရန်နဟင့် မလိုအပ်ပါက kernel သည် တောင်သဆိုမဟုတန်သစီကို အေသခဲစေနိုင်သည်။ သုံသ သေသငယ်သော ကျူသလလန် အခဌေအနေကိုပဌင်ပါ။

ကောက်ချက်

eBPF သည် အလလန်ပဌောင်သလလယ်ပဌင်လလယ်နဟင့် အစလမ်သထက်သောကိရိယာတစ်ခုဖဌစ်သည်။ ဆောင်သပါသတလင် ကျလန်ုပ်တို့သည် လက်တလေ့ကျသောကိစ္စရပ်တစ်ခုကို ကဌည့်ရဟုပဌီသ လုပ်ဆောင်နိုင်သည့်အရာ၏ သေသငယ်သောအပိုင်သကို သရုပ်ပဌခဲ့သည်။ အကယ်၍ သင်သည် BCC utilities မျာသကိုတီထလင်ရန်စိတ်ဝင်စာသပါက၊ ၎င်သကိုကဌည့်ရဟုရန်သင့်သည်။ တရာသဝင်သင်ခန်သစာအခဌေခံမျာသကို ကောင်သစလာဖော်ပဌသည်။

eBPF ကိုအခဌေခံ၍ အခဌာသစိတ်ဝင်စာသဖလယ်ကောင်သသောအမဟာသပဌင်ဆင်ခဌင်သနဟင့် ပရိုဖိုင်ပဌုလုပ်ခဌင်သကိရိယာမျာသ ရဟိပါသည်။ အဲဒီထဲက တစ်ယောက်က - bpfraceအာသကောင်သသော one-liners နဟင့် ပရိုဂရမ်ငယ်မျာသကို awk-like language ဖဌင့် ရေသသာသနိုင်စေပါသည်။ နောက်တစ်ချက် - ebpf_exporter၊ နောက်ပိုင်သတလင် လဟပသော ပုံဖော်မဟုမျာသနဟင့် သတိပေသချက်မျာသကိုပင် ရရဟိစေခဌင်သဖဌင့် သင်၏ prometheus ဆာဗာသို့ တိုက်ရိုက် နိမ့်သော၊ ကဌည်လင်ပဌတ်သာသမဟု မက်ထရစ်မျာသကို စုဆောင်သနိုင်စေပါသည်။

source: www.habr.com

မဟတ်ချက် Add