VPN relė nustoja priimti SSH: failų deskriptorių limitai
Tunelio srautas teka toliau, o jį už jo esanti socat relė atsisako naujų sesijų. Sekite kelią, tada perskaitykite paveldėtą limitą gyvame PID.
WireGuard rankos paspaudimas vis dar baigiamas, peer vis dar rodo naują galinį tašką, o vis dėlto nauja SSH sesija per relę už jo kabo be banerio. Šis derinys nukreipia nuo tunelio link proceso, kuris priima socket. Relė kaip socat stovi programos kelyje su savo deskriptorių biudžetu, savo vaikais ir savo paveldėtais limitais. Žemiau esantis ėjimas prasideda kliente ir sustoja ties pirmu komponentu, kuris negali atidaryti dar vieno socket.
Sekite kelią prieš keisdami skaičių
Sekite vieną nepavykusią užklausą, o ne samprotaukite apie visą tunelį. Klientas rašo į tunelį, VPN daemonas iššifruoja ir maršrutizuoja, o relė priima kitoje pusėje. Kiekvienas žingsnis sunaudoja deskriptorius, ir tas, kuris paprastai pasibaigia, yra paskutinis.
Pradėkite nuo užklausos, kurią galite atkartoti, ir išmatuokite jos laiką. Jei TCP rankos paspaudimas baigiamas, bet programos baneris neateina, relė paėmė socket ir tada įstrigo vaike arba savo aukštutinėje kojoje. Jei pats rankos paspaudimas niekada nebaigiamas, priežastis yra maršrutizavimas, ugniasienė ar klausytojo būsena, o ne deskriptorių lubos. Užsirašykite, kurią iš dviejų formų matėte, nes jos rodo skirtingus procesus.
Suskaičiuokite ir šuolius, kurie dubliuoja darbą. Šakojantis klausytojas kiekvieną priimtą socket perduoda vaikui, kuris laiko savo kopiją, todėl tikroji suma yra viso medžio savybė, ne vien tėvo.
Perskaitykite limitą, kurį relė paveldėjo
Vienintelis svarbus limitas priklauso veikiančiam procesui, ir jį nustatė tai, kas paleido tą procesą. ulimit -n įvedimas shell’e apibūdina shell’ą. Paklauskite paslaugų tvarkyklės, ką ji pritaikė, tada patvirtinkite PID.
systemctl show -p MainPID -p LimitNOFILE vpn-relay.service
cat /proc/$(systemctl show -p MainPID --value vpn-relay.service)/limits
limits failas išspausdina minkštą ir kietą lubas taip, kaip procesas jas mato. Žema minkšta reikšmė po dosnia kieta reikšme reiškia, kad daemonui leidžiama pakelti savo lubas, ir kai kurie tai daro paleidžiant; lygios žemos reikšmės reiškia, kad unit failas yra šaltinis.
Drop-in failai įkeliami leksikografine tvarka, o vėlesni failai nugali, todėl systemctl cat vpn-relay.service yra autoritetingas vaizdas to, kas galioja. Redaguoti failą, kurio tvarkyklė niekada neskaito, yra dažniausia priežastis, kodėl padidintas skaičius neturi poveikio.
Atskirkite pastovų paralelumą nuo išlaikytos būsenos
Du procesai gali pasiekti tas pačias lubas dėl nesusijusių priežasčių, o priemonės skiriasi. Paklausa, kuri seka naudingas lygiagrečias sesijas, yra talpos klausimas. Augimas, kuris tęsiasi pasibaigus darbui, yra nuotėkis arba sesijų rinkinys, kurio niekas neuždarė.
Matuokite tuščioje būsenoje, įprastame pike ir dar kartą praėjus kelioms minutėms po apkrovos pabaigos. Atvirų įrašų skaičiavimas su ls /proc/PID/fd | wc -l prieš minkštą limitą parodo spragą, o skaičius vienu ar dviem žemiau lubų yra kieta sustabdymas, o ne lėtas kelias.
Kai skaičius nenori kristi, žiūrėkite į socket būsenas, o ne į sumas. Deskriptoriai, sėdintys CLOSE_WAIT, reiškia, kad peer uždarė, o jūsų pusė niekada neuždarė, ir tai yra programos gyvavimo ciklo defektas, kurį didesnis limitas tik atideda. Apribokite ir vaikų modelį: šakojantis relė be lygiagrečių vaikų lubų kartu išnaudoja deskriptorius, proceso lizdus ir atmintį.
Patikrinkite naują reikšmę gyvame procese
Paredagavę unit, iš naujo įkelkite tvarkyklę ir iš naujo paleiskite paslaugą, nes vien pakartotinis įkėlimas niekada nepakeičia limitų, kuriuos veikiantis procesas jau paveldėjo. Patikrinkite procese, kuris iš tikrųjų aptarnauja srautą.
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
awk eilutė grąžina naują porą; jei ji vis dar rodo seną, jūsų redaguotas drop-in nėra tas, kuris įkeliamas. ss skaičius yra jūsų apkrovos patikra, todėl atidarykite tiek sesijų, kiek tikitės, ir stebėkite, kaip jis kyla. Skaičius, kuris ir toliau kyla uždaržius tas sesijas, reiškia, kad limitas niekada nebuvo visa problema.
Su kiekvienu dideliu padidinimu ateina vienas įspėjimas. Programos, kurios apklausinėja su select(), negali stebėti deskriptorių virš FD_SETSIZE, kuris įprastuose builduose yra 1024, todėl aukščiau pakeltos lubos gali sukelti gedimus, kurie atrodo nesusiję. systemd vykdymo žinynas turi tą patį įspėjimą paslaugoms, kurias paleidžia.
Laikykite paleidimą toli nuo tunelio prieinamumo
Relės paleidimas numeta jos aktyvias sesijas, ir tai atskiras įvykis nuo VPN kritimo. Sudėliokite pakeitimą taip, kad tunelis liktų viršuje, kol relė sukasi, ir įspėkite kiekvieną, kurio ilga sesija jį kerta.
Atšaukimas yra ankstesnis unit failas plius dar vienas paleidimas, ir tas failas lieka vietoje, kol nauja reikšmė išgyvens darbo dieną. Tada uždarykite ciklą užklausa, kuri iš pradžių nepavyko: viena nauja SSH sesija per relę, vienas perdavimas, pakankamai ilgas, kad būtų svarbus, ir deskriptorių skaičius, kuris grįžta į tuščios būsenos lygį.