Et WireGuard-håndtryk fuldføres stadig, peer viser stadig et nyt endpoint, og alligevel hænger en ny SSH-session gennem relæet bag det uden banner. Den kombination peger væk fra tunnelen og mod den proces, der accepterer socketten. Et relæ som socat sidder i applikationens vej med sit eget deskriptorbudget, sine egne børn og sine egne nedarvede grænser. Vandringen nedenfor starter ved klienten og stopper ved den første komponent, der ikke kan åbne endnu en socket.

Følg ruten, før du ændrer et tal

Følg én mislykket anmodning i stedet for at ræsonnere om tunnelen som helhed. Klienten skriver ind i tunnelen, VPN-dæmonen dekrypterer og ruter, og relæet accepterer på den anden side. Hvert trin forbruger deskriptorer, og det, der normalt løber tør, er det sidste.

Start med en anmodning, du kan genskabe, og mål tiden på den. Hvis TCP-håndtrykket fuldføres, men der ikke kommer et applikationsbanner, tog relæet socketten og satte sig derefter fast i et barn eller på sit upstream-ben. Hvis selve håndtrykket aldrig fuldføres, er årsagen routing, firewall eller lyttertilstand, ikke et deskriptorloft. Noter hvilken af de to former du så, fordi de peger på forskellige processer.

Tæl også de hop, der duplikerer arbejde. En forgrenende lytter giver hver accepteret socket til et barn, der beholder sin egen kopi, så det reelle total er en egenskab ved hele træet, ikke kun ved forælderen.

Læs den grænse, relæet arvede

Den eneste grænse, der betyder noget, tilhører den kørende proces, og den blev fastsat af det, der startede processen. At skrive ulimit -n i en shell beskriver shellen. Spørg service-manageren, hvad den anvendte, og bekræft derefter på PID’en.

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

Filen limits udskriver det bløde og det hårde loft, som processen ser dem. En lav blød værdi under et rundhåndet hårdt loft betyder, at dæmonen må hæve sit eget loft, og nogle gør det ved opstart; lige lave værdier betyder, at unit-filen er kilden.

Drop-in-filer indlæses i leksikalsk rækkefølge, og senere filer vinder, så systemctl cat vpn-relay.service er den autoritative visning af, hvad der gælder. At redigere en fil, som manageren aldrig læser, er den mest almindelige grund til, at et hævet tal ikke har nogen virkning.

Adskil stabil samtidighed fra fastholdt tilstand

To processer kan ramme det samme loft af uafhængige grunde, og rådene er forskellige. Efterspørgsel, der følger nyttige samtidige sessioner, er et kapacitetsspørgsmål. Vækst, der fortsætter, efter arbejdet er slut, er en lækage eller et sæt sessioner, som ingen lukkede.

Mål ved tomgang, ved din normale top og igen et par minutter efter, at belastningen er stoppet. At tælle åbne poster med ls /proc/PID/fd | wc -l mod den bløde grænse fortæller dig gabet, og et tal en eller to under loftet er et hårdt stop snarere end en langsom vej.

Når tallet nægter at falde, så se på socket-tilstande i stedet for totaler. Deskriptorer, der sidder i CLOSE_WAIT, betyder, at peer lukkede, og din side gjorde det aldrig, hvilket er en defekt i applikationens livscyklus, som en større grænse kun udskyder. Begræns også børnemodellen: et forgrenende relæ uden loft over samtidige børn udtømmer deskriptorer, processlots og hukommelse på én gang.

Kontrollér den nye værdi på den levende proces

Når du har redigeret unit-filen, skal du genindlæse manageren og genstarte tjenesten, fordi en genindlæsning alene aldrig erstatter grænser, som en kørende proces allerede har arvet. Kontrollér på den proces, der faktisk betjener trafikken.

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

Linjen awk returnerer det nye par; hvis den stadig viser det gamle, er den drop-in, du redigerede, ikke den, der indlæses. Tallet fra ss er din belastningskontrol, så åbn det antal sessioner, du forventer, og se det stige. Et tal, der fortsætter med at stige, efter at disse sessioner lukkes, betyder, at grænsen aldrig var hele problemet.

Én advarsel hører med til enhver stor forhøjelse. Applikationer, der poller med select(), kan ikke overvåge deskriptorer over FD_SETSIZE, som er 1024 på typiske builds, så et loft hævet derover kan give fejl, der ser uvedkommende ud. systemd-eksekveringsreferencen bærer den samme advarsel for de tjenester, den starter.

Hold genstarten væk fra tunnelens tilgængelighed

Genstart af relæet dropper dets aktive sessioner, og det er en separat begivenhed fra VPN’ens nedbrud. Planlæg ændringen, så tunnelen bliver oppe, mens relæet cykler, og advar enhver, hvis langvarige session krydser det.

Tilbagerulning er den forrige unit-fil plus endnu en genstart, og den fil bliver på plads, indtil den nye værdi har overlevet en arbejdsdag. Luk derefter sløjfen med den anmodning, der oprindeligt fejlede: en ny SSH-session gennem relæet, en overførsel lang nok til at betyde noget, og et deskriptortal, der vender tilbage til sit tomgangsniveau.

Relaterede artikler