Είκοσι πέντε λεπτά χρήσιμης εργασίας στη βάση δεδομένων δεν παράγουν σχεδόν καθόλου έξοδο, και από κάθε συσκευή στη διαδρομή αυτή η ροή φαίνεται ανενεργή. Ακριβώς η ανενεργή κατάσταση είναι αυτό που συλλέγεται. Η αναφορά μετά έχει πάντα την ίδια μορφή: το ερώτημα εκτελούνταν, μετά η συνεδρία εξαφανίστηκε και το αποτέλεσμα δεν έφτασε ποτέ.

Τέσσερις έλεγχοι αποφασίζουν αν μια ήσυχη συνεδρία επιβιώνει, και κινούνται από την υποδοχή προς τα έξω. Κάντε τους με σειρά, γιατί ο καθένας υποθέτει ότι το προηγούμενο επίπεδο κάνει τη δουλειά του.

Ποια ροή σωπαίνει

Η σύνδεση που έχει σημασία είναι αυτή που μεταφέρει την κίνηση της βάσης δεδομένων, αναγνωρίσιμη από τις δικές της διευθύνσεις και θύρες. Τίποτε άλλο δεν την ανανεώνει. Ένα ping προς μια πύλη, μια δεύτερη σύνδεση SQL από τον ίδιο κεντρικό υπολογιστή και ο δικός του παλμός της σήραγγας είναι χωριστές ροές με χωριστή κατάσταση σε κάθε συσκευή που τις παρακολουθεί.

ss -tio dst 10.60.4.20
sysctl net.ipv4.tcp_keepalive_time net.ipv4.tcp_keepalive_intvl net.ipv4.tcp_keepalive_probes

Η λίστα υποδοχών δείχνει χρονόμετρα και κατάσταση ουράς για τη ζωντανή σύνδεση, κάτι πιο κατατοπιστικό από έναν έλεγχο προσβασιμότητας. Οι τιμές sysctl είναι οι προεπιλογές του πυρήνα για τη συμπεριφορά keepalive, και η επόμενη ενότητα εξηγεί γιατί μπορεί να μην ισχύσουν ποτέ για τη συνεδρία σας. Μια προεπιλογή που δεν ενεργοποιείται ποτέ δεν διακρίνεται από την πλήρη απουσία προεπιλογής.

Σημειώστε τις διευθύνσεις, τις θύρες και τη διεπαφή που χρησιμοποιεί η σύνδεση. Όταν πεθαίνει μια συνεδρία, αυτές οι λεπτομέρειες σάς επιτρέπουν να ρωτήσετε τη σωστή συσκευή τι έκανε, αντί να ρωτήσετε αν το δίκτυο ήταν ενεργό.

Η πολιτική αδράνειας λήγει ή περιορίζει

Δύο πολιτικές παράγουν το ίδιο σύμπτωμα και απαιτούν αντίθετες απαντήσεις. Ένα χρονικό όριο αδράνειας αφαιρεί κατάσταση που η κατάλληλη κίνηση θα μπορούσε να ανανεώσει, και ένα keepalive μπορεί να το εμποδίσει. Ένα απόλυτο όριο συνεδρίας αφαιρεί τη ροή μετά από σταθερή διάρκεια ανεξάρτητα από τη δραστηριότητα, και κανένα keepalive δεν το αλλάζει.

Ρωτήστε τον ιδιοκτήτη κάθε ενδιάμεσου ποια από τις δύο εφαρμόζει. Ένα τείχος προστασίας, μια συσκευή NAT, ένας εξισορροπητής φόρτου και μια πύλη cloud μπορούν όλα να κρατούν κατάσταση, και δεν χρειάζεται να συμφωνούν. Το στενότερο ορίζει την προθεσμία που πρέπει να κερδίσετε.

Αυτή η διάκριση λέει επίσης πότε να σταματήσετε τη ρύθμιση. Αν η πολιτική είναι απόλυτο όριο, η σωστή λύση είναι μικρότερη μονάδα εργασίας, εργασία που μπορεί να συνεχιστεί ή εγκεκριμένη εξαίρεση, και ο έλεγχος παρακάτω θα επιβεβαιώσει απλώς ότι τα keepalive δεν άλλαξαν τίποτα.

Ο διακόπτης υποδοχής πίσω από τις προεπιλογές του Linux

Το keepalive είναι προαιρετικό ανά υποδοχή. Οι προεπιλογές του πυρήνα περιγράφουν πώς συμπεριφέρονται οι ανιχνεύσεις αφού μια υποδοχή ενεργοποιήσει τον μηχανισμό, και δεν τον ενεργοποιούν για υπάρχουσες συνδέσεις. Μια εφαρμογή που δεν το ζητά ποτέ δεν λαμβάνει ανιχνεύσεις, ό,τι κι αν λένε οι τιμές sysctl.

Γι' αυτό η αύξηση μόνο των αριθμών δεν αλλάζει τίποτα για έναν πελάτη βάσης δεδομένων. Η βιβλιοθήκη πελάτη ή η εφαρμογή πρέπει να ενεργοποιήσει τον μηχανισμό, και όπου η στοίβα προσφέρει χειριστήρια ανά σύνδεση, μια περιορισμένη ρύθμιση υπερτερεί μιας αλλαγής για ολόκληρο τον κεντρικό υπολογιστή που επηρεάζει άσχετες υπηρεσίες.

Το διάστημα μέχρι την πρώτη ανίχνευση δεν είναι ούτε χρονικό όριο ερωτήματος. Μια υγιής σύνδεση μένει ήσυχη ανάμεσα στις ανιχνεύσεις, και ένας νεκρός ομότιμος αναγνωρίζεται κατά το διάστημα και τον αριθμό των ανιχνεύσεων. Το να διαβάζει κανείς αυτές τις τρεις τιμές ως ένα χρονικό όριο οδηγεί σε ρυθμίσεις που ανιχνεύουν την αστοχία είτε πολύ αργά είτε πολύ πρόθυμα. Ελέγχουν την ανίχνευση, όχι την υπομονή της εφαρμογής.

Το EXPIRE_TIME είναι ρύθμιση βάσης δεδομένων, όχι διόρθωση δικτύου

Το Oracle Net προσφέρει δικό του μηχανισμό ζωτικότητας, ρυθμισμένο στο ενεργό προφίλ της διεργασίας και όχι σε ένα αυθαίρετο αρχείο που τυχαίνει να έχει παρόμοιο όνομα. Η τιμή εκφράζεται σε λεπτά.

SQLNET.EXPIRE_TIME = 5

Ο κύριος σκοπός του είναι η ανίχνευση νεκρών συνδέσεων στην πλευρά του διακομιστή, και σε πλατφόρμες που υποστηρίζουν το βελτιωμένο μοντέλο ρυθμίζει επίσης τη συμπεριφορά TCP keepalive για αυτές τις συνδέσεις. Αυτή είναι μια χρήσιμη ιδιότητα: το επίπεδο βάσης δεδομένων μπορεί να οργανώσει ανιχνεύσεις χωρίς να ζητήσει από την εφαρμογή πελάτη να αλλάξει.

Η παραπάνω ενδεικτική τιμή είναι συντονισμένη επιλογή απέναντι σε μια υποτιθέμενη προθεσμία, όχι σύσταση. Η τεκμηριωμένη γενική καθοδήγηση είναι μεγαλύτερο διάστημα, και ο σωστός αριθμός εξαρτάται από την εγκατεστημένη υλοποίηση, το κόστος ανίχνευσης που δέχεστε και τους πραγματικούς κανόνες ανανέωσης στη διαδρομή. Βάλτε τη ρύθμιση στο προφίλ που διαβάζει η σχετική διεργασία και επιβεβαιώστε ότι η διεργασία την πήρε. Η Oracle τεκμηριώνει τις θέσεις των προφίλ και τη συμπεριφορά ανίχνευσης στην αναφορά παραμέτρων της.

Δοκιμάστε το ήσυχο διάστημα και μετά σχεδιάστε την ανάκτηση

Περάστε μια νέα επιτρεπόμενη σύνδεση από μια ήσυχη περίοδο μεγαλύτερη από την προθεσμία που προσπαθείτε να κερδίσετε, και παρακολουθήστε την κίνηση ζωτικότητας και το αποτέλεσμα της εφαρμογής. Μην καταγράφετε περιεχόμενο ωφέλιμου φορτίου που δεν χρειάζεστε· τα χρονόμετρα και η κατάσταση σύνδεσης απαντούν στο ερώτημα.

ss -tio dst 10.60.4.20
# after the quiet interval, same command
ls -l "$ORACLE_HOME/network/admin/sqlnet.ora"

Αν η συνεδρία εξακολουθεί να εξαφανίζεται, η προθεσμία ανήκει σε μια συσκευή που δεν ρωτήσατε ακόμη, ή η πολιτική είναι απόλυτο όριο. Αν επιβιώσει, σημειώστε ποιο επίπεδο άλλαξε ώστε η επόμενη ήσυχη λειτουργία να μην επαναλάβει την έρευνα.

Τέλος, αποφασίστε τι συμβαίνει όταν η σύνδεση πέφτει πραγματικά, γιατί οι έλεγχοι ζωτικότητας μειώνουν τη συχνότητα και δεν αφαιρούν ποτέ την πιθανότητα. Καθορίστε το καταγεγραμμένο αποτέλεσμα της λειτουργίας βάσης δεδομένων πριν την ξαναστείλετε: η απώλεια της απάντησης δεν αποδεικνύει τίποτα για το αν η εργασία επιβεβαιώθηκε. Για ό,τι πρέπει να επιβιώσει από το κλείσιμο φορητού ή επανεκκίνηση σήραγγας, μια εργασία που ανήκει στον διακομιστή με διαρκή έκβαση είναι ο ισχυρότερος σχεδιασμός, και ένα keepalive δεν είναι χρονοδρομολογητής.

Σχετικά άρθρα