Debogaj latansi rezo nan Kubernetes

Debogaj latansi rezo nan Kubernetes

Yon koup de ane de sa Kubernetes deja diskite sou blog ofisyèl GitHub la. Depi lè sa a, li te vin teknoloji estanda pou deplwaye sèvis yo. Kubernetes kounye a jere yon pati enpòtan nan sèvis entèn ak piblik yo. Kòm grap nou yo te grandi ak kondisyon pèfòmans yo te vin pi sevè, nou te kòmanse remake ke kèk sèvis sou Kubernetes te detanzantan fè eksperyans latansi ki pa t 'kapab eksplike pa chaj aplikasyon an li menm.

Esansyèlman, aplikasyon yo fè eksperyans latansi rezo o aza ki rive jiska 100ms oswa plis, sa ki lakòz timeouts oswa reesye. Sèvis yo te espere pou kapab reponn a demann pi vit pase 100ms. Men, sa a se enposib si koneksyon an tèt li pran anpil tan. Separeman, nou te obsève demann MySQL trè vit ki ta dwe pran milisgond, ak MySQL te ranpli an milisgond, men nan pèspektiv aplikasyon an mande a, repons lan te pran 100 ms oswa plis.

Li imedyatman te vin klè ke pwoblèm nan te fèt sèlman lè konekte ak yon ne Kubernetes, menm si apèl la te soti deyò Kubernetes. Fason ki pi fasil pou repwodui pwoblèm nan se nan yon tès legum, ki soti nan nenpòt lame entèn, teste sèvis la Kubernetes sou yon pò espesifik, epi detanzantan anrejistre gwo latansi. Nan atik sa a, nou pral gade ki jan nou te kapab jwenn kòz pwoblèm sa a.

Elimine konpleksite nesesè nan chèn ki mennen nan echèk

Lè nou repwodui menm egzanp lan, nou te vle etwat konsantre nan pwoblèm nan epi retire kouch konpleksite ki pa nesesè. Okòmansman, te gen twòp eleman nan koule ki genyen ant Vegeta ak gous Kubernetes yo. Pou idantifye yon pwoblèm rezo pi fon, ou bezwen eskli kèk nan yo.

Debogaj latansi rezo nan Kubernetes

Kliyan an (Vegeta) kreye yon koneksyon TCP ak nenpòt ne nan gwoup la. Kubernetes opere kòm yon rezo kouvri (sou tèt rezo sant done ki egziste deja) ki itilize IPIP, se sa ki, li encapsule pake IP yo nan rezo a kouvri andedan pake IP yo nan sant done a. Lè w konekte ak premye ne, tradiksyon adrès rezo a fèt Tradiksyon Adrès Rezo (NAT) stateful pou tradui adrès IP ak pò ne Kubernetes nan adrès IP ak pò nan rezo a kouvri (espesyalman, gous la ak aplikasyon an). Pou pake fèk ap rantre yo, se sekans ranvèse aksyon yo fèt. Li se yon sistèm konplèks ak anpil eta ak anpil eleman ki toujou ap mete ajou ak chanje pandan sèvis yo ap deplwaye ak deplase.

Sèvis piblik tcpdump nan tès Vegeta a gen yon reta pandan TCP lanmen (ant SYN ak SYN-ACK). Pou retire konpleksite sa a nesesè, ou ka itilize hping3 pou senp "ping" ak pake SYN. Nou tcheke si gen yon reta nan pake repons lan, ak Lè sa a, reset koneksyon an. Nou ka filtre done yo pou sèlman enkli pake ki pi gran pase 100ms epi jwenn yon fason pi fasil pou repwodui pwoblèm nan pase tès konplè rezo kouch 7 Vegeta a. Isit la yo se "pings" node Kubernetes lè l sèvi avèk TCP SYN/SYN-ACK sou "pò ne" sèvis la (30927) nan entèval 10ms, filtre pa repons pi dousman:

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

Ka imedyatman fè premye obsèvasyon an. Jije pa nimewo sekans yo ak tan yo, li klè ke sa yo pa konjesyon yon sèl fwa. Reta a souvan akimile epi evantyèlman trete.

Apre sa, nou vle chèche konnen ki eleman ki ka patisipe nan ensidan an nan konjesyon. Petèt sa yo se kèk nan dè santèn de règ iptables nan NAT? Oswa èske gen nenpòt pwoblèm ak tinèl IPIP sou rezo a? Youn nan fason yo tcheke sa a se teste chak etap nan sistèm nan pa elimine li. Kisa k ap pase si ou retire NAT ak lojik firewall, kite sèlman pati IPIP la:

Debogaj latansi rezo nan Kubernetes

Erezman, Linux fè li fasil jwenn aksè nan kouch IP kouvri dirèkteman si machin nan sou menm rezo a:

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

Jije pa rezilta yo, pwoblèm nan toujou rete! Sa a ekskli iptables ak NAT. Se konsa, pwoblèm nan se TCP? Ann wè ki jan yon ping ICMP regilye ale:

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

Rezilta yo montre ke pwoblèm nan pa ale. Petèt sa a se yon tinèl IPIP? Ann senplifye tès la plis:

Debogaj latansi rezo nan Kubernetes

Èske tout pake yo voye ant de lame sa yo?

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

Nou te senplifye sitiyasyon an nan de nœuds Kubernetes youn voye lòt nenpòt pake, menm yon ping ICMP. Yo toujou wè latansi si lame sib la "move" (kèk pi mal pase lòt).

Koulye a, dènye kesyon an: poukisa reta a sèlman rive sou sèvè kube-node? Epi èske sa rive lè kube-node se moun k ap voye a oswa reseptè a? Erezman, sa a se tou byen fasil pou evalye lè w voye yon pake ki soti nan yon lame deyò Kubernetes, men ak menm moun k ap resevwa "move li te ye". Kòm ou ka wè, pwoblèm nan pa te disparèt:

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

Lè sa a, nou pral kouri menm demann yo soti nan sous kube-node anvan an nan lame ekstèn lan (ki eskli lame sous la depi ping la gen ladan tou de yon eleman RX ak 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

Lè nou egzamine kaptire pake latansi, nou te jwenn kèk enfòmasyon adisyonèl. Espesyalman, moun k ap voye a (anba) wè tan sa a, men moun k ap resevwa a (anwo) pa wè kolòn Delta a (an segonn):

Debogaj latansi rezo nan Kubernetes

Anplis de sa, si w gade diferans ki genyen nan lòd TCP ak pake ICMP (pa nimewo sekans) sou bò moun k ap resevwa a, pake ICMP toujou rive nan menm sekans kote yo te voye yo, men ak distribisyon diferan. An menm tan an, pakè TCP pafwa antre, epi kèk nan yo bloke. An patikilye, si ou egzamine pò yo nan pake SYN yo, yo nan lòd sou bò moun k ap voye a, men se pa sou bò reseptè a.

Gen yon diferans sibtil nan fason kat rezo yo sèvè modèn (tankou sa yo ki nan sant done nou an) trete pake ki gen TCP oswa ICMP. Lè yon pake rive, adaptè rezo a "hashes li pou chak koneksyon", se sa ki, li eseye kraze koneksyon yo nan keu epi voye chak keu nan yon nwayo processeur separe. Pou TCP, hash sa a gen ladan tou de sous la ak destinasyon adrès IP ak pò. Nan lòt mo, chak koneksyon se hashed (potansyèlman) yon fason diferan. Pou ICMP, se sèlman adrès IP yo hache, paske pa gen okenn pò.

Yon lòt obsèvasyon nouvo: pandan peryòd sa a nou wè reta ICMP sou tout kominikasyon ant de lame, men TCP pa fè sa. Sa a di nou ke kòz la gen anpil chans ki gen rapò ak hachage keu RX: konjesyon an se prèske sètènman nan pwosesis la nan pake RX, pa nan voye repons yo.

Sa a elimine voye pake nan lis kòz posib yo. Nou konnen kounye a ke pwoblèm nan pwosesis pake se sou bò resevwa sou kèk sèvè kube-node.

Konprann pwosesis pake nan nwayo Linux la

Pou konprann poukisa pwoblèm nan rive nan reseptè a sou kèk sèvè kube-node, ann gade nan ki jan Linux Kernel la trete pake.

Retounen nan aplikasyon ki pi senp tradisyonèl la, kat rezo a resevwa pake a epi voye entèwonp Kernel Linux ke gen yon pake ki bezwen trete. Kernel la sispann lòt travay, chanje kontèks nan moun k ap okipe entèwonp la, trete pake a, epi retounen nan travay aktyèl yo.

Debogaj latansi rezo nan Kubernetes

Chanjman nan kontèks sa a se ralanti: latansi ta ka pa te aparan sou kat rezo 10Mbps nan ane 90 yo, men sou kat modèn 10G ak yon debi maksimòm de 15 milyon pakè pou chak segonn, chak nwayo nan yon ti sèvè uit nwayo ka entèwonp dè milyon. de fwa pa segonn.

Nan lòd pa toujou ap okipe entèwonp, anpil ane de sa Linux te ajoute NAPI: API rezo ke tout chofè modèn itilize pou amelyore pèfòmans nan gwo vitès. Nan vitès ki ba, nwayo a toujou resevwa entèwonp nan kat rezo a nan ansyen fason an. Yon fwa ase pake rive ki depase papòt la, nwayo a enfim entèwonp epi olye yo kòmanse sondaj adaptè rezo a ak ranmase pake an fragman. Pwosesis fèt nan softirq, se sa ki nan kontèks entèwonp lojisyèl apre apèl sistèm ak entèwonp pyès ki nan konpitè, lè nwayo a (kontrèman ak espas itilizatè) deja ap kouri.

Debogaj latansi rezo nan Kubernetes

Sa a se pi vit, men lakòz yon pwoblèm diferan. Si gen twòp pake, Lè sa a, tout tan tout tan an ap pase trete pake ki soti nan kat rezo a, ak pwosesis espas itilizatè yo pa gen tan aktyèlman vid sa yo ke moun kap kriye (li nan koneksyon TCP, elatriye). Evantyèlman ke moun kap kriye yo ranpli epi nou kòmanse jete pake. Nan yon tantativ pou jwenn yon balans, nwayo a fikse yon bidjè pou kantite maksimòm pake trete nan kontèks softirq la. Yon fwa bidjè sa a depase, yon fil separe reveye ksoftirqd (ou pral wè youn nan yo nan ps pou chak nwayo) ki okipe softirqs sa yo andeyò chemen nòmal syscall/interruption. Fil sa a pwograme lè l sèvi avèk pwogramasyon pwosesis estanda a, ki eseye asiyen resous san patipri.

Debogaj latansi rezo nan Kubernetes

Lè w fin etidye kijan nwayo a trete pake yo, ou ka wè ke gen yon sèten chans pou konjesyon. Si yo resevwa apèl softirq mwens souvan, pake yo ap oblije tann kèk tan pou yo trete yo nan keu RX sou kat rezo a. Sa a ka akòz kèk travay bloke nwayo a processeur, oswa yon lòt bagay ap anpeche nwayo a kouri softirq.

Limite pwosesis la desann nan nwayo a oswa metòd

Reta Softirq yo se jis yon devine pou kounye a. Men, li fè sans, epi nou konnen nou ap wè yon bagay ki sanble anpil. Se konsa, pwochen etap la se konfime teyori sa a. Men, si li konfime, Lè sa a, jwenn rezon ki fè yo reta yo.

Ann retounen nan pake dousman nou yo:

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

Jan nou te diskite pi bonè, pake ICMP sa yo yo hache nan yon sèl keu RX NIC epi trete pa yon sèl nwayo CPU. Si nou vle konprann ki jan Linux travay, li itil pou konnen ki kote (sou ki nwayo CPU) ak ki jan (softirq, ksoftirqd) pakè sa yo trete yo nan lòd yo swiv pwosesis la.

Koulye a, li lè yo sèvi ak zouti ki pèmèt ou kontwole nwayo Linux la an tan reyèl. Isit la nou te itilize bcc. Seri zouti sa a pèmèt ou ekri ti pwogram C ki branche fonksyon abitrè nan nwayo a epi tampon evènman yo nan yon pwogram Python espas itilizatè ki ka trete yo epi retounen rezilta a ba ou. Akrochaj fonksyon abitrè nan nwayo a se yon pwoblèm konplèks, men sèvis piblik la fèt pou sekirite maksimòm epi li fèt pou swiv egzakteman kalite pwoblèm pwodiksyon ki pa fasil repwodui nan yon anviwònman tès oswa devlopman.

Plan an se senp: nou konnen ke nwayo a trete ping ICMP sa yo, kidonk nou pral mete yon zen sou fonksyon nwayo a. icmp_echo, ki aksepte yon pake demann eko ICMP k ap rantre epi li kòmanse voye yon repons eko ICMP. Nou ka idantifye yon pake lè nou ogmante nimewo icmp_seq, ki montre hping3 pi wo.

Kòd script bcc sanble konplike, men li pa tankou pè jan li sanble. Fonksyon icmp_echo transmèt struct sk_buff *skb: Sa a se yon pake ki gen yon "demann eko". Nou ka swiv li, rale soti sekans lan echo.sequence (ki konpare ak icmp_seq pa hping3 выше), epi voye li nan espas itilizatè. Li tou pratik pou pran non/id pwosesis aktyèl la. Anba a se rezilta nou wè dirèkteman pandan nwayo a ap trete pake yo:

TGID PID PROCESS NAME ICMP_SEQ 0 0 swapper/11 770 0 0 swapper/11 771 0 0 swapper/11 772 0 0 swapper/11 773 0 0 swapper/11 774 20041 20086 swapper/ prometheus 775 0 0 11 776 0 swapper/0 11 777 0 rapò-s 0

Li ta dwe remake isit la ke nan kontèks la softirq pwosesis ki fè apèl sistèm ap parèt kòm "pwosesis" lè an reyalite se nwayo a ki trete pake san danje nan kontèks nwayo a.

Avèk zouti sa a nou ka asosye pwosesis espesifik ak pakè espesifik ki montre yon reta nan hping3. Ann fè li senp grep sou kaptire sa a pou sèten valè icmp_seq. Yo te note pake ki matche ak valè icmp_seq ki anwo yo ansanm ak RTT yo nou te obsève pi wo a (nan parantèz yo se valè RTT yo te espere pou pake ke nou filtre akòz valè RTT mwens pase 50 ms):

TGID PID PWOSESIS NON ICMP_SEQ ** RTT -- 10137 10436 cadvisor 1951 10137 10436 cadvisor 1952 76 76 ksoftirqd/11 1953 ** 99ms 76 76 11 1954 89 ksoftirqd 76 76 ksoftirqd/11 1955 ir qd/79 76 ** 76ms 11 1956 ksoftirqd/ 69 76 ** 76ms 11 1957 ksoftirqd/59 76 ** 76ms 11 1958 ksoftirqd/49 76 ** (76ms) 11 1959 ksoftirqd/39 76 ** (76ms 11 1960 ksoftirqd/29 76 ** (76ms) 11 1961 ksoftirqd/19 76 ** (76ms 11/1962) **9qd 10137 10436 ksoft irqd/ 2068 10137 ** (10436ms) 2069 76 ksoftirqd/76 11 ** (2070ms) -- 75 76 cadvisor 76 11 2071 cadvisor 65 76 76 ksoftir 11 2072 ksoftir 55 76 ** irqd/76 11 ** 2073ms 45 76 ksoftirqd/ 76 11 ** 2074ms 35 76 ksoftirqd/76 11 ** (2075ms) 25 76 ksoftirqd/76 11 ** (2076ms) 15 76 ksoftirqd/76 11 2077 **5 XNUMX ksoftirqd/XNUMX XNUMX ** (XNUMX ms ) XNUMX XNUMX ksoftirqd/XNUMX XNUMX ** (XNUMXms)

Rezilta yo di nou plizyè bagay. Premyèman, tout pakè sa yo trete pa kontèks la ksoftirqd/11. Sa vle di ke pou pè sa a patikilye nan machin, pake ICMP yo te hache nan nwayo 11 nan fen k ap resevwa a. Nou wè tou ke chak fwa gen yon blokis, gen pake ki trete nan kontèks apèl sistèm lan. cadvisor. Lè sa a ,. ksoftirqd pran sou travay la ak trete keu a akimile: egzakteman kantite pake ki te akimile apre cadvisor.

Lefèt ke imedyatman anvan li toujou ap travay cadvisor, implique patisipasyon li nan pwoblèm nan. Iwonilman, objektif la cadvisor - "Analize itilizasyon resous ak karakteristik pèfòmans nan kouri kontenè" olye ke sa lakòz pwoblèm pèfòmans sa a.

Menm jan ak lòt aspè nan resipyan, sa yo se tout zouti trè avanse epi yo ka espere fè eksperyans pwoblèm pèfòmans nan kèk sikonstans enprevi.

Kisa cadvisor fè ki ralanti keu pake a?

Kounye a nou gen yon konpreyansyon trè byen sou ki jan aksidan an fèt, ki pwosesis ki lakòz li, ak sou ki CPU. Nou wè ke akòz bloke difisil, nwayo Linux la pa gen tan pou pwograme ksoftirqd. Epi nou wè ke pake yo trete nan kontèks cadvisor. Li lojik pou asime sa cadvisor lanse yon syscall dousman, apre sa yo trete tout pake ki akimile nan moman sa a:

Debogaj latansi rezo nan Kubernetes

Sa a se yon teyori, men ki jan yo teste li? Ki sa nou ka fè se trase nwayo CPU a pandan tout pwosesis sa a, jwenn pwen kote kantite pake ale sou bidjè ak ksoftirqd yo rele, ak Lè sa a, gade yon ti kras pi lwen tounen pou wè ki sa egzakteman te kouri sou nwayo CPU a jis anvan pwen sa a. . Se tankou radyografi CPU a chak kèk milisgond. Li pral gade yon bagay tankou sa a:

Debogaj latansi rezo nan Kubernetes

Byen, tout bagay sa yo ka fè ak zouti ki egziste deja. Pa egzanp, dosye perf tcheke yon nwayo CPU bay nan yon frekans espesifye epi li ka jenere yon orè nan apèl nan sistèm nan kouri, ki gen ladan tou de espas itilizatè ak nwayo Linux la. Ou ka pran dosye sa a epi trete li lè l sèvi avèk yon ti fouchèt nan pwogram nan FlameGraph soti nan Brendan Gregg, ki prezève lòd la nan tras la chemine. Nou ka sove tras pile yon sèl liy chak 1 ms, ak Lè sa a, mete aksan sou epi sove yon echantiyon 100 milisgond anvan tras la frape. 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

Men rezilta yo:

(сотни следов, которые выглядят похожими)

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

Gen anpil bagay isit la, men bagay prensipal la se ke nou jwenn modèl "cadvisor anvan ksoftirqd" ke nou te wè pi bonè nan traser ICMP la. Sa sa vle di?

Chak liy se yon tras CPU nan yon sèten pwen nan tan. Chak apèl desann pile a sou yon liy separe pa yon pwen-vir. Nan mitan liy yo nou wè syscall yo rele: read(): .... ;do_syscall_64;sys_read; .... Se konsa, cadvisor pase anpil tan sou apèl sistèm lan read()ki gen rapò ak fonksyon yo mem_cgroup_* (anlè pil apèl/fen liy).

Li pa konvenyan pou w wè nan yon tras apèl ki sa egzakteman y ap li, kidonk ann kouri strace epi ann wè sa cadvisor fè epi jwenn apèl sistèm ki pi long pase 100 ms:

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>

Kòm ou ta ka espere, nou wè apèl dousman isit la read(). Soti nan sa ki nan operasyon lekti ak kontèks mem_cgroup li klè ke defi sa yo read() al gade nan dosye a memory.stat, ki montre itilizasyon memwa ak limit cgroup (teknoloji izòlman resous Docker a). Zouti cadvisor la mande fichye sa a pou jwenn enfòmasyon sou itilizasyon resous pou resipyan yo. Ann tcheke si se nwayo a oswa kadvisor ki fè yon bagay inatandi:

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 ~ $

Koulye a, nou ka repwodui ensèk la epi konprann ke nwayo Linux la ap fè fas a yon patoloji.

Poukisa operasyon lekti a tèlman dousman?

Nan etap sa a, li pi fasil pou jwenn mesaj ki soti nan lòt itilizatè sou pwoblèm ki sanble. Kòm li te tounen soti, nan tracker a cadvisor ensèk sa a te rapòte kòm pwoblèm nan itilizasyon CPU twòp, li jis ke pèsonn pa remake ke latansi a tou owaza reflete nan chemine rezo a. Li te vrèman remake ke cadvisor te konsome plis tan CPU pase espere, men sa a pa te bay anpil enpòtans, depi sèvè nou yo gen anpil resous CPU, kidonk pwoblèm nan pa te ak anpil atansyon etidye.

Pwoblèm nan se ke cgroups pran an kont itilizasyon memwa nan espas non an (veso). Lè tout pwosesis nan cgroup sa a sòti, Docker lage cgroup memwa a. Sepandan, "memwa" se pa sèlman memwa pwosesis. Malgre ke memwa pwosesis la li menm yo pa itilize ankò, li parèt ke nwayo a toujou bay sa ki nan kachèt, tankou dentries ak inodes (anyè ak fichye metadata), ki kache nan cgroup memwa a. Soti nan deskripsyon pwoblèm nan:

zonbi cgroups: cgroups ki pa gen okenn pwosesis epi yo te efase, men yo toujou gen memwa atribye ba (nan ka mwen an, nan kachèt dentry la, men li kapab tou resevwa lajan nan kachèt paj la oswa tmpfs).

Tcheke nwayo a nan tout paj yo nan kachèt la lè yo libere yon cgroup ka trè dousman, kidonk pwosesis la parese chwazi: rete tann jiskaske paj sa yo mande ankò, epi finalman efase cgroup la lè memwa a aktyèlman bezwen. Jiska pwen sa a, cgroup toujou pran an kont lè kolekte estatistik.

Soti nan yon pwendvi pèfòmans, yo sakrifye memwa pou pèfòmans: akselere netwayaj inisyal la lè yo kite kèk memwa kachèt dèyè. Sa a se byen. Lè nwayo a sèvi ak dènye memwa nan kachèt la, cgroup la evantyèlman efase, kidonk li pa ka rele yon "fuit". Malerezman, aplikasyon an espesifik nan mekanis rechèch la memory.stat nan vèsyon nwayo sa a (4.9), konbine avèk yon gwo kantite memwa sou sèvè nou yo, sa vle di ke li pran anpil tan pou retabli dènye done yo nan kachèt ak klè zonbi cgroup yo.

Li sanble ke kèk nan nœuds nou yo te gen anpil zonbi cgroup ke lekti a ak latansi depase yon segonn.

Solay pou pwoblèm nan cadvisor se imedyatman libere kachèt dentries/inodes nan tout sistèm nan, ki imedyatman elimine latansi lekti ak latansi rezo sou lame a, depi netwaye kachèt la vire sou paj cgroup zonbi yo nan kachèt epi li libere yo tou. Sa a se pa yon solisyon, men li konfime kòz la nan pwoblèm nan.

Li te tounen soti ke nan nouvo vèsyon nwayo (4.19+) yo te amelyore pèfòmans apèl memory.stat, kidonk chanje nan nwayo sa a te fikse pwoblèm nan. An menm tan an, nou te gen zouti pou detekte nœuds pwoblèm nan grap Kubernetes, drenaj yo ak rdemare yo. Nou penyen tout grap yo, nou jwenn nœuds ki gen ase latansi epi rdemare yo. Sa a te ban nou tan mete ajou OS la sou rès serveurs yo.

Adisyon moute

Paske ensèk sa a te sispann pwosesis keu RX NIC pou dè santèn de milisgond, li te lakòz tou de gwo latansi sou koneksyon kout ak latansi mitan koneksyon, tankou ant demann MySQL ak pake repons.

Konprann epi kenbe pèfòmans sistèm ki pi fondamantal yo, tankou Kubernetes, se yon bagay enpòtan pou fyab ak vitès tout sèvis ki baze sou yo. Chak sistèm ou kouri benefisye de amelyorasyon pèfòmans Kubernetes.

Sous: www.habr.com

Add nouvo kòmantè