Το relay VPN σταματά να δέχεται SSH: όρια περιγραφέων αρχείων
Η κίνηση της σήραγγας συνεχίζει να ρέει, ενώ το relay socat πίσω της αρνείται νέες συνεδρίες. Ακολουθήστε τη διαδρομή και μετά διαβάστε το κληρονομημένο όριο στο ζωντανό PID.
Η χειραψία WireGuard εξακολουθεί να ολοκληρώνεται, ο peer εξακολουθεί να δείχνει πρόσφατο endpoint, και όμως μια νέα συνεδρία SSH μέσω του relay πίσω της κολλά χωρίς banner. Αυτός ο συνδυασμός δείχνει μακριά από τη σήραγγα και προς τη διεργασία που δέχεται το socket. Ένα relay όπως το socat κάθεται στη διαδρομή της εφαρμογής με δικό του προϋπολογισμό περιγραφέων, δικά του παιδιά και δικά του κληρονομημένα όρια. Η πορεία παρακάτω ξεκινά από τον πελάτη και σταματά στο πρώτο στοιχείο που δεν μπορεί να ανοίξει άλλο socket.
Ακολουθήστε τη διαδρομή πριν αλλάξετε έναν αριθμό
Ακολουθήστε ένα αποτυχημένο αίτημα αντί να συλλογίζεστε τη σήραγγα ως σύνολο. Ο πελάτης γράφει στη σήραγγα, ο δαίμονας VPN αποκρυπτογραφεί και δρομολογεί, και το relay δέχεται στην άλλη πλευρά. Κάθε βήμα καταναλώνει περιγραφείς, και αυτό που συνήθως εξαντλείται είναι το τελευταίο.
Ξεκινήστε με ένα αίτημα που μπορείτε να αναπαράγετε και μετρήστε τον χρόνο του. Αν η χειραψία TCP ολοκληρώνεται αλλά δεν φτάνει banner εφαρμογής, το relay πήρε το socket και μετά κόλλησε σε παιδί ή στο upstream σκέλος του. Αν η ίδια η χειραψία δεν ολοκληρώνεται ποτέ, η αιτία είναι δρομολόγηση, firewall ή κατάσταση ακροατή, όχι οροφή περιγραφέων. Καταγράψτε ποια από τις δύο μορφές παρατηρήσατε, γιατί δείχνουν σε διαφορετικές διεργασίες.
Μετρήστε και τα άλματα που διπλασιάζουν τη δουλειά. Ένας ακροατής που διακλαδίζεται παραδίδει κάθε αποδεκτό socket σε παιδί που κρατά το δικό του αντίγραφο, άρα το πραγματικό σύνολο είναι ιδιότητα ολόκληρου του δέντρου, όχι μόνο του γονέα.
Διαβάστε το όριο που κληρονόμησε το relay
Το μόνο όριο που μετρά ανήκει στη διεργασία που τρέχει, και το έθεσε ό,τι εκκίνησε αυτή τη διεργασία. Η πληκτρολόγηση ulimit -n σε ένα κέλυφος περιγράφει το κέλυφος. Ρωτήστε τον διαχειριστή υπηρεσιών τι εφάρμοσε και μετά επιβεβαιώστε στο PID.
systemctl show -p MainPID -p LimitNOFILE vpn-relay.service
cat /proc/$(systemctl show -p MainPID --value vpn-relay.service)/limits
Το αρχείο limits εκτυπώνει το μαλακό και το σκληρό όριο όπως τα βλέπει η διεργασία. Μια χαμηλή μαλακή τιμή κάτω από ένα γενναιόδωρο σκληρό όριο σημαίνει ότι ο δαίμονας επιτρέπεται να ανεβάσει τη δική του οροφή, και μερικοί το κάνουν στην εκκίνηση· ίσες χαμηλές τιμές σημαίνουν ότι το αρχείο unit είναι η πηγή.
Τα drop-in φορτώνονται σε λεξιλογική σειρά και τα μεταγενέστερα αρχεία κερδίζουν, άρα το systemctl cat vpn-relay.service είναι η έγκυρη εικόνα του τι ισχύει. Η επεξεργασία αρχείου που ο διαχειριστής δεν διαβάζει ποτέ είναι ο συνηθέστερος λόγος που ένας αυξημένος αριθμός δεν έχει αποτέλεσμα.
Χωρίστε τη σταθερή συγχρονικότητα από τη διατηρούμενη κατάσταση
Δύο διεργασίες μπορούν να χτυπήσουν την ίδια οροφή για άσχετους λόγους, και τα μέτρα διαφέρουν. Η ζήτηση που παρακολουθεί χρήσιμες ταυτόχρονες συνεδρίες είναι ζήτημα χωρητικότητας. Η ανάπτυξη που συνεχίζεται αφού τελειώσει η δουλειά είναι διαρροή ή σύνολο συνεδριών που δεν έκλεισε κανείς.
Μετρήστε σε ηρεμία, στην κανονική σας αιχμή και ξανά λίγα λεπτά αφού σταματήσει το φορτίο. Η μέτρηση ανοιχτών εγγραφών με ls /proc/PID/fd | wc -l έναντι του μαλακού ορίου σας λέει το κενό, και ένας αριθμός ένα ή δύο κάτω από την οροφή είναι σκληρή στάση, όχι αργή διαδρομή.
Όταν ο αριθμός αρνείται να πέσει, κοιτάξτε καταστάσεις socket αντί για σύνολα. Περιγραφείς που κάθονται σε CLOSE_WAIT σημαίνουν ότι ο peer έκλεισε και η δική σας πλευρά ποτέ δεν το έκανε, που είναι ελάττωμα κύκλου ζωής εφαρμογής και ένα μεγαλύτερο όριο μόνο το αναβάλλει. Περιορίστε και το μοντέλο παιδιών: ένα relay που διακλαδίζεται χωρίς όριο στα ταυτόχρονα παιδιά εξαντλεί περιγραφείς, θέσεις διεργασιών και μνήμη μαζί.
Ελέγξτε τη νέα τιμή στη ζωντανή διεργασία
Αφού επεξεργαστείτε το unit, επαναφορτώστε τον διαχειριστή και επανεκκινήστε την υπηρεσία, αφού μια επαναφόρτωση μόνη της δεν αντικαθιστά ποτέ όρια που έχει ήδη κληρονομήσει μια διεργασία σε λειτουργία. Επαληθεύστε στη διεργασία που πραγματικά εξυπηρετεί κίνηση.
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 επιστρέφει το νέο ζεύγος· αν εξακολουθεί να δείχνει το παλιό, το drop-in που επεξεργαστήκατε δεν είναι αυτό που φορτώνεται. Ο αριθμός ss είναι ο έλεγχος φόρτου σας, οπότε ανοίξτε τον αριθμό συνεδριών που περιμένετε και παρακολουθήστε τον να ανεβαίνει. Ένας αριθμός που συνεχίζει να ανεβαίνει αφού κλείσουν αυτές οι συνεδρίες σημαίνει ότι το όριο δεν ήταν ποτέ όλο το πρόβλημα.
Μια επιφύλαξη συνοδεύει κάθε μεγάλη αύξηση. Οι εφαρμογές που ερωτούν με select() δεν μπορούν να παρακολουθήσουν περιγραφείς πάνω από FD_SETSIZE, που είναι 1024 σε τυπικές κατασκευές, άρα μια οροφή ανεβασμένη πιο πάνω μπορεί να παράγει αποτυχίες που φαίνονται άσχετες. Η αναφορά εκτέλεσης του systemd φέρνει την ίδια προειδοποίηση για τις υπηρεσίες που ξεκινά.
Κρατήστε την επανεκκίνηση μακριά από τη διαθεσιμότητα της σήραγγας
Η επανεκκίνηση του relay ρίχνει τις ενεργές συνεδρίες του, και αυτό είναι ξεχωριστό γεγονός από την πτώση του VPN. Τακτοποιήστε την αλλαγή ώστε η σήραγγα να μένει πάνω όσο το relay κάνει κύκλο, και προειδοποιήστε όποιον η μακρόχρονη συνεδρία του τη διασχίζει.
Η επαναφορά είναι το προηγούμενο αρχείο unit συν άλλη μια επανεκκίνηση, και αυτό το αρχείο μένει στη θέση του ώσπου η νέα τιμή να επιβιώσει μια εργάσιμη ημέρα. Μετά κλείστε τον βρόχο με το αίτημα που απέτυχε αρχικά: μία νέα συνεδρία SSH μέσω του relay, μία μεταφορά αρκετά μεγάλη για να μετρά, και ένας αριθμός περιγραφέων που επιστρέφει στο επίπεδο ηρεμίας του.