WireGuard rukovanje još uvijek završava, peer još uvijek pokazuje nedavnu krajnju točku, a ipak nova SSH sesija kroz relej iza njega visi bez bannera. Ta kombinacija upućuje dalje od tunela, prema procesu koji prihvaća socket. Relej poput socata stoji na putu aplikacije s vlastitim budžetom deskriptora, vlastitom djecom i vlastitim naslijeđenim ograničenjima. Šetnja ispod počinje na klijentu i zaustavlja se na prvoj komponenti koja ne može otvoriti još jedan socket.

Pratite putanju prije nego promijenite broj

Pratite jedan neuspjeli zahtjev umjesto da raspravljate o tunelu u cjelini. Klijent piše u tunel, VPN daemon dešifrira i usmjerava, a relej prihvaća na drugoj strani. Svaki korak troši deskriptore, a onaj koji obično ponestane je posljednji.

Počnite sa zahtjevom koji možete reproducirati i izmjerite njegovo vrijeme. Ako TCP rukovanje završi, ali aplikacijski banner ne stigne, relej je uzeo socket i zatim zastao u djetetu ili na svojoj upstream nozi. Ako se samo rukovanje nikad ne završi, uzrok je usmjeravanje, vatrozid ili stanje slušatelja, a ne strop deskriptora. Zabilježite koji ste od dva oblika vidjeli, jer upućuju na različite procese.

Prebrojite i skokove koji udvostručuju posao. Slušatelj koji se račva predaje svaki prihvaćeni socket djetetu koje čuva vlastitu kopiju, pa je stvarni zbroj svojstvo cijelog stabla, ne samo roditelja.

Pročitajte ograničenje koje je relej naslijedio

Jedino ograničenje koje je važno pripada pokrenutom procesu, a postavilo ga je sve što je taj proces pokrenulo. Upis ulimit -n u ljusci opisuje ljusku. Pitajte servisni menadžer što je primijenio, zatim potvrdite na PID-u.

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

Datoteka limits ispisuje meki i tvrdi strop onako kako ih proces vidi. Niska meka vrijednost pod izdašnim tvrdim stropom znači da daemon smije podići vlastiti strop, a neki to čine pri pokretanju; jednake niske vrijednosti znače da je unit datoteka izvor.

Drop-in datoteke učitavaju se leksikografskim redom i kasnije pobjeđuju, pa je systemctl cat vpn-relay.service autoritativan prikaz onoga što se primjenjuje. Uređivanje datoteke koju menadžer nikad ne čita najčešći je razlog što podignut broj nema učinka.

Odvojite postojanu istovremenost od zadržanog stanja

Dva procesa mogu udariti u isti strop iz nepovezanih razloga, a lijekovi se razlikuju. Potražnja koja prati korisne istovremene sesije pitanje je kapaciteta. Rast koji se nastavlja nakon završetka posla je curenje ili skup sesija koje nitko nije zatvorio.

Mjerite u mirovanju, na svom uobičajenom vrhuncu i ponovno nekoliko minuta nakon prestanka opterećenja. Brojanje otvorenih unosa s ls /proc/PID/fd | wc -l prema mekom ograničenju pokazuje vam razliku, a broj jedan ili dva ispod stropa je tvrdi zastoj, a ne spori put.

Kad broj odbija pasti, gledajte stanja socketa, a ne ukupne zbrojeve. Deskriptori koji sjede u CLOSE_WAIT znače da je peer zatvorio, a vaša strana nikad nije, što je defekt životnog ciklusa aplikacije koji veće ograničenje samo odgađa. Ograničite i model djece: relej koji se račva bez gornje granice istovremene djece iscrpljuje deskriptore, procesne slotove i memoriju zajedno.

Provjerite novu vrijednost na živom procesu

Nakon uređivanja unit datoteke ponovno učitajte menadžer i restartajte servis, jer samo ponovno učitavanje nikad ne zamjenjuje ograničenja koja je pokrenuti proces već naslijedio. Provjerite na procesu koji stvarno poslužuje promet.

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

Linija awk vraća novi par; ako još pokazuje stari, drop-in koji ste uredili nije onaj koji se učitava. Broj ss vaša je provjera opterećenja, pa otvorite očekivani broj sesija i gledajte kako raste. Broj koji nastavi rasti nakon zatvaranja tih sesija znači da ograničenje nikad nije bilo cijeli problem.

Uz svako veliko povećanje ide jedna napomena. Aplikacije koje anketiraju s select() ne mogu nadzirati deskriptore iznad FD_SETSIZE, što je 1024 na tipičnim gradnjama, pa strop podignut preko toga može proizvesti neuspjehe koji izgledaju nepovezano. systemd referenca za izvršavanje nosi isto upozorenje za servise koje pokreće.

Držite restart podalje od dostupnosti tunela

Restart releja ispušta njegove aktivne sesije, a to je odvojen događaj od pada VPN-a. Poredajte promjenu tako da tunel ostane gore dok se relej vrti, i upozorite svakoga čija ga dugotrajna sesija presijeca.

Povrat je prethodna unit datoteka plus još jedan restart, i ta datoteka ostaje na mjestu dok nova vrijednost ne preživi radni dan. Zatim zatvorite petlju zahtjevom koji je izvorno pao: jedna nova SSH sesija kroz relej, jedan prijenos dovoljno dug da bude važan i broj deskriptora koji se vraća na razinu mirovanja.

Povezani članci