Posrednik VPN preneha sprejemati SSH: omejitve datotečnih deskriptorjev
Promet skozi tunel še naprej teče, medtem ko posrednik socat za njim zavrača nove seje. Sledite poti in nato preberite podedovano omejitev na živem PID.
Rokovanje WireGuard se še vedno dokonča, peer še vedno kaže nedavno končno točko, in vendar nova seja SSH skozi posrednik za njim visi brez pasice. Ta kombinacija kaže stran od tunela in proti procesu, ki sprejme vtičnico. Posrednik, kot je socat, sedi na poti aplikacije z lastnim proračunom deskriptorjev, lastnimi otroki in lastnimi podedovanimi omejitvami. Spodnji sprehod se začne pri odjemalcu in ustavi pri prvi komponenti, ki ne more odpreti druge vtičnice.
Sledite poti, preden spremenite število
Sledite eni neuspešni zahtevi, namesto da bi razmišljali o tunelu kot celoti. Odjemalec piše v tunel, daemon VPN dešifrira in usmerja, posrednik pa sprejme na drugi strani. Vsak korak porabi deskriptorje, in tisti, ki običajno zmanjka, je zadnji.
Začnite z zahtevo, ki jo lahko ponovite, in izmerite njen čas. Če se rokovanje TCP dokonča, a pasica aplikacije ne pride, je posrednik prevzel vtičnico in se nato zataknil v otroku ali na svoji navzgor usmerjeni nogi. Če se samo rokovanje nikoli ne dokonča, je vzrok usmerjanje, požarni zid ali stanje poslušalca, ne strop deskriptorjev. Zapišite, katero od dveh oblik ste opazili, ker kažeta na različne procese.
Preštejte tudi skoke, ki podvajajo delo. Razvejani poslušalec vsako sprejeto vtičnico izroči otroku, ki hrani svojo kopijo, zato je resnična vsota lastnost celotnega drevesa, ne le starša.
Preberite omejitev, ki jo je posrednik podedoval
Edina omejitev, ki šteje, pripada tekočemu procesu, in določilo jo je to, kar je ta proces zagnalo. Vtipkanje ulimit -n v lupini opisuje lupino. Vprašajte upravitelja storitev, kaj je uporabil, nato potrdite na PID.
systemctl show -p MainPID -p LimitNOFILE vpn-relay.service
cat /proc/$(systemctl show -p MainPID --value vpn-relay.service)/limits
Datoteka limits izpiše mehki in trdi strop, kot ju vidi proces. Nizka mehka vrednost pod velikodušnim trdim stropom pomeni, da sme daemon dvigniti svoj strop, in nekateri to storijo ob zagonu; enake nizke vrednosti pomenijo, da je vir datoteka unit.
Drop-in datoteke se nalagajo v leksikografskem vrstnem redu in poznejše datoteke zmagajo, zato je systemctl cat vpn-relay.service verodostojni pogled na to, kaj velja. Urejanje datoteke, ki je upravitelj nikoli ne prebere, je najpogostejši razlog, da dvignjeno število nima učinka.
Ločite stabilno sočasnost od zadržanega stanja
Dva procesa lahko zadeneta isti strop iz nepovezanih razlogov, in zdravila se razlikujejo. Povpraševanje, ki sledi koristnim sočasnim sejam, je vprašanje zmogljivosti. Rast, ki se nadaljuje po koncu dela, je uhajanje ali niz sej, ki jih nihče ni zaprl.
Merite v mirovanju, na običajnem vrhu in znova nekaj minut po ustavitvi obremenitve. Štetje odprtih vnosov z ls /proc/PID/fd | wc -l proti mehki omejitvi vam pove razliko, in število ena ali dve pod stropom je trda ustavitev, ne počasna pot.
Ko se število noče znižati, glejte stanja vtičnic, ne vsot. Deskriptorji, ki sedijo v CLOSE_WAIT, pomenijo, da je peer zaprl, vaša stran pa nikoli, kar je napaka v življenjskem ciklu aplikacije, ki jo večja omejitev le odloži. Omejite tudi model otrok: razvejani posrednik brez omejitve sočasnih otrok izčrpa deskriptorje, procesne reže in pomnilnik hkrati.
Preverite novo vrednost na živem procesu
Po urejanju unit datoteke znova naložite upravitelja in znova zaženite storitev, saj samo ponovno nalaganje nikoli ne zamenja omejitev, ki jih je tekoči proces že podedoval. Preverite na procesu, ki dejansko streže prometu.
systemctl daemon-reload
systemctl restart vpn-relay.service
awk '/Max open files/ {print}' /proc/$(systemctl show -p MainPID --value vpn-relay.service)/limits
ss -tnp state established '( sport = :2222 )' | wc -l
Vrstica awk vrne novi par; če še vedno kaže starega, drop-in, ki ste ga uredili, ni tisti, ki se nalaga. Število ss je vaš pregled obremenitve, zato odprite pričakovano število sej in glejte, kako narašča. Število, ki še naprej narašča po zaprtju teh sej, pomeni, da omejitev nikoli ni bila celoten problem.
Vsakemu velikemu zvišanju sledi en pridržek. Aplikacije, ki anketirajo z select(), ne morejo spremljati deskriptorjev nad FD_SETSIZE, kar je pri tipičnih gradnjah 1024, zato lahko strop, dvignjen čez to, povzroči napake, ki se zdijo nepovezane. Referenca za izvajanje systemd nosi enako opozorilo za storitve, ki jih zažene.
Ponovni zagon držite stran od razpoložljivosti tunela
Ponovni zagon posrednika spusti njegove aktivne seje, in to je ločen dogodek od padca VPN. Razporedite spremembo tako, da tunel ostane pokonci, medtem ko posrednik kroži, in opozorite vsakogar, čigar dolga seja ga prečka.
Povrnitev je prejšnja datoteka unit in še en ponovni zagon, in ta datoteka ostane na mestu, dokler nova vrednost ne preživi delovnega dneva. Nato zaprite zanko z zahtevo, ki prvotno ni uspela: ena nova seja SSH skozi posrednik, en prenos, dovolj dolg, da šteje, in število deskriptorjev, ki se vrne na svojo raven mirovanja.