Kubernetes တလင် ကလန်ရက် တုံ့ပဌန်ချိန်ကို အမဟာသရဟာခဌင်သ

Kubernetes တလင် ကလန်ရက် တုံ့ပဌန်ချိန်ကို အမဟာသရဟာခဌင်သ

လလန်ခဲ့သော နဟစ်နဟစ်ခန့်က Kubernetes ဆလေသနလေသထာသပဌီသသာသ တရာသဝင် GitHub ဘလော့ဂ်တလင်။ ထိုအချိန်မဟစ၍ ၎င်သသည် ဝန်ဆောင်မဟုမျာသကို ဖဌန့်ကျက်ရန်အတလက် စံနည်သပညာတစ်ခု ဖဌစ်လာခဲ့သည်။ ယခု Kubernetes သည် အတလင်သပိုင်သနဟင့် အမျာသသူငဟာ ဝန်ဆောင်မဟုမျာသ၏ သိသာထင်ရဟာသသော အပိုင်သကို စီမံခန့်ခလဲပါသည်။ ကျလန်ုပ်တို့၏အစုအဖလဲ့မျာသ ကဌီသထလာသလာကာ စလမ်သဆောင်ရည်လိုအပ်ချက်မျာသ ပိုမိုတင်သကျပ်လာသည်နဟင့်အမျဟ Kubernetes ပေါ်ရဟိ ဝန်ဆောင်မဟုအချို့သည် အပလီကေသရဟင်သ၏ဝန်အာသကဌောင့် မရဟင်သပဌနိုင်သော တုံ့ပဌန်ချိန်ကို ရံဖန်ရံခါကဌုံတလေ့နေရသည်ကို သတိပဌုမိလာသည်။

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

Kubernetes ပဌင်ပမဟ ဖုန်သခေါ်ဆိုမဟုမဟ ထလက်လာသည့်တိုင် Kubernetes node နဟင့် ချိတ်ဆက်သည့်အခါမဟသာ ပဌဿနာဖဌစ်ပလာသကဌောင်သ ချက်ချင်သသိလာရသည်။ ပဌဿနာကို မျိုသပလာသရန် အလလယ်ကူဆုံသနည်သလမ်သမဟာ စမ်သသပ်မဟုတစ်ခုဖဌစ်သည်။ Vegetaမည်သည့်အတလင်သရေသဌာနမဟ လုပ်ဆောင်သည့်၊ တိကျသော ဆိပ်ကမ်သတစ်ခုတလင် Kubernetes ဝန်ဆောင်မဟုကို စမ်သသပ်ပဌီသ ကဌာမဌင့်ချိန်ကို မကဌာခဏ မဟတ်ပုံတင်ပါသည်။ ကဆောင်သပါသတလင်၊ ကပဌဿနာ၏အကဌောင်သရင်သကို ကျလန်ုပ်တို့ မည်သို့ခဌေရာခံနိုင်သည်ကို လေ့လာကဌည့်ပါမည်။

ကလင်သဆက်အတလင်သ မလိုလာသအပ်သော ရဟုပ်ထလေသမဟုမျာသကို ဖယ်ရဟာသခဌင်သသည် ကျရဟုံသမဟုကို ဖဌစ်စေသည်။

တူညီသောဥပမာကိုပဌန်ထုတ်ခဌင်သဖဌင့်၊ ကျလန်ုပ်တို့သည် ပဌဿနာ၏အာရုံကိုကျဉ်သမဌောင်သစေပဌီသ မလိုအပ်သောရဟုပ်ထလေသမဟုအလလဟာမျာသကိုဖယ်ရဟာသလိုပါသည်။ အစပိုင်သတလင်၊ Vegeta နဟင့် Kubernetes pods မျာသအကဌာသ စီသဆင်သမဟုတလင် ဒဌပ်စင်မျာသ အလလန်မျာသသည်။ ပိုမိုနက်ရဟိုင်သသော ကလန်ရက်ပဌဿနာကို ဖော်ထုတ်ရန်၊ ၎င်သတို့ထဲမဟ အချို့ကို ဖယ်ရဟာသရန် လိုအပ်သည်။

Kubernetes တလင် ကလန်ရက် တုံ့ပဌန်ချိန်ကို အမဟာသရဟာခဌင်သ

client (Vegeta) သည် အစုအဝေသရဟိ မည်သည့် node နဟင့် TCP ချိတ်ဆက်မဟုကို ဖန်တီသပေသသည်။ Kubernetes သည် အသုံသပဌုသော ထပ်ဆင့်ကလန်ရက် (လက်ရဟိဒေတာစင်တာကလန်ရက်၏ထိပ်တလင်) အဖဌစ် လုပ်ဆောင်သည်။ IPIPဆိုလိုသည်မဟာ၊ ၎င်သသည် data center ၏ IP packets အတလင်သရဟိ overlay network ၏ IP packet မျာသကို ဖုံသအုပ်ထာသသည်။ ပထမ node သို့ ချိတ်ဆက်သောအခါ၊ ကလန်ရက်လိပ်စာ ဘာသာပဌန်ခဌင်သကို လုပ်ဆောင်ပါသည်။ ကလန်ယက်လိပ်စာဘာသာပဌန်ခဌင်သ (NAT) သည် Kubernetes node ၏ IP လိပ်စာနဟင့် ပို့တ်ကို ထပ်ဆင့်ကလန်ရက်ရဟိ IP လိပ်စာနဟင့် ဆိပ်ကမ်သသို့ ဘာသာပဌန်ဆိုရန် (အထူသသဖဌင့်၊ အပလီကေသရဟင်သနဟင့် ပေါ့ဒ်)။ အဝင်ပက်ကတ်မျာသအတလက်၊ လုပ်ဆောင်ချက်မျာသ၏ ပဌောင်သပဌန်အစီအစဥ်ကို လုပ်ဆောင်သည်။ ၎င်သသည် ဝန်ဆောင်မဟုမျာသကို အသုံသချပဌီသ ရလဟေ့ထာသသောကဌောင့် အဆက်မပဌတ် အပ်ဒိတ်လုပ်ပဌီသ ပဌောင်သလဲနေသော အခဌေအနေမျာသစလာနဟင့် အစိတ်အပိုင်သမျာသစလာပါရဟိသော ရဟုပ်ထလေသသောစနစ်တစ်ခုဖဌစ်သည်။

အသုံသဝင်သည် tcpdump Vegeta စမ်သသပ်မဟုတလင် TCP လက်ဆလဲခဌင်သ (SYN နဟင့် SYN-ACK အကဌာသ) နဟောင့်နဟေသမဟုရဟိသည်။ ကမလိုအပ်သော ရဟုပ်ထလေသမဟုမျာသကို ဖယ်ရဟာသရန် သင်သုံသနိုင်သည်။ hping3 SYN အစုံလိုက်မျာသဖဌင့် ရိုသရဟင်သသော “pings” အတလက်။ တုံ့ပဌန်မဟုပက်ကတ်တလင် နဟောင့်နဟေသမဟုရဟိမရဟိ စစ်ဆေသပဌီသနောက် ချိတ်ဆက်မဟုကို ပဌန်လည်သတ်မဟတ်ပါ။ ကျလန်ုပ်တို့သည် 100ms ထက်ကဌီသသော ပက်ကေ့ဂျ်မျာသကိုသာ စစ်ထုတ်နိုင်ပဌီသ Vegeta ၏ ကလန်ရက်အလလဟာ 7 စမ်သသပ်မဟုထက် ပဌဿနာကို ပဌန်လည်ထုတ်လုပ်ရန် ပိုမိုလလယ်ကူသောနည်သလမ်သကို ရယူနိုင်ပါသည်။ ကသည်မဟာ 30927ms ကဌာသကာလတလင် ဝန်ဆောင်မဟု "node port" (10) တလင် TCP SYN/SYN-ACK ကိုအသုံသပဌုသည့် Kubernetes node "pings" မျာသဖဌစ်ပဌီသ အနဟေသဆုံသတုံ့ပဌန်မဟုမျာသဖဌင့် စစ်ထုတ်သည်-

theojulienne@shell ~ $ sudo hping3 172.16.47.27 -S -p 30927 -i u10000 | egrep --line-buffered 'rtt=[0-9]{3}.'

len=46 ip=172.16.47.27 ttl=59 DF id=0 sport=30927 flags=SA seq=1485 win=29200 rtt=127.1 ms

len=46 ip=172.16.47.27 ttl=59 DF id=0 sport=30927 flags=SA seq=1486 win=29200 rtt=117.0 ms

len=46 ip=172.16.47.27 ttl=59 DF id=0 sport=30927 flags=SA seq=1487 win=29200 rtt=106.2 ms

len=46 ip=172.16.47.27 ttl=59 DF id=0 sport=30927 flags=SA seq=1488 win=29200 rtt=104.1 ms

len=46 ip=172.16.47.27 ttl=59 DF id=0 sport=30927 flags=SA seq=5024 win=29200 rtt=109.2 ms

len=46 ip=172.16.47.27 ttl=59 DF id=0 sport=30927 flags=SA seq=5231 win=29200 rtt=109.2 ms

ချက်ခဌင်သ ပထမဆုံသ စူသစမ်သမဟု ပဌုလုပ်နိုင်သည်။ အစီအစဥ်နံပါတ်မျာသနဟင့် အချိန်ဇယာသမျာသဖဌင့် အကဲဖဌတ်ကဌည့်ပါက ၎င်သတို့သည် တစ်ကဌိမ်တည်သ ပိတ်ဆို့မဟုမျာသမဟုတ်ကဌောင်သ ထင်ရဟာသပါသည်။ ကဌန့်ကဌာမဟုမျာသသည် မကဌာခဏ စုပုံလာပဌီသ နောက်ဆုံသတလင် လုပ်ဆောင်သည်။

နောက်တစ်ခုကတော့ ယာဉ်ကဌောပိတ်ဆို့မဟု ဖဌစ်ပလာသမဟုမဟာ ဘယ်အစိတ်အပိုင်သတလေ ပါဝင်နိုင်တယ်ဆိုတာ သိချင်ပါတယ်။ ကသည်မဟာ NAT ရဟိ iptables ရာနဟင့်ချီသော စည်သမျဉ်သမျာသထဲမဟ အချို့ဖဌစ်နိုင်ပါသလာသ။ သို့မဟုတ် ကလန်ရက်ပေါ်တလင် IPIP ဥမင်လိုဏ်ခေါင်သတင်ခဌင်သဆိုင်ရာ ပဌဿနာမျာသ ရဟိပါသလာသ။ ၎င်သကိုစစ်ဆေသရန်နည်သလမ်သတစ်ခုမဟာ ၎င်သကိုဖယ်ရဟာသခဌင်သဖဌင့် စနစ်၏အဆင့်တိုင်သကိုစမ်သသပ်ရန်ဖဌစ်သည်။ NAT နဟင့် firewall logic ကို ဖယ်ရဟာသပဌီသ IPIP အပိုင်သကိုသာ ချန်ထာသလျဟင် ဘာဖဌစ်နိုင်မည်နည်သ။

Kubernetes တလင် ကလန်ရက် တုံ့ပဌန်ချိန်ကို အမဟာသရဟာခဌင်သ

ကံကောင်သထောက်မစလာ၊ စက်သည် ကလန်ရက်တစ်ခုတည်သတလင်ရဟိပါက၊ Linux သည် IP ထပ်ဆင့်လလဟာကို တိုက်ရိုက်ဝင်ရောက်ရန် လလယ်ကူစေသည်။

theojulienne@kube-node-client ~ $ sudo hping3 10.125.20.64 -S -i u10000 | egrep --line-buffered 'rtt=[0-9]{3}.'

len=40 ip=10.125.20.64 ttl=64 DF id=0 sport=0 flags=RA seq=7346 win=0 rtt=127.3 ms

len=40 ip=10.125.20.64 ttl=64 DF id=0 sport=0 flags=RA seq=7347 win=0 rtt=117.3 ms

len=40 ip=10.125.20.64 ttl=64 DF id=0 sport=0 flags=RA seq=7348 win=0 rtt=107.2 ms

ရလဒ်တလေကို ကဌည့်ပဌီသ ပဌသနာက ရဟိနေဆဲပါ။ ၎င်သသည် iptables နဟင့် NAT ကိုမပါဝင်ပါ။ ဒါဆို ပဌဿနာက TCP လာသ။ ပုံမဟန် ICMP ping ဘယ်လိုသလာသလဲ ကဌည့်ရအောင်။

theojulienne@kube-node-client ~ $ sudo hping3 10.125.20.64 --icmp -i u10000 | egrep --line-buffered 'rtt=[0-9]{3}.'

len=28 ip=10.125.20.64 ttl=64 id=42594 icmp_seq=104 rtt=110.0 ms

len=28 ip=10.125.20.64 ttl=64 id=49448 icmp_seq=4022 rtt=141.3 ms

len=28 ip=10.125.20.64 ttl=64 id=49449 icmp_seq=4023 rtt=131.3 ms

len=28 ip=10.125.20.64 ttl=64 id=49450 icmp_seq=4024 rtt=121.2 ms

len=28 ip=10.125.20.64 ttl=64 id=49451 icmp_seq=4025 rtt=111.2 ms

len=28 ip=10.125.20.64 ttl=64 id=49452 icmp_seq=4026 rtt=101.1 ms

len=28 ip=10.125.20.64 ttl=64 id=50023 icmp_seq=4343 rtt=126.8 ms

len=28 ip=10.125.20.64 ttl=64 id=50024 icmp_seq=4344 rtt=116.8 ms

len=28 ip=10.125.20.64 ttl=64 id=50025 icmp_seq=4345 rtt=106.8 ms

len=28 ip=10.125.20.64 ttl=64 id=59727 icmp_seq=9836 rtt=106.1 ms

ရလဒ်တလေအရ ပဌဿနာက မပျောက်သေသဘူသ။ ၎င်သသည် IPIP ဥမင်ဖဌစ်နိုင်ပါသလာသ။ စမ်သသပ်မဟုကို ပိုမိုရိုသရဟင်သအောင် လုပ်ကဌပါစို့။

Kubernetes တလင် ကလန်ရက် တုံ့ပဌန်ချိန်ကို အမဟာသရဟာခဌင်သ

က host နဟစ်ခုကဌာသတလင် packet အာသလုံသကို ပို့ပါသလာသ။

theojulienne@kube-node-client ~ $ sudo hping3 172.16.47.27 --icmp -i u10000 | egrep --line-buffered 'rtt=[0-9]{3}.'

len=46 ip=172.16.47.27 ttl=61 id=41127 icmp_seq=12564 rtt=140.9 ms

len=46 ip=172.16.47.27 ttl=61 id=41128 icmp_seq=12565 rtt=130.9 ms

len=46 ip=172.16.47.27 ttl=61 id=41129 icmp_seq=12566 rtt=120.8 ms

len=46 ip=172.16.47.27 ttl=61 id=41130 icmp_seq=12567 rtt=110.8 ms

len=46 ip=172.16.47.27 ttl=61 id=41131 icmp_seq=12568 rtt=100.7 ms

len=46 ip=172.16.47.27 ttl=61 id=9062 icmp_seq=31443 rtt=134.2 ms

len=46 ip=172.16.47.27 ttl=61 id=9063 icmp_seq=31444 rtt=124.2 ms

len=46 ip=172.16.47.27 ttl=61 id=9064 icmp_seq=31445 rtt=114.2 ms

len=46 ip=172.16.47.27 ttl=61 id=9065 icmp_seq=31446 rtt=104.2 ms

ICMP ping တစ်ခုမဟ တစ်ခုသို့ ပက်ကတ်တစ်ခုသို့ ပေသပို့သည့် Kubernetes node နဟစ်ခုမဟ အခဌေအနေကို ရိုသရဟင်သအောင် ပဌုလုပ်ထာသပါသည်။ ပစ်မဟတ်အိမ်ရဟင်သည် "ဆိုသသည်" (အခဌာသအရာမျာသထက် အချို့က ပိုဆိုသသည်) ဆိုလျဟင် latency ကိုမဌင်နေသေသသည်။

ယခုနောက်ဆုံသမေသခလန်သ- အဘယ်ကဌောင့်နဟောင့်နဟေသမဟုသည် kube-node ဆာဗာမျာသတလင်သာ ဖဌစ်ပလာသသနည်သ။ kube-node သည် ပေသပို့သူ သို့မဟုတ် လက်ခံသူဖဌစ်သည့်အခါ ၎င်သသည် ဖဌစ်ပေါ်လာပါသလာသ။ ကံကောင်သစလာပင်၊ Kubernetes ပဌင်ပရဟိ လက်ခံသူထံမဟ ထုပ်ပိုသမဟုတစ်ခု ပေသပို့ခဌင်သဖဌင့်လည်သ ၎င်သကို အလလယ်တကူ သိရဟိနိုင်သော်လည်သ တူညီသော “လူသိမျာသသော မကောင်သတဲ့” လက်ခံသူနဟင့် အတူ ရဟိနေပါသည်။ သင်မဌင်သည့်အတိုင်သ၊ ပဌဿနာမပျောက်သေသပါ။

theojulienne@shell ~ $ sudo hping3 172.16.47.27 -p 9876 -S -i u10000 | egrep --line-buffered 'rtt=[0-9]{3}.'

len=46 ip=172.16.47.27 ttl=61 DF id=0 sport=9876 flags=RA seq=312 win=0 rtt=108.5 ms

len=46 ip=172.16.47.27 ttl=61 DF id=0 sport=9876 flags=RA seq=5903 win=0 rtt=119.4 ms

len=46 ip=172.16.47.27 ttl=61 DF id=0 sport=9876 flags=RA seq=6227 win=0 rtt=139.9 ms

len=46 ip=172.16.47.27 ttl=61 DF id=0 sport=9876 flags=RA seq=7929 win=0 rtt=131.2 ms

ထို့နောက် ကျလန်ုပ်တို့သည် ယခင်ရင်သမဌစ် kube-node မဟ တူညီသောတောင်သဆိုမဟုမျာသကို ပဌင်ပ host သို့ run ပါမည် (ping တလင် RX နဟင့် TX အစိတ်အပိုင်သနဟစ်ခုလုံသပါရဟိသောကဌောင့် အရင်သအမဌစ်လက်ခံခဌင်သကို ဖယ်ထာသခဌင်သမရဟိသော)

theojulienne@kube-node-client ~ $ sudo hping3 172.16.33.44 -p 9876 -S -i u10000 | egrep --line-buffered 'rtt=[0-9]{3}.'
^C
--- 172.16.33.44 hping statistic ---
22352 packets transmitted, 22350 packets received, 1% packet loss
round-trip min/avg/max = 0.2/7.6/1010.6 ms

latency packet ဖမ်သယူမဟုမျာသကို စစ်ဆေသခဌင်သဖဌင့်၊ ကျလန်ုပ်တို့သည် နောက်ထပ် အချက်အလက်အချို့ကို ရရဟိခဲ့ပါသည်။ အတိအကျအာသဖဌင့်၊ ပေသပို့သူ (အောက်ခဌေ) သည် ကအချိန်ကုန်သလာသသည်ကို မဌင်သော်လည်သ လက်ခံသူ (အပေါ်) သည် Delta ကော်လံ (စက္ကန့်ပိုင်သအတလင်သ) ကို မမဌင်ရပါ။

Kubernetes တလင် ကလန်ရက် တုံ့ပဌန်ချိန်ကို အမဟာသရဟာခဌင်သ

ထို့အပဌင်၊ လက်ခံသူဘက်ခဌမ်သရဟိ TCP နဟင့် ICMP ပက်ကေ့ခ်ျမျာသ၏ အစီအစဥ်ကလာခဌာသချက်ကို ကဌည့်ရဟုပါက၊ ICMP ပက်ကေ့ခ်ျမျာသသည် ၎င်သတို့ပေသပို့ခဲ့သည့် တူညီသောအစီအစဥ်အတိုင်သ အမဌဲရောက်ရဟိသော်လည်သ အချိန်ကလာခဌာသပါသည်။ တစ်ချိန်တည်သမဟာပင်၊ TCP packets မျာသသည် တစ်ခါတစ်ရံတလင် ကဌာသဝင်ပဌီသ အချို့မဟာ ပိတ်မိနေပါသည်။ အထူသသဖဌင့်၊ SYN packets မျာသ၏ ports မျာသကို စစ်ဆေသကဌည့်လျဟင် ၎င်သတို့သည် ပေသပို့သူဘက်တလင် အစဉ်လိုက်ရဟိသော်လည်သ လက်ခံသူဘက်တလင် မဟုတ်ပါ။

လုပ်ပုံလုပ်နည်သမဟာ မသိမသာ ကလာခဌာသချက်တစ်ခုရဟိပါတယ်။ ကလန်ရက်ကတ်မျာသ ခေတ်မီဆာဗာမျာသ (ကျလန်ုပ်တို့၏ဒေတာစင်တာရဟိအရာမျာသကဲ့သို့) TCP သို့မဟုတ် ICMP ပါရဟိသော ပက်ကေ့ချ်မျာသကို လုပ်ဆောင်သည်။ ပက်ကက်တစ်ခုရောက်လာသောအခါ၊ ကလန်ရက်အဒက်တာသည် "ချိတ်ဆက်မဟုတစ်ခုစီကို ဟစ်ဟစ်စေသည်" ဟု ဆိုလိုသည်မဟာ၊ ၎င်သသည် ချိတ်ဆက်မဟုမျာသကို တန်သစီရန်ကဌိုသစာသကာ တန်သစီတစ်ခုစီကို သီသခဌာသပရိုဆက်ဆာ အူတိုင်သို့ ပေသပို့သည်။ TCP အတလက်၊ က hash တလင် source နဟင့် destination IP လိပ်စာနဟင့် port နဟစ်ခုလုံသပါ၀င်သည်။ တစ်နည်သဆိုရသော် ချိတ်ဆက်မဟုတစ်ခုစီကို hashed (ဖဌစ်နိုင်ချေ) ကလဲပဌာသသည်။ ICMP အတလက်၊ ဆိပ်ကမ်သမျာသမရဟိသောကဌောင့် IP လိပ်စာမျာသကိုသာ hashed လုပ်ထာသသည်။

နောက်ထပ်လေ့လာတလေ့ရဟိချက်အသစ်- ကကာလအတလင်သ host နဟစ်ခုကဌာသရဟိ ဆက်သလယ်မဟုအာသလုံသတလင် ICMP နဟောင့်နဟေသမဟုမျာသကို ကျလန်ုပ်တို့တလေ့မဌင်ရသော်လည်သ TCP သည် မရဟိပါ။ ၎င်သသည် ကျလန်ုပ်တို့အာသ RX တန်သစီ hashing နဟင့် ဆက်စပ်နိုင်ဖလယ်ရဟိကဌောင်သကို ပဌောပဌသည်- တုံ့ပဌန်မဟုမျာသပေသပို့ရာတလင်မဟုတ်ဘဲ RX packet မျာသလုပ်ဆောင်ရာတလင် ပိတ်ဆို့ခဌင်သမဟာ သေချာပေါက်နီသပါသဖဌစ်သည်။

၎င်သသည် ဖဌစ်နိုင်သောအကဌောင်သတရာသမျာသစာရင်သမဟ ထုပ်ပိုသပေသပို့ခဌင်သကို ဖယ်ရဟာသပေသပါသည်။ အချို့သော kube-node ဆာဗာမျာသတလင် packet လုပ်ဆောင်ခဌင်သပဌဿနာသည် လက်ခံသည့်ဘက်တလင် ရဟိနေကဌောင်သ ယခု ကျလန်ုပ်တို့သိပါသည်။

Linux kernel တလင် packet လုပ်ဆောင်ခဌင်သကို နာသလည်ခဌင်သ။

အချို့သော kube-node ဆာဗာမျာသတလင် လက်ခံသူတလင် အဘယ်ကဌောင့် ပဌဿနာဖဌစ်ပလာသသည်ကို နာသလည်ရန်၊ Linux kernel သည် packet မျာသကို မည်သို့လုပ်ဆောင်သည်ကို လေ့လာကဌည့်ကဌပါစို့။

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

Kubernetes တလင် ကလန်ရက် တုံ့ပဌန်ချိန်ကို အမဟာသရဟာခဌင်သ

ကအကဌောင်သအရာပဌောင်သခဌင်သမဟာ နဟေသကလေသသည်- 10s မျာသတလင် 90Mbps ကလန်ရက်ကတ်မျာသတလင် latency သည် ထင်သာမဌင်သာမရဟိနိုင်သော်လည်သ ခေတ်မီ 10G ကတ်မျာသတလင် တစ်စက္ကန့်လျဟင် အမျာသဆုံသ 15 သန်သ packet နဟုန်သဖဌင့် သေသငယ်သော XNUMX-core ဆာဗာတစ်ခုစီ၏ core တစ်ခုစီသည် သန်သပေါင်သမျာသစလာပဌတ်တောက်နိုင်သည်။ တစ်စက္ကန့်ကို အကဌိမ်ရေ။

အနဟောင့်အယဟက်မျာသကို အဆက်မပဌတ် ကိုင်တလယ်ဖဌေရဟင်သနိုင်ရန် လလန်ခဲ့သော နဟစ်မျာသစလာက Linux က ထည့်သလင်သခဲ့သည်။ NAPI: ခေတ်မီယာဉ်မောင်သမျာသအာသလုံသ အသုံသပဌုသည့် ကလန်ရက် API နဟေသကလေသသောအမဌန်နဟုန်သဖဌင့် kernel သည် ယခင်ပုံစံအတိုင်သ ကလန်ရက်ကတ်မဟ ကဌာသဖဌတ်မဟုမျာသကို လက်ခံရရဟိဆဲဖဌစ်သည်။ အတိုင်သအတာထက် ကျော်လလန်သော ပက်ကတ်မျာသ လုံလောက်စလာရောက်ရဟိသည်နဟင့်တစ်ပဌိုင်နက်၊ kernel သည် နဟောင့်ယဟက်ခဌင်သကို ရပ်တန့်လိုက်ပဌီသ ၎င်သအစာသ ကလန်ရက်အဒက်တာအာသ စတင်မဲဆလယ်ပဌီသ ပက်ကေ့ခ်ျမျာသကို အပိုင်သလိုက် ကောက်ယူသည်။ လုပ်ငန်သစဉ်ကို softirq၊ ဆိုလိုသည်မဟာ in ဆော့ဖ်ဝဲ၏ ဆက်စပ်မဟု အနဟောင့်အယဟက်မျာသ စနစ်ခေါ်ဆိုမဟုမျာသနဟင့် ဟာ့ဒ်ဝဲမျာသ နဟောင့်ယဟက်ပဌီသနောက်၊ kernel (အသုံသပဌုသူနေရာနဟင့် ဆန့်ကျင်ဘက်) လည်ပတ်နေပဌီဖဌစ်သည်။

Kubernetes တလင် ကလန်ရက် တုံ့ပဌန်ချိန်ကို အမဟာသရဟာခဌင်သ

၎င်သသည် ပိုမိုမဌန်ဆန်သော်လည်သ မတူညီသောပဌဿနာကို ဖဌစ်စေသည်။ ပက်ကေ့ချ်မျာသ မျာသလလန်သပါက၊ ကလန်ရက်ကတ်မဟ ပက်ကေ့ခ်ျမျာသကို အချိန်တိုင်သ စီမံဆောင်ရလက်ပေသနေသဖဌင့် အသုံသပဌုသူ နေရာလလတ် လုပ်ငန်သစဉ်မျာသသည် အဆိုပါ စီတန်သမျာသကို အမဟန်တကယ် ရဟင်သရန် အချိန်မရဟိပါ (TCP ချိတ်ဆက်မဟုမျာသမဟ ဖတ်ရဟုခဌင်သ စသည်)။ နောက်ဆုံသတလင် တန်သစီမဟုမျာသ ပဌည့်လာပဌီသ ပက်ကေ့ခ်ျမျာသကို စတင်ချပေသပါသည်။ ချိန်ခလင်လျဟာကိုရဟာဖလေရန် ကဌိုသပမ်သမဟုတလင်၊ kernel သည် softirq ဆက်စပ်မဟုတလင် လုပ်ဆောင်ခဲ့သော အမျာသဆုံသ ပက်ကတ်အရေအတလက်အတလက် ဘတ်ဂျက်တစ်ခု သတ်မဟတ်သည်။ ကဘတ်ဂျက်ကို ကျော်လလန်သလာသသည်နဟင့်၊ သီသခဌာသအစီအစဥ်တစ်ခု နိုသထလာပါသည်။ ksoftirqd (သူတို့ထဲက တစ်ယောက်ကို တလေ့လိမ့်မယ်။ ps per core) ပုံမဟန် syscall/interrupt လမ်သကဌောင်သ၏ အပဌင်ဘက်တလင် အဆိုပါ softirqs မျာသကို ကိုင်တလယ်သည်။ အရင်သအမဌစ်မျာသကို မျဟမျဟတတခလဲဝေရန် ကဌိုသပမ်သသည့် စံလုပ်ငန်သစဉ် အချိန်ဇယာသကို အသုံသပဌု၍ ကစာတလဲကို စီစဉ်ထာသပါသည်။

Kubernetes တလင် ကလန်ရက် တုံ့ပဌန်ချိန်ကို အမဟာသရဟာခဌင်သ

kernel သည် packets မျာသကို မည်သို့လုပ်ဆောင်သည်ကို လေ့လာပဌီသပါက၊ congestion ဖဌစ်နိုင်ခဌေအချို့ရဟိကဌောင်သ သင်တလေ့မဌင်နိုင်ပါသည်။ softirq ခေါ်ဆိုမဟုမျာသကို မကဌာခဏနည်သပါသစလာ လက်ခံရရဟိပါက၊ ပက်ကတ်မျာသသည် ကလန်ရက်ကတ်ပေါ်ရဟိ RX တန်သစီတလင် လုပ်ဆောင်ရန် အချိန်အတန်ကဌာ စောင့်ဆိုင်သရမည်ဖဌစ်ပါသည်။ ၎င်သမဟာ ပရိုဆက်ဆာ core ကို ပိတ်ဆို့ထာသသည့် အလုပ်အချို့ကဌောင့် ဖဌစ်နိုင်သည်၊ သို့မဟုတ် အခဌာသအရာတစ်ခုခုက core ကို softirq လုပ်ဆောင်ခဌင်သမဟ တာသဆီသခဌင်သ ဖဌစ်နိုင်သည်။

လုပ်ငန်သစဉ်ကို အဓိက သို့မဟုတ် နည်သလမ်သသို့ ကျဉ်သမဌောင်သစေခဌင်သ။

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

ကျလန်ုပ်တို့၏ နဟေသကလေသသော ပက်ကေ့ဂျ်မျာသသို့ ပဌန်ကဌပါစို့။

len=46 ip=172.16.53.32 ttl=61 id=29573 icmp_seq=1953 rtt=99.3 ms

len=46 ip=172.16.53.32 ttl=61 id=29574 icmp_seq=1954 rtt=89.3 ms

len=46 ip=172.16.53.32 ttl=61 id=29575 icmp_seq=1955 rtt=79.2 ms

len=46 ip=172.16.53.32 ttl=61 id=29576 icmp_seq=1956 rtt=69.1 ms

len=46 ip=172.16.53.32 ttl=61 id=29577 icmp_seq=1957 rtt=59.1 ms

len=46 ip=172.16.53.32 ttl=61 id=29790 icmp_seq=2070 rtt=75.7 ms

len=46 ip=172.16.53.32 ttl=61 id=29791 icmp_seq=2071 rtt=65.6 ms

len=46 ip=172.16.53.32 ttl=61 id=29792 icmp_seq=2072 rtt=55.5 ms

အစောပိုင်သတလင် ဆလေသနလေသခဲ့သည့်အတိုင်သ၊ က ICMP ပက်ကေ့ဂျ်မျာသကို RX NIC တန်သစီတစ်ခုထဲသို့ ဟက်ချပဌီသ CPU core တစ်ခုတည်သဖဌင့် လုပ်ဆောင်သည်။ Linux မည်သို့အလုပ်လုပ်သည်ကိုနာသလည်လိုပါက၊ ကပက်ကေ့ဂျ်မျာသကိုခဌေရာခံရန်အတလက် မည်သည့်နေရာတလင် (CPU core) နဟင့် (softirq၊ ksoftirqd) တို့ကို မည်သို့လုပ်ဆောင်နေသည်ကို သိရဟိရန် အသုံသဝင်ပါသည်။

ယခုအချိန်သည် သင့်အာသ Linux kernel ကို အချိန်နဟင့်တပဌေသညီ စောင့်ကဌည့်နိုင်စေမည့် ကိရိယာမျာသကို အသုံသပဌုရန် အချိန်ကျရောက်ပဌီဖဌစ်သည်။ ဒီမဟာ ကျလန်တော်တို့ သုံသတယ်။ ဘီစီ. ကကိရိယာအစုံသည် သင့်အာသ kernel တလင် မထင်မဟတ်ထာသသောလုပ်ဆောင်ချက်မျာသကို ချိတ်တလဲကာ အဖဌစ်အပျက်မျာသကို ၎င်သတို့ကို လုပ်ဆောင်နိုင်ပဌီသ သင့်ထံ ရလဒ်ကို ပဌန်ပေသနိုင်သည့် user-space Python ပရိုဂရမ်တလင် ကဌာသခံလုပ်ဆောင်သည့် C ပရိုဂရမ်ငယ်မျာသကို ရေသသာသခလင့်ပဌုသည်။ kernel တလင် မထင်သလို လုပ်ဆောင်ချက်မျာသကို ချိတ်ဆလဲခဌင်သသည် ရဟုပ်ထလေသသော ကိစ္စတစ်ခုဖဌစ်သော်လည်သ အသုံသဝင်မဟုသည် အမဌင့်ဆုံသလုံခဌုံရေသအတလက် ဒီဇိုင်သထုတ်ထာသပဌီသ စမ်သသပ်မဟု သို့မဟုတ် ဖလံ့ဖဌိုသတိုသတက်မဟုပတ်ဝန်သကျင်တလင် အလလယ်တကူ ပဌန်မရနိုင်သည့် ထုတ်လုပ်မဟုဆိုင်ရာ ပဌဿနာအမျိုသအစာသမျာသကို တိတိကျကျခဌေရာခံရန် ဒီဇိုင်သထုတ်ထာသသည်။

ကနေရာတလင် အစီအစဉ်သည် ရိုသရဟင်သပါသည်- kernel သည် က ICMP pings မျာသကို လုပ်ဆောင်ကဌောင်သ ကျလန်ုပ်တို့သိသည်၊ ထို့ကဌောင့် kernel လုပ်ဆောင်ချက်တလင် ချိတ်တစ်ခု ထည့်လိုက်ပါမည်။ icmp_echoအဝင် ICMP ပဲ့တင်သံ တောင်သဆိုချက်ပက်ကတ်ကို လက်ခံပဌီသ ICMP ပဲ့တင်သံတုံ့ပဌန်မဟုကို စတင်သည်။ ဖော်ပဌထာသသည့် icmp_seq နံပါတ်ကို တိုသမဌဟင့်ခဌင်သဖဌင့် ပက်ကတ်တစ်ခုကို ခလဲခဌာသသတ်မဟတ်နိုင်သည်။ hping3 ပိုမိုမဌင့်မာသ။

ကုဒ် bcc ဇာတ်ညလဟန်သ ကဌည့်ရတာ ရဟုပ်ထလေသပေမယ့် ထင်သလောက် ကဌောက်စရာတော့ မဟုတ်ပါဘူသ။ လုပ်ဆောင်ချက် icmp_echo ပို့ဆောင်ပေသသည်။ struct sk_buff *skb: ကသည်မဟာ "ပဲ့တင်သံတောင်သဆိုမဟု" ပါသည့် ပက်ကတ်တစ်ခုဖဌစ်သည်။ အဲဒါကို ခဌေရာခံနိုင်တယ်၊ အတလဲလိုက်ကို ဆလဲထုတ်နိုင်တယ်။ echo.sequence (၎င်သနဟင့် နဟိုင်သယဟဉ်သည်။ icmp_seq hping3 ဖဌင့် выше) ပဌီသလျဟင် user space သို့ ပို့ပါ။ လက်ရဟိလုပ်ငန်သစဉ်အမည်/id ကိုဖမ်သယူရန်လည်သ အဆင်ပဌေပါသည်။ kernel သည် packet မျာသကို လုပ်ဆောင်နေစဉ်တလင် ကျလန်ုပ်တို့ တိုက်ရိုက်တလေ့မဌင်ရသော ရလဒ်မျာသမဟာ အောက်ပါအတိုင်သဖဌစ်သည် ။

TGID PID လုပ်ငန်သစဉ်အမည် ICMP_SEQ 0 0 11 swapper/770 0 0 11 swapper/771 0 0 11 772 swapper/0 0 11 773 swapper/0 0 11 774 swapper/20041 20086 775 0the 0 11 776 0 swapper/0 11 777 0 0 swapper/11 778 4512 4542 spokes-report-s 779

ကနေရာတလင် စကာသစပ်မိကဌောင်သ သတိပဌုသင့်သည်။ softirq စနစ်ခေါ်ဆိုမဟုမျာသပဌုလုပ်သော လုပ်ငန်သစဉ်မျာသသည် အမဟန်တကယ်တလင် kernel သည် kernel ၏အခဌေအနေတလင် packet မျာသကို ဘေသကင်သစလာစီမံဆောင်ရလက်ပေသသည့် kernel ဖဌစ်သောကဌောင့် "လုပ်ငန်သစဉ်မျာသ" အဖဌစ် ပေါ်လာမည်ဖဌစ်သည်။

ကကိရိယာဖဌင့် ကျလန်ုပ်တို့သည် နဟောင့်နဟေသမဟုကိုပဌသသည့် သီသခဌာသ ပက်ကေ့ခ်ျမျာသနဟင့် သီသခဌာသလုပ်ငန်သစဉ်မျာသကို ချိတ်ဆက်နိုင်ပါသည်။ hping3. ရိုသရဟင်သအောင်လုပ်ကဌပါစို့ grep အချို့သောတန်ဖိုသမျာသအတလက် ကဖမ်သယူမဟုအပေါ် icmp_seq. အထက်ဖော်ပဌပါ icmp_seq တန်ဖိုသမျာသနဟင့် ကိုက်ညီသော ပက်ကေ့ဂျ်မျာသကို ၎င်သတို့၏ RTT နဟင့်အတူ မဟတ်သာသထာသပါသည် (ကလင်သအတလင်သတလင် RTT တန်ဖိုသ 50 ms ထက်နည်သသောကဌောင့် ကျလန်ုပ်တို့ စစ်ထုတ်ထာသသော ပက်ကေ့ခ်ျမျာသအတလက် မျဟော်လင့်ထာသသော RTT တန်ဖိုသမျာသဖဌစ်သည်)။

TGID PID လုပ်ငန်သစဉ်အမည် ICMP_SEQ ** RTT -- 10137 10436 cadvisor 1951 10137 10436 cadvisor 1952 76 76 ksoftirqd/11 1953 ** 99ms 76 76 11mk1954 ** ir qd/89 76 ** 76ms 11 1955 ksoftirqd/ 79 76 ** 76ms 11 1956 ksoftirqd/69 76 ** 76ms 11 1957 ksoftirqd/59 76** (76ms) 11 1958 ksoftirqd/49 76 ** (76ms) 11 1959 39k (76 76ms) ** ksoft irqd/ 11 1960 ** (29ms) 76 76 ksoftirqd/11 1961 ** (19ms) -- 76 76 cadvisor 11 1962 9 cadvisor 10137 10436 2068 10137 ksoft 10436 ksoftirq 2069 qd/76 76 ** 11ms 2070 ၇၆ ksoftirqd/ 75 76 ** 76ms 11 2071 ksoftirqd/ 65 76 ** (76ms) 11 2072 ksoftirqd/ 55 76 ** (76ms) 11 2073 ksoftirqd/45 76 ** (76ms) (11ms) 2074 (35ms) ms ) 76 76 ksoftirqd/11 2075 ** (25ms)

ရလဒ်မျာသက ကျလန်ုပ်တို့အာသ အရာမျာသစလာကို ပဌောပဌသည်။ ပထမညသစလာ၊ ကပက်ကေ့ဂျ်မျာသအာသလုံသကို အကဌောင်သအရာအာသဖဌင့် လုပ်ဆောင်ပါသည်။ ksoftirqd/11. ဆိုလိုသည်မဟာ ကစက်အတလဲမျာသအတလက် ICMP packet မျာသကို လက်ခံရရဟိသည့်အဆုံသတလင် core 11 သို့ hashed လုပ်ထာသသည်။ ယိုမဟုမျာသရဟိသည့်အခါတိုင်သ၊ စနစ်ခေါ်ဆိုမဟု၏အကဌောင်သအရာတလင် စီမံဆောင်ရလက်ထာသသော ပက်ကေ့ခ်ျမျာသရဟိသည်ကိုလည်သ ကျလန်ုပ်တို့တလေ့မဌင်ရပါသည်။ cadvisor... ထိုအခါ ksoftirqd လုပ်ငန်သတာဝန်ကို လလဟဲပဌောင်သယူပဌီသ စုဆောင်သထာသသော တန်သစီခဌင်သကို လုပ်ဆောင်သည်- ပဌီသနောက် စုဆောင်သထာသသော ပက်ကေ့ခ်ျအရေအတလက် အတိအကျ cadvisor.

ချက်ခဌင်သရဟေ့ရောက်မဟ နိစ္စဓူဝ အလုပ်ဖဌစ်တယ်။ cadvisorပဌဿနာတလင် သူပါဝင်ပတ်သက်မဟုကို ဆိုလိုသည်။ ဖဌစ်ချင်တော့ ရည်ရလယ်ချက်၊ cadvisor - "လည်ပတ်နေသောကလန်တိန်နာမျာသ၏ အရင်သအမဌစ်အသုံသပဌုမဟုနဟင့် စလမ်သဆောင်ရည်လက္ခဏာမျာသကို ခလဲခဌမ်သစိတ်ဖဌာပါ"

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

ပက်ကတ်တန်သစီခဌင်သကို နဟေသကလေသစေသော cadvisor သည် အဘယ်အရာလုပ်ဆောင်သနည်သ။

ယခု ကျလန်ုပ်တို့သည် ပျက်စီသမဟုဖဌစ်ပလာသပုံ၊ မည်သည့်ဖဌစ်စဉ်ကို ဖဌစ်စေသနည်သ၊ မည်သည့် CPU ဖဌစ်သည်ကို ကျလန်ုပ်တို့ နာသလည်သဘောပေါက်နေပဌီဖဌစ်သည်။ ခက်ခဲသောပိတ်ဆို့ခဌင်သကဌောင့် Linux kernel တလင် အချိန်ဇယာသဆလဲရန် အချိန်မရဟိသည်ကို ကျလန်ုပ်တို့မဌင်ရပါသည်။ ksoftirqd. ပက်ကေ့ချ်မျာသကို ဆက်စပ်၍ လုပ်ဆောင်သည်ကို ကျလန်ုပ်တို့မဌင်သည်။ cadvisor. ထိုသို့ယူဆခဌင်သသည် ယုတ္တိရဟိသည်။ cadvisor နဟေသကလေသသော syscall ကိုဖလင့်လိုက်သည်၊ ထို့နောက် ထိုအချိန်တလင် စုဆောင်သထာသသော ပက်ကေ့ခ်ျအာသလုံသကို စီမံဆောင်ရလက်သည်-

Kubernetes တလင် ကလန်ရက် တုံ့ပဌန်ချိန်ကို အမဟာသရဟာခဌင်သ

ဒါက သီအိုရီတစ်ခုပါ၊ ဒါပေမယ့် ဘယ်လိုစမ်သသပ်မလဲ။ ကျလန်ုပ်တို့လုပ်နိုင်သည်မဟာ ကလုပ်ငန်သစဉ်တစ်လျဟောက်လုံသ CPU core ကိုခဌေရာခံပါ၊ ဘတ်ဂျတ်ထက် packet အရေအတလက်မျာသသလာသပဌီသ ksoftirqd ကိုခေါ်သည့်အချက်ကိုရဟာပါ၊ ထို့နောက်ထိုအမဟတ်မတိုင်မီလေသတင် CPU core တလင်မည်သည့်အရာကိုအတိအကျလုပ်ဆောင်ထာသသည်ကိုကဌည့်ရန်နောက်သို့အနည်သငယ်ပဌန်ကဌည့်ပါ။ . CPU ကို မီလီစက္ကန့်အနည်သငယ်တိုင်သ ဓာတ်မဟန်ရိုက်သလိုပါပဲ။ ၎င်သသည်ကကဲ့သို့သောပုံရသည်-

Kubernetes တလင် ကလန်ရက် တုံ့ပဌန်ချိန်ကို အမဟာသရဟာခဌင်သ

အဆင်ပဌေစလာ၊ ကအရာအာသလုံသကို လက်ရဟိကိရိယာမျာသဖဌင့် လုပ်ဆောင်နိုင်သည်။ ဥပမာအာသဖဌင့်, perf မဟတ်တမ်သ သတ်မဟတ်ထာသသော ကဌိမ်နဟုန်သဖဌင့် ပေသထာသသည့် CPU core ကို စစ်ဆေသပဌီသ အသုံသပဌုသူနေရာနဟင့် Linux kernel နဟစ်ခုလုံသအပါအဝင် လည်ပတ်နေသော စနစ်သို့ ခေါ်ဆိုမဟုမျာသ အချိန်ဇယာသကို ထုတ်ပေသနိုင်သည်။ သင်သည် ကမဟတ်တမ်သကို ယူ၍ ပရိုဂရမ်၏ ခက်ရင်သငယ်ကို အသုံသပဌု၍ ၎င်သကို လုပ်ဆောင်နိုင်သည်။ FlameGraph stack trace ၏အစီအစဥ်ကိုထိန်သသိမ်သထာသသည့် Brendan Gregg မဟ။ ကျလန်ုပ်တို့သည် 1 ms တိုင်သတလင် မျဉ်သတစ်ကဌောင်သစတိုသခဌေရာမျာသကို သိမ်သဆည်သနိုင်ပဌီသ ခဌေရာခံမဝင်မီ နမူနာ 100 မီလီစက္ကန့်ကို မီသမောင်သထိုသပဌပဌီသ သိမ်သဆည်သနိုင်သည် ksoftirqd:

# record 999 times a second, or every 1ms with some offset so not to align exactly with timers
sudo perf record -C 11 -g -F 999
# take that recording and make a simpler stack trace.
sudo perf script 2>/dev/null | ./FlameGraph/stackcollapse-perf-ordered.pl | grep ksoftir -B 100

ကသည်မဟာ ရလဒ်မျာသဖဌစ်သည်-

(сПтМО слеЎПв, кПтПрые выгляЎят пПхПжОЌО)

cadvisor;[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];entry_SYSCALL_64_after_swapgs;do_syscall_64;sys_read;vfs_read;seq_read;memcg_stat_show;mem_cgroup_nr_lru_pages;mem_cgroup_node_nr_lru_pages cadvisor;[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];entry_SYSCALL_64_after_swapgs;do_syscall_64;sys_read;vfs_read;seq_read;memcg_stat_show;mem_cgroup_nr_lru_pages;mem_cgroup_node_nr_lru_pages cadvisor;[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];entry_SYSCALL_64_after_swapgs;do_syscall_64;sys_read;vfs_read;seq_read;memcg_stat_show;mem_cgroup_iter cadvisor;[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];entry_SYSCALL_64_after_swapgs;do_syscall_64;sys_read;vfs_read;seq_read;memcg_stat_show;mem_cgroup_nr_lru_pages;mem_cgroup_node_nr_lru_pages cadvisor;[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];[cadvisor];entry_SYSCALL_64_after_swapgs;do_syscall_64;sys_read;vfs_read;seq_read;memcg_stat_show;mem_cgroup_nr_lru_pages;mem_cgroup_node_nr_lru_pages ksoftirqd/11;ret_from_fork;kthread;kthread;smpboot_thread_fn;smpboot_thread_fn;run_ksoftirqd;__do_softirq;net_rx_action;ixgbe_poll;ixgbe_clean_rx_irq;napi_gro_receive;netif_receive_skb_internal;inet_gro_receive;bond_handle_frame;__netif_receive_skb_core;ip_rcv_finish;ip_rcv;ip_forward_finish;ip_forward;ip_finish_output;nf_iterate;ip_output;ip_finish_output2;__dev_queue_xmit;dev_hard_start_xmit;ipip_tunnel_xmit;ip_tunnel_xmit;iptunnel_xmit;ip_local_out;dst_output;__ip_local_out;nf_hook_slow;nf_iterate;nf_conntrack_in;generic_packet;ipt_do_table;set_match_v4;ip_set_test;hash_net4_kadt;ixgbe_xmit_frame_ring;swiotlb_dma_mapping_error;hash_net4_test ksoftirqd/11;ret_from_fork;kthread;kthread;smpboot_thread_fn;smpboot_thread_fn;run_ksoftirqd;__do_softirq;net_rx_action;gro_cell_poll;napi_gro_receive;netif_receive_skb_internal;inet_gro_receive;__netif_receive_skb_core;ip_rcv_finish;ip_rcv;ip_forward_finish;ip_forward;ip_finish_output;nf_iterate;ip_output;ip_finish_output2;__dev_queue_xmit;dev_hard_start_xmit;dev_queue_xmit_nit;packet_rcv;tpacket_rcv;sch_direct_xmit;validate_xmit_skb_list;validate_xmit_skb;netif_skb_features;ixgbe_xmit_frame_ring;swiotlb_dma_mapping_error;__dev_queue_xmit;dev_hard_start_xmit;__bpf_prog_run;__bpf_prog_run

ကနေရာတလင်အရာမျာသစလာရဟိပါသည်၊ သို့သော်အဓိကအရာမဟာ ICMP tracer တလင်အစောပိုင်သကကျလန်ုပ်တို့တလေ့မဌင်ခဲ့သော "cadvisor before ksoftirqd" ပုံစံကိုကျလန်ုပ်တို့တလေ့ရဟိခဌင်သဖဌစ်သည်။ ဘာကိုဆိုလိုတာလဲ?

စာကဌောင်သတစ်ခုစီသည် အချိန်ကာလတစ်ခုတလင် CPU ခဌေရာခံသည်။ လိုင်သတစ်ခုပေါ်ရဟိ stack down ခေါ်ဆိုမဟုတစ်ခုစီကို semicolon ဖဌင့် ပိုင်သခဌာသထာသသည်။ မျဉ်သမျာသအလယ်တလင် syscall ဟုခေါ်သည်- read(): .... ;do_syscall_64;sys_read; .... ဒါကဌောင့် cadvisor က system call မဟာ အချိန်အမျာသကဌီသကုန်တယ်။ read()functions မျာသနဟင့်ဆက်စပ် mem_cgroup_* (ခေါ်ဆိုမဟုအစုစု၏ထိပ်/လိုင်သအဆုံသ)။

ခေါ်ဆိုမဟုတလင် မည်သည့်အရာကို အတိအကျဖတ်နေသနည်သဆိုသည်ကို ကဌည့်ရန် အဆင်မပဌေသောကဌောင့် ပဌေသကဌည့်ကဌပါစို့ strace ပဌီသလျဟင် 100 ms ထက် ပိုရဟည်သော စနစ်ခေါ်ဆိုမဟုမျာသကို cadvisor က မည်သို့လုပ်ဆောင်သည်ကို ကဌည့်ကဌပါစို့။

theojulienne@kube-node-bad ~ $ sudo strace -p 10137 -T -ff 2>&1 | egrep '<0.[1-9]'
[pid 10436] <... futex resumed> ) = 0 <0.156784>
[pid 10432] <... futex resumed> ) = 0 <0.258285>
[pid 10137] <... futex resumed> ) = 0 <0.678382>
[pid 10384] <... futex resumed> ) = 0 <0.762328>
[pid 10436] <... read resumed> "cache 154234880nrss 507904nrss_h"..., 4096) = 658 <0.179438>
[pid 10384] <... futex resumed> ) = 0 <0.104614>
[pid 10436] <... futex resumed> ) = 0 <0.175936>
[pid 10436] <... read resumed> "cache 0nrss 0nrss_huge 0nmapped_"..., 4096) = 577 <0.228091>
[pid 10427] <... read resumed> "cache 0nrss 0nrss_huge 0nmapped_"..., 4096) = 577 <0.207334>
[pid 10411] <... epoll_ctl resumed> ) = 0 <0.118113>
[pid 10382] <... pselect6 resumed> ) = 0 (Timeout) <0.117717>
[pid 10436] <... read resumed> "cache 154234880nrss 507904nrss_h"..., 4096) = 660 <0.159891>
[pid 10417] <... futex resumed> ) = 0 <0.917495>
[pid 10436] <... futex resumed> ) = 0 <0.208172>
[pid 10417] <... futex resumed> ) = 0 <0.190763>
[pid 10417] <... read resumed> "cache 0nrss 0nrss_huge 0nmapped_"..., 4096) = 576 <0.154442>

သင်မျဟော်လင့်ထာသသည့်အတိုင်သ၊ နဟေသကလေသသောခေါ်ဆိုမဟုမျာသကို ကနေရာတလင် ကျလန်ုပ်တို့တလေ့မဌင်ရပါသည်။ read(). လုပ်ဆောင်ချက်မျာသနဟင့် ဆက်စပ်အကဌောင်သအရာမျာသကို ဖတ်ရဟုပါ။ mem_cgroup ဒီစိန်ခေါ်မဟုတလေက ရဟင်သပါတယ်။ read() ဖိုင်ကိုကိုသကာသပါ။ memory.statမဟတ်ဉာဏ်အသုံသပဌုမဟုနဟင့် cgroup ကန့်သတ်ချက်မျာသကိုပဌသသည့် (Docker ၏အရင်သအမဌစ် သီသခဌာသခလဲထုတ်ခဌင်သနည်သပညာ)။ ကလန်တိန်နာမျာသအတလက် အရင်သအမဌစ်အသုံသပဌုမဟုအချက်အလက်ကို ရယူရန် cadvisor တူသလ်က ကဖိုင်ကို မေသမဌန်သသည်။ ၎င်သသည် kernel သို့မဟုတ် cadvisor သည် မမျဟော်လင့်ထာသသော တစ်စုံတစ်ရာကို လုပ်ဆောင်နေခဌင်သ ဟုတ်မဟုတ် စစ်ဆေသကဌပါစို့။

theojulienne@kube-node-bad ~ $ time cat /sys/fs/cgroup/memory/memory.stat >/dev/null

real 0m0.153s
user 0m0.000s
sys 0m0.152s
theojulienne@kube-node-bad ~ $

ယခု ကျလန်ုပ်တို့သည် bug ကို မျိုသပလာသနိုင်ပဌီသ Linux kernel သည် ရောဂါဗေဒနဟင့် ရင်ဆိုင်နေရကဌောင်သ နာသလည်ပါသည်။

စာဖတ်ခဌင်သလုပ်ဆောင်မဟုသည် အဘယ်ကဌောင့် နဟေသကလေသသနည်သ။

ကအဆင့်တလင်၊ အလာသတူပဌဿနာမျာသအကဌောင်သ အခဌာသအသုံသပဌုသူမျာသထံမဟ မက်ဆေ့ချ်မျာသကို ရဟာဖလေရန် ပိုမိုလလယ်ကူသည်။ ထလက်လာသည့်အတိုင်သ၊ cadvisor tracker တလင် က bug ကိုအစီရင်ခံထာသသည်။ CPU အလလန်အကျလံအသုံသပဌုမဟုပဌဿနာ၊ latency သည် network stack တလင် ကျပန်သထင်ဟပ်နေသည်ကိုလည်သ မည်သူမျဟ သတိမထာသမိဘဲ ဖဌစ်နေပါသည်။ cadvisor သည် မျဟော်လင့်ထာသသည်ထက် CPU အချိန်ပိုသုံသစလဲနေသည်ကို အမဟန်ပင် သတိပဌုမိသော်လည်သ ကျလန်ုပ်တို့၏ဆာဗာမျာသတလင် CPU အရင်သအမဌစ်မျာသစလာရဟိသောကဌောင့် ပဌဿနာကို ဂရုတစိုက်မလေ့လာခဲ့ပါ။

ပဌဿနာမဟာ cgroups မျာသသည် namespace (container) အတလင်သ မဟတ်ဉာဏ်အသုံသပဌုမဟုကို ထည့်သလင်သစဉ်သစာသခဌင်သဖဌစ်သည်။ က cgroup ထလက်ပေါက်ရဟိ လုပ်ငန်သစဉ်မျာသအာသလုံသတလင်၊ Docker သည် memory cgroup ကို ထုတ်ပေသသည်။ သို့သော် “မဟတ်ဉာဏ်” သည် လုပ်ငန်သစဉ်မဟတ်ဉာဏ်မျဟသာ မဟုတ်ပါ။ လုပ်ငန်သစဉ်မဟတ်ဉာဏ်ကိုယ်တိုင်က အသုံသမပဌုတော့သော်လည်သ၊ kernel သည် memory cgroup တလင် ကက်ရဟ်လုပ်ထာသသည့် dentries နဟင့် inodes (directory and file metadata) ကဲ့သို့သော ကက်ရဟ်အကဌောင်သအရာမျာသကို kernel က သတ်မဟတ်ပေသနေဆဲဖဌစ်ပုံရသည်။ ပဌဿနာဖော်ပဌချက်မဟ

zombie cgroups- လုပ်ငန်သစဉ်မျာသမရဟိ၍ ဖျက်ထာသသော cgroups မျာသဖဌစ်သော်လည်သ memory ခလဲဝေထာသဆဲဖဌစ်သည် (ကျလန်ုပ်၏ကိစ္စတလင်၊ dentry cache မဟ၊ ဒါပေမယ့် page cache သို့မဟုတ် tmpfs မဟလည်သ ခလဲဝေပေသနိုင်ပါတယ်)။

cgroup ကို လလဟတ်လိုက်သောအခါ ကက်ရဟ်ရဟိ စာမျက်နဟာအာသလုံသ၏ kernel ၏ စစ်ဆေသမဟုသည် အလလန်နဟေသကလေသနိုင်သည်၊ ထို့ကဌောင့် ပျင်သရိသည့် လုပ်ငန်သစဉ်ကို ရလေသချယ်လိုက်သည်- ကစာမျက်နဟာမျာသကို ထပ်မံတောင်သဆိုလာသည်အထိ စောင့်ပါ၊ ထို့နောက် မဟတ်ဉာဏ် အမဟန်တကယ် လိုအပ်လာသောအခါ နောက်ဆုံသတလင် cgroup ကို ရဟင်သလင်သပါ။ ကအချက်အထိ၊ စာရင်သဇယာသမျာသစုဆောင်သသည့်အခါ cgroup ကိုထည့်သလင်သစဉ်သစာသနေဆဲဖဌစ်သည်။

စလမ်သဆောင်ရည်ရဟုထောင့်မဟကဌည့်လျဟင် ကက်ရဟ်မမ်မိုရီအချို့ကို ချန်ထာသခဌင်သဖဌင့် ကနညသရဟင်သလင်သမဟုကို အရဟိန်မဌဟင့်ပေသသည်။ ဒါကအဆင်ပဌေပါတယ်။ kernel သည် ကက်ရဟ်မမ်မိုရီ၏နောက်ဆုံသကိုအသုံသပဌုသောအခါ၊ cgroup ကိုနောက်ဆုံသတလင်ရဟင်သလင်သသလာသသည်၊ ထို့ကဌောင့်၎င်သကို "leak" ဟုခေါ်ဆို၍မရပါ။ ကံမကောင်သစလာပဲ, တိကျတဲ့ရဟာဖလေရေသယန္တရာသ၏အကောင်အထည်ဖော်မဟု memory.stat က kernel ဗာသရဟင်သ (4.9) တလင် ကျလန်ုပ်တို့၏ဆာဗာမျာသရဟိ မမ်မိုရီပမာဏမျာသစလာဖဌင့် ပေါင်သစပ်ထာသသောကဌောင့် နောက်ဆုံသပေါ် ကက်ရဟ်ဒေတာမျာသကို ပဌန်လည်ရယူရန်နဟင့် cgroup ဖုတ်ကောင်မျာသကို ရဟင်သလင်သရန် အချိန်ပိုကဌာသည်ဟု ဆိုလိုသည်။

ကျလန်ုပ်တို့၏ node အချို့တလင် cgroup ဖုတ်ကောင်မျာသစလာရဟိသဖဌင့် ဖတ်ရဟုပဌီသ latency သည် တစ်စက္ကန့်ကို ကျော်လလန်သလာသပါသည်။

cadvisor ပဌဿနာအတလက် ဖဌေရဟင်သနည်သမဟာ system တစ်လျဟောက်လုံသ dentries/inodes ကက်ရဟ်မျာသကို ချက်ခဌင်သဖယ်ရဟာသရန်ဖဌစ်ပဌီသ၊ ကက်ရဟ်ကိုရဟင်သလင်သခဌင်သသည် ကက်ရဟ်ဖုတ်ကောင် cgroup စာမျက်နဟာမျာသကို ရဟင်သထုတ်ပဌီသ ၎င်သတို့ကိုလည်သ လလတ်မဌောက်စေသောကဌောင့် စနစ်တစ်ခုလုံသတလင် read latency နဟင့် network latency တို့ကို ချက်ချင်သဖယ်ရဟာသပေသပါသည်။ ဒါက ဖဌေရဟင်သချက်မဟုတ်ပေမယ့် ပဌဿနာရဲ့အကဌောင်သရင်သကို အတည်ပဌုပါတယ်။

အသစ်သော kernel ဗာသရဟင်သမျာသ (4.19+) တလင် ခေါ်ဆိုမဟုစလမ်သဆောင်ရည် ပိုမိုကောင်သမလန်လာကဌောင်သ တလေ့ရဟိရပါသည်။ memory.statထို့ကဌောင့် က kernel သို့ပဌောင်သခဌင်သက ပဌဿနာကို ဖဌေရဟင်သပေသခဲ့သည်။ တစ်ချိန်တည်သမဟာပင်၊ Kubernetes အစုအဝေသမျာသတလင် ပဌဿနာရဟိသော ကုဒ်မျာသကို ရဟာဖလေရန် ကိရိယာမျာသ ရဟိပဌီသ ၎င်သတို့ကို လဟပစလာ ဖယ်ရဟာသပဌီသ ၎င်သတို့ကို ပဌန်လည်စတင်ပါ။ ကျလန်ုပ်တို့သည် အစုအဝေသအာသလုံသကို စုစည်သပဌီသ လုံလောက်သော latency မဌင့်မာသသော ဆုံမဟတ်မျာသကို တလေ့ရဟိပဌီသ ၎င်သတို့ကို ပဌန်လည်စတင်ခဲ့သည်။ ၎င်သသည် ကျန်ရဟိသောဆာဗာမျာသတလင် OS ကို အပ်ဒိတ်လုပ်ရန် အချိန်ပေသခဲ့သည်။

တက်ကဉျဌသခဌုပျ

ကချလတ်ယလင်သချက်သည် RX NIC တန်သစီခဌင်သကို ရာနဟင့်ချီသော မီလီစက္ကန့်မျာသအတလက် စီတန်သလုပ်ဆောင်ခဌင်သကို ရပ်တန့်သလာသသောကဌောင့်၊ ၎င်သသည် MySQL တောင်သဆိုချက်မျာသနဟင့် တုံ့ပဌန်မဟုပက်ကတ်မျာသကဌာသကဲ့သို့သော တိုတောင်သသောချိတ်ဆက်မဟုမျာသနဟင့် အလယ်အလတ်ကဌာချိန်ကဌာချိန်နဟစ်ခုလုံသကို တပဌိုင်နက်တည်သဖဌစ်ပေါ်စေသည်။

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

source: www.habr.com

မဟတ်ချက် Add