N ṣatunṣe aṣiṣe nẹtiwọki ni Kubernetes

N ṣatunṣe aṣiṣe nẹtiwọki ni Kubernetes

A tọkọtaya ti odun seyin Kubernetes tẹlẹ sísọ lori bulọọgi GitHub osise. Lati igbanna, o ti di imọ-ẹrọ boṣewa fun gbigbe awọn iṣẹ ṣiṣẹ. Kubernetes ni bayi ṣakoso ipin pataki ti awọn iṣẹ inu ati ti gbogbo eniyan. Bi awọn iṣupọ wa ṣe n dagba ati awọn ibeere iṣẹ ṣe di okun sii, a bẹrẹ si ṣe akiyesi pe diẹ ninu awọn iṣẹ lori Kubernetes ni iriri aipẹ ti ko le ṣe alaye nipasẹ ẹru ohun elo funrararẹ.

Ni pataki, awọn ohun elo ni iriri aipe nẹtiwọọki laileto ti o to 100ms tabi diẹ sii, ti o yọrisi awọn akoko ipari tabi awọn atunwo. Awọn iṣẹ ni a nireti lati ni anfani lati dahun si awọn ibeere pupọ yiyara ju 100ms. Ṣugbọn eyi ko ṣee ṣe ti asopọ funrararẹ gba akoko pupọ. Lọtọ, a ṣe akiyesi awọn ibeere MySQL ti o yara pupọ ti o yẹ ki o ti gba awọn iṣẹju-aaya, ati MySQL ṣe pipe ni awọn aaya milimita, ṣugbọn lati irisi ohun elo ti nbere, idahun gba 100ms tabi diẹ sii.

Lẹsẹkẹsẹ o han gbangba pe iṣoro naa waye nikan nigbati o ba sopọ si ipade Kubernetes, paapaa ti ipe ba wa lati ita Kubernetes. Ọna to rọọrun lati ṣe ẹda iṣoro naa wa ni idanwo kan Vegeta, ti o nṣiṣẹ lati eyikeyi ti abẹnu ogun, idanwo awọn Kubernetes iṣẹ lori kan pato ibudo, ati sporadically forukọsilẹ ga lairi. Ninu nkan yii, a yoo wo bi a ṣe le ṣe atẹle idi ti iṣoro yii.

Imukuro idiju ti ko wulo ninu pq ti o yori si ikuna

Nipa atunkọ apẹẹrẹ kanna, a fẹ lati dín idojukọ iṣoro naa ati yọkuro awọn ipele ti ko ni dandan ti idiju. Ni ibẹrẹ, ọpọlọpọ awọn eroja wa ninu sisan laarin Vegeta ati awọn pods Kubernetes. Lati ṣe idanimọ iṣoro nẹtiwọki ti o jinlẹ, o nilo lati ṣe akoso diẹ ninu wọn.

N ṣatunṣe aṣiṣe nẹtiwọki ni Kubernetes

Onibara (Vegeta) ṣẹda asopọ TCP pẹlu eyikeyi ipade ninu iṣupọ. Kubernetes nṣiṣẹ bi nẹtiwọọki agbekọja (lori oke ti nẹtiwọọki ile-iṣẹ data ti o wa tẹlẹ) ti o nlo IPIP, ti o ni, o encapsulates awọn IP awọn apo-iwe ti awọn agbekọja nẹtiwọki inu awọn IP awọn apo-iwe ti awọn data aarin. Nigbati o ba n sopọ si ipade akọkọ, itumọ adirẹsi nẹtiwọki n ṣiṣẹ Itumọ Adirẹsi Nẹtiwọọki (NAT) ni alaye lati tumọ adiresi IP ati ibudo ti ipade Kubernetes si adiresi IP ati ibudo ni nẹtiwọọki apọju (ni pataki, podu pẹlu ohun elo naa). Fun awọn apo-iwe ti nwọle, ọna yiyipada ti awọn iṣe ni a ṣe. O jẹ eto eka kan pẹlu ọpọlọpọ ipinlẹ ati ọpọlọpọ awọn eroja ti o ni imudojuiwọn nigbagbogbo ati yipada bi awọn iṣẹ ti n ran ati gbigbe.

IwUlO tcpdump ninu idanwo Vegeta idaduro kan wa lakoko mimuwo TCP (laarin SYN ati SYN-ACK). Lati yọkuro idiju ti ko wulo, o le lo hping3 fun rọrun "pings" pẹlu SYN awọn apo-iwe. A ṣayẹwo ti idaduro ba wa ninu apo idahun, lẹhinna tun asopọ naa pada. A le ṣe àlẹmọ data naa lati pẹlu awọn apo-iwe ti o tobi ju 100ms nikan ati gba ọna ti o rọrun lati ṣe ẹda iṣoro naa ju idanwo nẹtiwọki Layer 7 ni kikun ni Vegeta. Eyi ni node Kubernetes "pings" ni lilo TCP SYN/SYN-ACK lori iṣẹ "ibudo node" (30927) ni awọn aaye arin 10ms, ti a ṣe iyasọtọ nipasẹ awọn idahun ti o lọra:

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

Le lẹsẹkẹsẹ ṣe akiyesi akọkọ. Ṣiṣayẹwo nipasẹ awọn nọmba ọkọọkan ati awọn akoko, o han gbangba pe iwọnyi kii ṣe awọn isunmọ akoko kan. Idaduro nigbagbogbo n ṣajọpọ ati pe a ṣe ilana nikẹhin.

Nigbamii ti, a fẹ lati wa iru awọn paati ti o le ni ipa ninu iṣẹlẹ ti isunmọ. Boya iwọnyi jẹ diẹ ninu awọn ọgọọgọrun ti awọn ofin iptables ni NAT? Tabi awọn iṣoro eyikeyi wa pẹlu tunneling IPIP lori nẹtiwọọki? Ọna kan lati ṣe idanwo eyi ni lati ṣe idanwo igbesẹ kọọkan ti eto naa nipa imukuro rẹ. Kini yoo ṣẹlẹ ti o ba yọ NAT kuro ati ọgbọn ogiriina, nlọ nikan apakan IPIP:

N ṣatunṣe aṣiṣe nẹtiwọki ni Kubernetes

O da, Lainos jẹ ki o rọrun lati wọle si Layer apọju IP taara ti ẹrọ ba wa lori nẹtiwọọki kanna:

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

Idajọ nipasẹ awọn abajade, iṣoro naa tun wa! Eyi yọkuro iptables ati NAT. Nitorina iṣoro naa jẹ TCP? Jẹ ki a wo bii ping ICMP deede kan ṣe lọ:

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

Awọn abajade fihan pe iṣoro naa ko ti lọ. Boya eyi jẹ oju eefin IPIP kan? Jẹ ki a jẹ ki idanwo naa rọrun siwaju:

N ṣatunṣe aṣiṣe nẹtiwọki ni Kubernetes

Ti wa ni gbogbo awọn apo-iwe rán laarin awọn meji ogun?

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

A ti sọ ipo naa di irọrun si awọn apa Kubernetes meji ti n firanṣẹ eyikeyi apo-iwe kọọkan miiran, paapaa pingi ICMP kan. Wọn tun rii lairi ti agbalejo ibi-afẹde ba jẹ “buburu” (diẹ ninu buru ju awọn miiran lọ).

Bayi ibeere ti o kẹhin: kilode ti idaduro nikan waye lori awọn olupin kube-node? Ati pe o n ṣẹlẹ nigbati kube-node jẹ olufiranṣẹ tabi olugba? Ni Oriire, eyi tun rọrun pupọ lati ṣawari nipa fifiranṣẹ soso kan lati ọdọ agbalejo kan ni ita Kubernetes, ṣugbọn pẹlu olugba “buburu ti a mọ” kanna. Bi o ti le rii, iṣoro naa ko ti parẹ:

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

A yoo ṣiṣẹ awọn ibeere kanna lati orisun kube-node ti tẹlẹ si agbalejo ita (eyiti o yọkuro agbalejo orisun niwon ping pẹlu mejeeji RX ati paati 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

Nipa ṣiṣayẹwo awọn iyaworan idii pakẹti, a gba diẹ ninu alaye afikun. Ni pataki, pe olufiranṣẹ (isalẹ) rii akoko asiko yii, ṣugbọn olugba (oke) ko - wo iwe Delta (ni iṣẹju-aaya):

N ṣatunṣe aṣiṣe nẹtiwọki ni Kubernetes

Ni afikun, ti o ba wo iyatọ ninu aṣẹ ti awọn apo-iwe TCP ati ICMP (nipasẹ awọn nọmba ọkọọkan) ni ẹgbẹ olugba, awọn apo-iwe ICMP nigbagbogbo de ni ọna kanna ninu eyiti wọn firanṣẹ, ṣugbọn pẹlu akoko oriṣiriṣi. Ni akoko kanna, awọn apo-iwe TCP nigbakan laarin wọn, ati diẹ ninu wọn di. Ni pato, ti o ba ṣayẹwo awọn ebute oko oju omi ti awọn apo-iwe SYN, wọn wa ni aṣẹ ni ẹgbẹ olufiranṣẹ, ṣugbọn kii ṣe ni ẹgbẹ olugba.

Iyatọ arekereke kan wa ninu bii nẹtiwọki awọn kaadi awọn olupin ode oni (bii awọn ti o wa ni ile-iṣẹ data wa) awọn idii ilana ti o ni TCP tabi ICMP ninu. Nigbati soso kan ba de, ohun ti nmu badọgba nẹtiwọọki “hashes o fun asopọ”, iyẹn ni, o gbiyanju lati fọ awọn asopọ sinu awọn ila ati firanṣẹ isinyi kọọkan si ipilẹ ero isise lọtọ. Fun TCP, hash yii pẹlu mejeeji orisun ati adiresi IP opin irin ajo ati ibudo. Ni awọn ọrọ miiran, asopọ kọọkan jẹ hashed (o pọju) yatọ. Fun ICMP, awọn adiresi IP nikan ti wa ni hashed, niwon ko si awọn ebute oko oju omi.

Akiyesi tuntun miiran: lakoko yii a rii awọn idaduro ICMP lori gbogbo awọn ibaraẹnisọrọ laarin awọn agbalejo meji, ṣugbọn TCP kii ṣe. Eyi sọ fun wa pe o ṣee ṣe idi ti o ni ibatan si hashing ti isinyi RX: idinaduro fẹrẹẹ dajudaju ninu sisẹ awọn apo-iwe RX, kii ṣe ni fifiranṣẹ awọn idahun.

Eyi yọkuro awọn apo-iwe fifiranṣẹ lati atokọ ti awọn idi ti o ṣeeṣe. A mọ nisisiyi pe iṣoro ṣiṣatunṣe apo-iwe wa ni ẹgbẹ gbigba lori diẹ ninu awọn olupin kube-node.

Ni oye sisẹ soso ninu ekuro Linux

Lati loye idi ti iṣoro naa fi waye ni olugba lori diẹ ninu awọn olupin kube-node, jẹ ki a wo bii ekuro Linux ṣe ilana awọn apo-iwe.

Pada si imuse ibile ti o rọrun julọ, kaadi nẹtiwọọki gba apo ati firanṣẹ da gbigbi ekuro Linux pe package kan wa ti o nilo lati ni ilọsiwaju. Ekuro da iṣẹ miiran duro, yi ọrọ-ọrọ pada si oluṣakoso idalọwọduro, ṣe ilana idii naa, lẹhinna pada si awọn iṣẹ ṣiṣe lọwọlọwọ.

N ṣatunṣe aṣiṣe nẹtiwọki ni Kubernetes

Yiyipada ọrọ-ọrọ yii lọra: lairi le ma jẹ akiyesi lori awọn kaadi nẹtiwọọki 10Mbps ni awọn ọdun 90, ṣugbọn lori awọn kaadi 10G ode oni pẹlu iwọn ti o pọju ti awọn apo-iwe miliọnu 15 fun iṣẹju kan, ipilẹ kọọkan ti olupin kekere mẹjọ-mojuto le ni idilọwọ awọn miliọnu. ti igba fun keji.

Ni ibere ki o maṣe mu awọn idilọwọ nigbagbogbo, ni ọpọlọpọ ọdun sẹyin Lainos ṣafikun NAPI: API Nẹtiwọọki ti gbogbo awọn awakọ ode oni lo lati mu ilọsiwaju ṣiṣẹ ni awọn iyara giga. Ni awọn iyara kekere ekuro tun gba awọn idilọwọ lati kaadi nẹtiwọki ni ọna atijọ. Ni kete ti awọn apo-iwe ti o to ti de ti o kọja iloro, ekuro naa ṣe idiwọ awọn idilọwọ ati dipo bẹrẹ idibo ohun ti nmu badọgba nẹtiwọọki ati gbigba awọn apo-iwe ni awọn ṣoki. Ṣiṣẹ ṣiṣe ni softirq, iyẹn ni, ni o tọ ti software interrupts lẹhin awọn ipe eto ati awọn idilọwọ ohun elo, nigbati ekuro (ni idakeji si aaye olumulo) ti nṣiṣẹ tẹlẹ.

N ṣatunṣe aṣiṣe nẹtiwọki ni Kubernetes

Eleyi jẹ Elo yiyara, ṣugbọn nfa kan ti o yatọ isoro. Ti awọn apo-iwe ti o pọ ju, lẹhinna gbogbo akoko lo awọn apo-iṣelọpọ lati kaadi nẹtiwọọki, ati awọn ilana aaye olumulo ko ni akoko lati sọ di ofo awọn ila wọnyi (kika lati awọn asopọ TCP, bbl). Ni ipari awọn ila kun ati pe a bẹrẹ sisọ awọn apo-iwe silẹ. Ninu igbiyanju lati wa iwọntunwọnsi, ekuro ṣeto isuna kan fun nọmba ti o pọju ti awọn apo-iwe ti a ṣe ilana ni ipo softirq. Ni kete ti isuna yii ba ti kọja, okun ti o ya sọtọ yoo ji ksoftirqd (o yoo ri ọkan ninu wọn ni ps fun mojuto) ti o kapa awọn wọnyi softirqs ita ti deede syscall / idalọwọduro ona. O tẹle ara yii jẹ eto nipa lilo oluṣeto ilana boṣewa, eyiti o gbiyanju lati pin awọn orisun ni deede.

N ṣatunṣe aṣiṣe nẹtiwọki ni Kubernetes

Lehin ti o ṣe iwadi bii ekuro ṣe n ṣe ilana awọn apo-iwe, o le rii pe o ṣeeṣe kan ti isunmọ. Ti awọn ipe softirq ba gba diẹ sii loorekoore, awọn apo-iwe yoo ni lati duro fun igba diẹ lati ṣe ilana ni isinyi RX lori kaadi nẹtiwọọki. Eyi le jẹ nitori diẹ ninu iṣẹ-ṣiṣe dina mojuto ero isise, tabi ohun miiran n ṣe idiwọ mojuto lati ṣiṣẹ softirq.

Din awọn processing si isalẹ lati awọn mojuto tabi ọna

Awọn idaduro Softirq jẹ amoro kan fun bayi. Ṣugbọn o jẹ oye, ati pe a mọ pe a n rii nkan ti o jọra pupọ. Nitorina igbesẹ ti o tẹle ni lati jẹrisi imọran yii. Ati pe ti o ba jẹ idaniloju, lẹhinna wa idi fun awọn idaduro.

Jẹ ki a pada si awọn apo kekere wa:

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

Gẹgẹbi a ti sọ tẹlẹ, awọn apo-iwe ICMP wọnyi ti wa ni hashed sinu isinyi RX NIC kan ati ṣiṣe nipasẹ mojuto Sipiyu kan. Ti a ba fẹ lati ni oye bi Linux ṣe n ṣiṣẹ, o wulo lati mọ ibiti (eyiti mojuto Sipiyu) ati bii (softirq, ksoftirqd) ṣe ilana awọn idii wọnyi lati le tọpa ilana naa.

Bayi o to akoko lati lo awọn irinṣẹ ti o gba ọ laaye lati ṣe atẹle ekuro Linux ni akoko gidi. Nibi ti a lo Bcc. Eto irinṣẹ yii ngbanilaaye lati kọ awọn eto C kekere ti o kọ awọn iṣẹ lainidii ninu ekuro ati da awọn iṣẹlẹ sinu eto Python aaye olumulo ti o le ṣe ilana wọn ati da abajade pada si ọ. Hooking awọn iṣẹ lainidii ninu ekuro jẹ iṣowo ẹtan, ṣugbọn ohun elo jẹ apẹrẹ fun aabo to pọ julọ ati pe a ṣe apẹrẹ lati tọpa mọlẹ deede iru awọn ọran iṣelọpọ ti ko ni irọrun tun ṣe ni idanwo tabi agbegbe idagbasoke.

Eto nibi rọrun: a mọ pe ekuro ṣe ilana awọn pings ICMP wọnyi, nitorinaa a yoo fi kio kan si iṣẹ ekuro icmp_echo, eyiti o gba apo-iwe ibeere iwoyi ICMP ti nwọle ti o si bẹrẹ fifiranṣẹ esi iwoyi ICMP kan. A le ṣe idanimọ idii kan nipa jijẹ nọmba icmp_seq, eyiti o fihan hping3 ga.

Koodu bcc akosile wulẹ idiju, sugbon o jẹ ko bi idẹruba bi o dabi. Išẹ icmp_echo awọn gbigbe struct sk_buff *skb: Eyi jẹ apo-iwe kan pẹlu “ibeere iwoyi”. A le tọpa rẹ, fa jade ọkọọkan echo.sequence (eyi ti o ṣe afiwe pẹlu icmp_seq nipa hping3 выше), ati firanṣẹ si aaye olumulo. O tun rọrun lati mu orukọ/id ilana lọwọlọwọ. Ni isalẹ wa awọn abajade ti a rii taara lakoko awọn idii ilana kernel:

TGID PID Ilana ORUKO ICMP_SEQ
0 0 swapper / 11
770 0 swapper / 0
11 771 swapper / 0
0 11 swapper / 772
0 0 swapper / 11
Ọdun 773 Ọdun 0 Ọdun 0
11 774 swapper / 20041
20086 775 swapper / 0
0 11 swapper / 776
0 0 spokes-iroyin-s 11

O yẹ ki o ṣe akiyesi nibi pe ni ọrọ-ọrọ softirq awọn ilana ti o ṣe awọn ipe eto yoo han bi “awọn ilana” nigbati ni otitọ o jẹ ekuro ti o ṣe ilana awọn apo-iwe lailewu ni aaye ti ekuro.

Pẹlu ọpa yii a le ṣepọ awọn ilana kan pato pẹlu awọn idii kan pato ti o ṣe afihan idaduro ti hping3. Jẹ ki a jẹ ki o rọrun grep lori yi Yaworan fun awọn iye icmp_seq. Awọn apo-iwe ti o baamu awọn iye icmp_seq ti o wa loke ni a ṣe afihan pẹlu RTT wọn ti a ṣe akiyesi loke (ninu akomo ni awọn iye RTT ti a nireti fun awọn apo-iwe ti a ṣe iyọkuro nitori awọn iye RTT ti o kere ju 50ms):

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

Awọn abajade sọ fun wa ọpọlọpọ awọn nkan. Ni akọkọ, gbogbo awọn idii wọnyi ni a ṣe ilana nipasẹ ọrọ-ọrọ ksoftirqd/11. Eyi tumọ si pe fun awọn ẹrọ meji pato, awọn apo-iwe ICMP ni a hashed si mojuto 11 ni ipari gbigba. A tun rii pe nigbakugba ti jam ba wa, awọn apo-iwe wa ti a ṣe ilana ni agbegbe ti ipe eto naa cadvisor... Lẹhinna ksoftirqd gba lori awọn iṣẹ-ṣiṣe ati ki o lakọkọ awọn akojo isinyi: gangan awọn nọmba ti awọn apo-iwe ti o ti akojo lẹhin cadvisor.

Otitọ pe lẹsẹkẹsẹ ṣaaju ki o to ṣiṣẹ nigbagbogbo cadvisor, tumọ si ilowosi rẹ ninu iṣoro naa. Ironically, idi cadvisor - “ṣe itupalẹ lilo awọn orisun ati awọn abuda iṣẹ ṣiṣe ti awọn apoti ṣiṣiṣẹ” kuku ki o fa ọran iṣẹ ṣiṣe yii.

Gẹgẹbi pẹlu awọn ẹya miiran ti awọn apoti, iwọnyi jẹ gbogbo awọn irinṣẹ ilọsiwaju giga ati pe a le nireti lati ni iriri awọn ọran iṣẹ labẹ diẹ ninu awọn ipo airotẹlẹ.

Kini cadvisor ṣe ti o fa fifalẹ isinyi soso?

A ni oye ti o dara pupọ ti bii jamba naa ṣe waye, ilana wo ni o nfa, ati lori eyiti Sipiyu. A rii pe nitori idinamọ lile, ekuro Linux ko ni akoko lati ṣeto ksoftirqd. Ati pe a rii pe awọn apo-iwe ti ni ilọsiwaju ni ipo cadvisor. O jẹ ohun ọgbọn lati ro pe cadvisor ṣe ifilọlẹ syscall o lọra, lẹhin eyiti gbogbo awọn apo-iwe ti o ṣajọpọ ni akoko yẹn ti ni ilọsiwaju:

N ṣatunṣe aṣiṣe nẹtiwọki ni Kubernetes

Eyi jẹ ẹkọ, ṣugbọn bawo ni lati ṣe idanwo rẹ? Ohun ti a le se ni a kakiri Sipiyu mojuto jakejado yi ilana, ri awọn ojuami ibi ti awọn nọmba ti awọn apo-iwe lọ lori isuna ati ksoftirqd ni a npe ni, ati ki o si wo kekere kan siwaju pada lati ri ohun ti gangan nṣiṣẹ lori Sipiyu mojuto kan ki o to ti ojuami. . O dabi x-raying Sipiyu ni gbogbo awọn milliseconds diẹ. Yoo dabi iru eyi:

N ṣatunṣe aṣiṣe nẹtiwọki ni Kubernetes

Ni irọrun, gbogbo eyi le ṣee ṣe pẹlu awọn irinṣẹ to wa tẹlẹ. Fun apere, perf igbasilẹ sọwedowo mojuto Sipiyu ti a fun ni igbohunsafẹfẹ pàtó kan ati pe o le ṣe agbekalẹ iṣeto awọn ipe si eto ṣiṣe, pẹlu aaye olumulo mejeeji ati ekuro Linux. O le gba igbasilẹ yii ki o ṣe ilana rẹ nipa lilo orita kekere ti eto naa FlameGraph lati Brendan Gregg, eyi ti o se itoju awọn ibere ti awọn kakiri akopọ. A le ṣafipamọ awọn itọpa akopọ laini ẹyọkan ni gbogbo 1 ms, lẹhinna ṣe afihan ati ṣafipamọ apẹẹrẹ kan 100 milliseconds ṣaaju ki itọpa naa deba 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

Eyi ni awọn abajade:

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

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

Awọn nkan pupọ lo wa nibi, ṣugbọn ohun akọkọ ni pe a rii apẹrẹ “cadvisor ṣaaju ksoftirqd” ti a rii tẹlẹ ninu olutọpa ICMP. Kini o je?

Laini kọọkan jẹ itọpa Sipiyu ni aaye kan pato ni akoko. Ipe kọọkan ti o wa ni isalẹ akopọ lori laini jẹ ipin nipasẹ semicolon kan. Ni aarin awọn ila a rii syscall ti a pe: read(): .... ;do_syscall_64;sys_read; .... Nitorinaa cadvisor lo akoko pupọ lori ipe eto naa read()jẹmọ si awọn iṣẹ mem_cgroup_* (oke ti akopọ ipe / opin ila).

Ko ṣe aibalẹ lati rii ninu itọpa ipe kini gangan ti n ka, nitorinaa jẹ ki a ṣiṣẹ strace ati pe jẹ ki a wo kini cadvisor ṣe ati rii awọn ipe eto to gun ju 100ms:

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>

Bi o ṣe le nireti, a rii awọn ipe ti o lọra nibi read(). Lati awọn akoonu ti kika mosi ati o tọ mem_cgroup o han gbangba pe awọn italaya wọnyi read() tọka si faili naa memory.stat, eyiti o ṣe afihan lilo iranti ati awọn opin akojọpọ ẹgbẹ (imọ-ẹrọ ipinya orisun Docker). Ohun elo cadvisor naa beere faili yii lati gba alaye lilo orisun fun awọn apoti. Jẹ ki a ṣayẹwo boya ekuro tabi cadvisor n ṣe nkan airotẹlẹ:

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

Bayi a le ṣe ẹda kokoro naa ki o loye pe ekuro Linux n dojukọ ẹya-ara kan.

Kini idi ti iṣẹ kika jẹ o lọra?

Ni ipele yii, o rọrun pupọ lati wa awọn ifiranṣẹ lati ọdọ awọn olumulo miiran nipa awọn iṣoro ti o jọra. Bi o ti wa ni jade, ninu olutọpa cadvisor kokoro yii ni a royin bi isoro ti nmu Sipiyu lilo, o kan jẹ pe ko si ẹnikan ti o ṣe akiyesi pe lairi tun jẹ afihan laileto ninu akopọ nẹtiwọọki. O ti ṣe akiyesi nitootọ pe cadvisor n gba akoko Sipiyu diẹ sii ju ti a ti ṣe yẹ lọ, ṣugbọn eyi ko fun ni pataki pupọ, nitori awọn olupin wa ni ọpọlọpọ awọn orisun Sipiyu, nitorinaa iṣoro naa ko ṣe iwadi ni pẹkipẹki.

Iṣoro naa ni pe awọn ẹgbẹ ṣe akiyesi lilo iranti laarin aaye orukọ (eiyan). Nigbati gbogbo awọn ilana ni ijade akojọpọ ẹgbẹ yii, Docker tu ẹgbẹ iranti silẹ. Sibẹsibẹ, "iranti" kii ṣe iranti ilana nikan. Botilẹjẹpe iranti ilana funrararẹ ko lo mọ, o han pe ekuro naa tun ṣe ipinnu awọn akoonu ti a fipamọ, gẹgẹbi awọn ehin ati awọn inodes (ilana ati metadata faili), eyiti o wa ni ipamọ ninu ẹgbẹ iranti. Lati apejuwe iṣoro naa:

Awọn akojọpọ Zombie: awọn ẹgbẹ ti ko ni awọn ilana ati ti paarẹ, ṣugbọn tun ti pin iranti (ninu ọran mi, lati kaṣe ehin, ṣugbọn o tun le pin lati kaṣe oju-iwe tabi tmpfs).

Ṣiṣayẹwo ekuro ti gbogbo awọn oju-iwe ti o wa ninu kaṣe nigbati idasilẹ ẹgbẹ kan le lọra pupọ, nitorinaa a yan ilana ọlẹ: duro titi ti awọn oju-iwe wọnyi yoo tun beere lẹẹkansi, ati lẹhinna nikẹhin ko ẹgbẹ kuro nigbati iranti nilo gangan. Titi di aaye yii, a tun gba akojọpọ sinu akọọlẹ nigba gbigba awọn iṣiro.

Lati oju-iwoye iṣẹ, wọn rubọ iranti fun iṣẹ ṣiṣe: yiyara isọdọmọ ibẹrẹ nipa fifi diẹ ninu iranti iranti sile. Eyi dara. Nigbati ekuro ba lo igbẹhin ti iranti ipamọ, ẹgbẹ naa yoo yọkuro nikẹhin, nitorinaa ko le pe ni “jo”. Laanu, imuse kan pato ti ẹrọ wiwa memory.stat ninu ẹya ekuro yii (4.9), ni idapo pẹlu iye nla ti iranti lori awọn olupin wa, tumọ si pe o gba to gun pupọ lati mu pada data cache tuntun ati awọn Ebora akojọpọ ẹgbẹ kuro.

O wa ni jade wipe diẹ ninu awọn ti wa apa ní ki ọpọlọpọ awọn akojọpọ awọn Ebora ti awọn kika ati lairi koja iseju kan.

Iṣeduro fun ọran cadvisor ni lati lẹsẹkẹsẹ awọn kaṣe denries / inodes ọfẹ jakejado eto naa, eyiti o yọkuro lairi kika bi daradara bi airi nẹtiwọọki lori agbalejo naa, niwọn igba ti imukuro kaṣe naa tan awọn oju-iwe Ebora cgroup ti o fipamọ ati tu wọn silẹ paapaa. Eyi kii ṣe ojutu kan, ṣugbọn o jẹrisi idi ti iṣoro naa.

O wa jade pe ni awọn ẹya tuntun kernel (4.19+) iṣẹ ipe ti ni ilọsiwaju memory.stat, nitorina iyipada si ekuro yii ṣe atunṣe iṣoro naa. Ni akoko kanna, a ni awọn irinṣẹ lati ṣe awari awọn apa iṣoro ni awọn iṣupọ Kubernetes, fi oore-ọfẹ yọ wọn kuro ki o tun bẹrẹ wọn. A combed gbogbo awọn iṣupọ, ri apa pẹlu ga to lairi ati atunbere wọn. Eyi fun wa ni akoko lati ṣe imudojuiwọn OS lori awọn olupin to ku.

Summing soke

Nitoripe kokoro yii duro sisẹ ti isinyi RX NIC fun awọn ọgọọgọrun milliseconds, nigbakanna o fa lairi giga mejeeji lori awọn asopọ kukuru ati airi asopọ aarin, gẹgẹbi laarin awọn ibeere MySQL ati awọn apo-iwe idahun.

Imọye ati mimu iṣẹ ṣiṣe ti awọn eto ipilẹ julọ, gẹgẹbi Kubernetes, ṣe pataki si igbẹkẹle ati iyara ti gbogbo awọn iṣẹ ti o da lori wọn. Gbogbo eto ti o ṣiṣẹ awọn anfani lati awọn ilọsiwaju iṣẹ ṣiṣe Kubernetes.

orisun: www.habr.com

Fi ọrọìwòye kun