In WireGuard-handshake foltôget noch, de peer toant noch in resint einpunt, en dochs hinget in nije SSH-sesje fia de relay derachter sûnder banner. Dy kombinaasje wiist fuort fan de tunnel en nei it proses dat de socket oannimt. In relay lykas socat sit yn it paad fan de applikaasje mei syn eigen deskriptorbudget, syn eigen bern en syn eigen erfde limiten. De kuier hjirûnder begjint by de klant en stopet by it earste ûnderdiel dat gjin oare socket iepenje kin.

Folgje it paad foardat jo in nûmer feroarje

Folgje ien mislearre fersyk ynstee fan oer de tunnel as gehiel te redenearjen. De klant skriuwt yn de tunnel, de VPN-daemon ûntsiferet en rûtelet, en de relay nimt oan de oare kant oan. Eltse stap ferbrûkt deskriptors, en dy’t meastentiids op is, is de lêste.

Begjin mei in fersyk dat jo reprodusearje kinne en mjitsje de tiid. As de TCP-handshake foltôget mar der komt gjin applikaasjebanner, hat de relay de socket nommen en is doe yn in bern of op syn upstream-skonk fêst kommen te sitten. As de handshake sels nea foltôget, is de oarsaak rûtelearring, firewall of listenersteat, net in deskriptorplafond. Skriuw op hokker fan de twa foarmen jo seagen, want se wize nei ferskillende prosessen.

Tel ek de sprongen dy’t wurk dûbeleartsje. In forkende listener jout elke oannommen socket oan in bern dat syn eigen kopy hâldt, dus it echte totaal is in eigenskip fan de hiele beam, net fan de âlder allinnich.

Lês de limyt dy’t de relay erfd hat

De iennichste limyt dy’t telt heart by it rinnende proses, en dy is fêststeld troch wat dat proses starte. ulimit -n yn in shell typje beskriuwt de shell. Freegje de tsjinstbehearder wat dy tapast hat, en befêstigje dan op de PID.

systemctl show -p MainPID -p LimitNOFILE vpn-relay.service
cat /proc/$(systemctl show -p MainPID --value vpn-relay.service)/limits

It bestân limits printsje it sêfte en hurde plafond sa’t it proses se sjocht. In lege sêfte wearde ûnder in romme hurde wearde betsjut dat de daemon syn eigen plafond ferheegje mei, en guon dogge dat by it starten; gelyk lege wearden betsjutte dat it unit-bestân de boarne is.

Drop-ins lade yn leksikale folchoarder en lettere bestannen winne, dus systemctl cat vpn-relay.service is it gesachhawwende byld fan wat jildt. It bewurkjen fan in bestân dat de behearder nea lêst is de meast foarkommende reden dat in ferhege nûmer gjin effekt hat.

Skied stabile gelyktiidichheid fan behâlde steat

Twa prosessen kinne itselde plafond reitsje om ûnferbûne redenen, en de remedies ferskille. Fraach dy’t nuttige gelyktiidige sessys folget is in kapasiteitskwestje. Groei dy’t trochgiet nei’t it wurk dien is, is in lek of in set sessys dy’t nimmen sletten hat.

Mjit yn rêst, op jo normale pyk, en wer in pear minuten nei’t de lading stoppe is. Iepenje yngongen telle mei ls /proc/PID/fd | wc -l tsjin de sêfte limyt fertelt jo de kleau, en in telling ien of twa ûnder it plafond is in hurde stop, net in stadich paad.

As de telling wegeret te sakjen, sjoch dan nei socketsteaten ynstee fan totalen. Deskriptors yn CLOSE_WAIT betsjutte dat de peer sletten hat en jo kant nea, wat in defekt yn de libbenssyklus fan de applikaasje is dat in gruttere limyt allinnich útstelt. Behein it bernemodel ek: in forkende relay sûnder kapproasje foar gelyktiidige bern put deskriptors, prosesplakken en ûnthâld tagelyk út.

Kontrolearje de nije wearde op it libbene proses

Nei it bewurkjen fan de unit, werlade de behearder en start de tsjinst opnij, want in werlading allinnich ferfangt nea limiten dy’t in rinnend proses al erfd hat. Ferifiearje op it proses dat feitlik ferkear tsjinnet.

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

De rigel awk jout it nije pear werom; as it noch it âlde toant, is de drop-in dy’t jo bewurke hawwe net dy’t laden wurdt. De telling fan ss is jo ladingkontrôle, dus iepenje it oantal sessys dat jo ferwachtsje en sjoch it klimmen. In telling dy’t trochgiet mei klimmen nei’t dy sessys sluten binne, betsjut dat de limyt nea it hiele probleem wie.

Ien foarbehâld heart by elke grutte ferheging. Applikaasjes dy’t mei select() pollje kinne gjin deskriptors boppe FD_SETSIZE besjen, dat is 1024 by typyske builds, dus in plafond dat dêroer ferhege is kin flaters jaan dy’t ûnferbûn lykje. De systemd-útfieringsreferinsje draacht deselde warskôging foar tsjinsten dy’t it start.

Hâld de werstart fuort fan tunnelbeskikberens

It werstarten fan de relay lit syn aktive sessys falle, en dat is in apart barren fan it delgean fan de VPN. Oarderje de feroaring sa dat de tunnel oerein bliuwt wylst de relay syklust, en warskôgje elkenien waans lange sessy it krúst.

Weromdraaie is it foarige unit-bestân plus noch in werstart, en dat bestân bliuwt op syn plak oant de nije wearde in wurkdei oerlibbe hat. Slút dan de lus mei it fersyk dat oarspronklik mislearre: ien nije SSH-sesje fia de relay, ien oerdracht lang genôch om ta te dwaan, en in deskriptortelling dy’t weromkomt nei syn rêstnivo.

Relatearre artikelen