Πώς να λύσετε το σφάλμα “Πάρα πολλά ανοιχτά αρχεία” στο Linux
Βασικά Takeaways
Εάν δείτε το μήνυμα λάθους “Πάρα πολλά ανοιχτά αρχεία” στο
Linux
, η διεργασία σας έχει φτάσει στο ανώτατο όριο των αρχείων που επιτρέπεται να ανοίξει, συνήθως 1.024. Μπορείτε να αυξήσετε προσωρινά το όριο, για παράδειγμα, σε 2.048 αρχεία, με την εντολή “ulimit -n 2048”. Αυξήστε το όριο μόνιμα επεξεργάζοντας τα αρχεία διαμόρφωσης systemd.
Σε
υπολογιστές
Linux, οι πόροι του συστήματος μοιράζονται μεταξύ των χρηστών. Προσπαθήστε να χρησιμοποιήσετε περισσότερο από το δίκαιο μερίδιό σας και θα φτάσετε σε ένα ανώτατο όριο. Ενδέχεται επίσης να εμποδίσετε άλλους χρήστες ή διαδικασίες.
Ποιο είναι το σφάλμα πάρα πολλών ανοιχτών αρχείων;
Μεταξύ των άλλων πολλών θέσεων εργασίας του, ο πυρήνας ενός υπολογιστή Linux είναι πάντα απασχολημένος παρακολουθώντας ποιος χρησιμοποιεί πόσους από τους πεπερασμένους πόρους του συστήματος, όπως τους κύκλους RAM και CPU. Ένα σύστημα πολλών χρηστών απαιτεί συνεχή προσοχή για να βεβαιωθείτε ότι οι άνθρωποι και οι διαδικασίες δεν χρησιμοποιούν περισσότερο από οποιονδήποτε δεδομένο πόρο του συστήματος από όσο είναι κατάλληλο.
Δεν είναι δίκαιο, για παράδειγμα, κάποιος να πιάνει τόσο πολύ χρόνο CPU ώστε ο υπολογιστής να αισθάνεται αργός για όλους τους άλλους. Ακόμα κι αν είστε το μόνο άτομο που χρησιμοποιεί τον υπολογιστή σας Linux, υπάρχουν όρια για τους πόρους που μπορούν να χρησιμοποιήσουν οι διαδικασίες σας. Εξάλλου, είστε ακόμα ένας άλλος χρήστης.
Ορισμένοι πόροι συστήματος είναι γνωστοί και προφανείς, όπως η RAM, οι κύκλοι CPU και ο χώρος του σκληρού δίσκου. Υπάρχουν όμως πολλοί, πολλοί περισσότεροι πόροι που παρακολουθούνται και για τους οποίους κάθε χρήστης —ή κάθε διεργασία που ανήκει στον χρήστη— έχει ένα καθορισμένο ανώτατο όριο. Ένα από αυτά είναι ο αριθμός των αρχείων που μπορεί να ανοίξει μια διαδικασία ταυτόχρονα.
Εάν έχετε δει ποτέ το μήνυμα λάθους “Πάρα πολλά ανοιχτά αρχεία” σε ένα παράθυρο τερματικού ή το βρήκατε στα αρχεία καταγραφής του συστήματός σας, σημαίνει ότι το ανώτατο όριο έχει φτάσει και δεν επιτρέπεται στη διαδικασία να ανοίξει άλλα αρχεία.
Γιατί ανοίγουν τόσα πολλά αρχεία;
Υπάρχει ένα όριο σε όλο το σύστημα στον αριθμό των ανοιχτών αρχείων που μπορεί να χειριστεί το Linux. Είναι ένας πολύ
μεγάλο
ς αριθμός, όπως θα δούμε, αλλά υπάρχει ακόμα ένα όριο. Κάθε διαδικασία χρήστη έχει μια κατανομή που μπορούν να χρησιμοποιήσουν. Λαμβάνουν το καθένα ένα μικρό μερίδιο του συνόλου του συστήματος που τους διατίθεται.
Αυτό που στην πραγματικότητα εκχωρείται είναι ένας αριθμός λαβών αρχείων. Κάθε αρχείο που ανοίγει απαιτεί μια λαβή. Ακόμη και με αρκετά γενναιόδωρες κατανομές, οι χειρισμοί αρχείων σε όλο το σύστημα μπορούν να εξαντληθούν πιο γρήγορα από ό,τι φαντάζεστε αρχικά.
Το Linux αφαιρεί σχεδόν τα πάντα έτσι ώστε να φαίνεται σαν να είναι ένα αρχείο. Μερικές φορές θα είναι ακριβώς αυτό, απλά παλιά αρχεία. Αλλά άλλες ενέργειες, όπως το άνοιγμα ενός καταλόγου, χρησιμοποιούν επίσης μια λαβή αρχείου. Το Linux χρησιμοποιεί μπλοκ ειδικά αρχεία ως ένα είδος προγράμματος οδήγησης για συσκευές υλικού. Τα ειδικά αρχεία χαρακτήρων μοιάζουν πολύ, αλλά χρησιμοποιούνται συχνότερα με συσκευές που έχουν μια έννοια απόδοσης, όπως σωλήνες και σειριακές θύρες.
Ο αποκλεισμός ειδικών αρχείων χειρίζεται μπλοκ δεδομένων κάθε φορά και τα ειδικά αρχεία χαρακτήρων χειρίζονται κάθε χαρακτήρα ξεχωριστά. Και τα δύο αυτά ειδικά αρχεία είναι προσβάσιμα μόνο χρησιμοποιώντας χειρισμούς αρχείων. Οι βιβλιοθήκες που χρησιμοποιούνται από ένα πρόγραμμα χρησιμοποιούν χειρισμό αρχείων, οι ροές χρησιμοποιούν λαβές αρχείων και οι συνδέσεις δικτύου χρησιμοποιούν λαβές αρχείων.
Η αφαίρεση όλων αυτών των διαφορετικών απαιτήσεων, έτσι ώστε να εμφανίζονται ως αρχεία, απλοποιεί τη διασύνδεση με αυτά και επιτρέπει σε πράγματα όπως οι σωληνώσεις και οι ροές να λειτουργούν.
Μπορείτε να δείτε ότι το Linux στα παρασκήνια ανοίγει αρχεία και χρησιμοποιεί χειρισμούς αρχείων μόνο για να τρέξει μόνο του – μην πειράζετε τις διαδικασίες χρήστη σας. Ο αριθμός των ανοιχτών αρχείων δεν είναι μόνο ο αριθμός των αρχείων που έχετε ανοίξει. Σχεδόν τα πάντα στο λειτουργικό σύστημα χρησιμοποιούν χειρισμούς αρχείων.
Πώς να ελέγξετε τα όρια χειρισμού αρχείων
Ο μέγιστος αριθμός χειρισμών αρχείων σε όλο το σύστημα μπορεί να φανεί με αυτήν την εντολή.
cat /proc/sys/fs/file-max
Αυτό επιστρέφει έναν παράλογα μεγάλο αριθμό 9,2 εκατομμυρίων. Αυτό είναι το μέγιστο θεωρητικό σύστημα. Είναι η μεγαλύτερη δυνατή τιμή που μπορείτε να κρατήσετε σε έναν υπογεγραμμένο ακέραιο αριθμό 64 bit. Το αν ο κακός υπολογιστής σας θα μπορούσε πραγματικά να αντιμετωπίσει τόσα πολλά αρχεία που ανοίγουν ταυτόχρονα είναι ένα άλλο θέμα.
Σε επίπεδο χρήστη, δεν υπάρχει ρητή τιμή για τον μέγιστο αριθμό ανοιχτών αρχείων που μπορείτε να έχετε. Μπορούμε όμως χονδρικά να το λύσουμε. Για να μάθουμε τον μέγιστο αριθμό αρχείων που μπορεί να ανοίξει μια από τις διεργασίες σας, μπορούμε να χρησιμοποιήσουμε το
ulimit
εντολή με το
-n
επιλογή (ανοικτά αρχεία).
ulimit -n
Και για να βρούμε τον μέγιστο αριθμό διαδικασιών που μπορεί να έχει ένας χρήστης, θα χρησιμοποιήσουμε
ulimit
με την
-u
επιλογή (διεργασίες χρήστη).
ulimit -u
Πολλαπλασιάζοντας το 1024 και το 7640 δίνουμε 7.823.360. Φυσικά, πολλές από αυτές τις διαδικασίες θα χρησιμοποιούνται ήδη από το περιβάλλον της επιφάνειας εργασίας σας και άλλες διεργασίες παρασκηνίου. Αυτό είναι λοιπόν ένα άλλο θεωρητικό μέγιστο, που δεν θα επιτύχετε ποτέ ρεαλιστικά.
Το σημαντικό στοιχείο είναι ο αριθμός των αρχείων που μπορεί να ανοίξει μια διαδικασία. Από προεπιλογή, αυτό είναι 1024. Αξίζει να σημειωθεί ότι το άνοιγμα του ίδιου αρχείου 1024 φορές ταυτόχρονα είναι το ίδιο με το άνοιγμα 1024 διαφορετικών αρχείων ταυτόχρονα. Μόλις εξαντλήσετε όλες τις λαβές αρχείων σας, είστε έτοιμοι.
Είναι δυνατό να προσαρμόσετε τον αριθμό των αρχείων που μπορεί να ανοίξει μια διαδικασία. Υπάρχουν στην πραγματικότητα δύο τιμές που πρέπει να λάβετε υπόψη όταν προσαρμόζετε αυτόν τον αριθμό. Το ένα είναι η τιμή στην οποία έχει οριστεί αυτήν τη στιγμή ή στην οποία προσπαθείτε να την ορίσετε. Αυτό ονομάζεται soft limit. Υπάρχει επίσης ένα σκληρό όριο, και αυτή είναι η υψηλότερη τιμή στην οποία μπορείτε να αυξήσετε το όριο.
Ο τρόπος για να το σκεφτείτε αυτό είναι ότι το ήπιο όριο είναι στην πραγματικότητα η “τρέχουσα τιμή” και το ανώτερο όριο είναι η υψηλότερη τιμή που μπορεί να φτάσει η τρέχουσα τιμή. Ένας κανονικός χρήστης χωρίς root μπορεί να αυξήσει το soft όριο του σε οποιαδήποτε τιμή μέχρι το σκληρό όριο. Ο χρήστης root μπορεί να αυξήσει το σκληρό όριο του.
Για να δείτε τα τρέχοντα soft και hard όρια, χρησιμοποιήστε
ulimit
με την
-S
(μαλακό) και
-H
(σκληρές) επιλογές, και το
-n
επιλογή (ανοικτά αρχεία).
ulimit -Sn
ulimit -Hn
Για να δημιουργήσουμε μια κατάσταση όπου μπορούμε να δούμε την επιβολή του soft limit, δημιουργήσαμε ένα πρόγραμμα που ανοίγει
επα
νειλημμένα αρχεία μέχρι να αποτύχει. Στη συνέχεια, περιμένει για ένα πάτημα πλήκτρων πριν παραιτηθεί από όλες τις λαβές αρχείων που χρησιμοποιούσε. Το πρόγραμμα ονομάζεται
open-files
.
./open-Files
Ανοίγει 1021 αρχεία και αποτυγχάνει καθώς προσπαθεί να ανοίξει το αρχείο 1022.
1024 μείον 1021 είναι 3. Τι συνέβη με τις άλλες τρεις λαβές αρχείων; Χρησιμοποιήθηκαν για την
STDIN
,
STDOUT
και
STDERR
ρέματα. Δημιουργούνται αυτόματα για κάθε διαδικασία. Αυτά έχουν πάντα τιμές περιγραφής αρχείων 0, 1 και 2.
Μπορούμε να τα δούμε χρησιμοποιώντας το
lsof
εντολή με το
-p
(διαδικασία) επιλογή και το αναγνωριστικό διεργασίας του
open-files
πρόγραμμα. Εύκολα, εκτυπώνει το αναγνωριστικό διεργασίας στο παράθυρο του τερματικού.
lsof -p 11038
Φυσικά, σε μια πραγματική κατάσταση, μπορεί να μην γνωρίζετε ποια διαδικασία έχει μόλις καταβροχθίσει όλες τις λαβές αρχείων. Για να ξεκινήσετε την έρευνά σας, θα μπορούσατε να χρησιμοποιήσετε αυτήν τη σειρά εντολών με σωλήνωση. Θα σας πει τους δεκαπέντε πιο παραγωγικούς χρήστες χειρισμών αρχείων στον υπολογιστή σας.
lsof | awk '{ print $1 " " $2; }' | sort -rn | uniq -c | sort -rn | head -15
Για να δείτε περισσότερες ή λιγότερες καταχωρήσεις, προσαρμόστε το
-15
παράμετρος στο
head
εντολή. Αφού προσδιορίσετε τη διαδικασία, πρέπει να καταλάβετε εάν έχει γίνει ακατάλληλη και ανοίγει πάρα πολλά αρχεία επειδή είναι εκτός ελέγχου ή αν χρειάζεται πραγματικά αυτά τα αρχεία. Εάν τα χρειάζεται, πρέπει να αυξήσετε το όριο χειρισμού αρχείων.
Πώς να αυξήσετε το Soft Limit
Εάν αυξήσουμε το soft limit και εκτελέσουμε ξανά το πρόγραμμά μας, θα το δούμε να ανοίγει περισσότερα αρχεία. Θα χρησιμοποιήσουμε το
ulimit
εντολή και το
-n
(ανοιχτά αρχεία) επιλογή με αριθμητική τιμή 2048. Αυτό θα είναι το νέο soft limit.
ulimit -n 2048
Αυτή τη φορά ανοίξαμε με επιτυχία 2045 αρχεία. Όπως αναμενόταν, αυτό είναι τρεις λιγότερο από το 2048, λόγω των χειρισμών αρχείων που χρησιμοποιούνται για
STDIN
,
STDOUT
και
STDERR
.
Πώς να αλλάξετε μόνιμα το όριο αρχείων
Η αύξηση του μαλακού ορίου επηρεάζει μόνο το τρέχον κέλυφος. Ανοίξτε ένα νέο παράθυρο τερματικού και ελέγξτε το λογικό όριο. Θα δείτε ότι είναι η παλιά προεπιλεγμένη τιμή. Ωστόσο, υπάρχει ένας τρόπος για να ορίσετε συνολικά μια νέα προεπιλεγμένη τιμή για τον μέγιστο αριθμό ανοιχτών αρχείων που μπορεί να έχει μια διεργασία, η οποία είναι επίμονη και επιβιώνει από τις επανεκκινήσεις.
Οι παλιές συμβουλές συχνά συνιστούν να επεξεργάζεστε αρχεία όπως “/etc/sysctl.conf” και “/etc/
security
/limits.conf.” Ωστόσο, σε διανομές που βασίζονται σε σύστημα, αυτές οι τροποποιήσεις δεν λειτουργούν με συνέπεια, ειδικά για περιόδους σύνδεσης με γραφικά.
Η τεχνική που παρουσιάζεται εδώ είναι ο τρόπος για να γίνει αυτό σε διανομές που βασίζονται σε σύστημα. Υπάρχουν δύο αρχεία με τα οποία πρέπει να δουλέψουμε. Το πρώτο είναι το αρχείο “/etc/systemd/system.conf”. Θα χρειαστεί να χρησιμοποιήσουμε
sudo
.
sudo gedit /etc/systemd/system.conf
Αναζητήστε τη γραμμή που περιέχει τη συμβολοσειρά “DefaultLimitNOFILE”. Αφαιρέστε τον κατακερματισμό “#” από την αρχή της γραμμής και επεξεργαστείτε τον πρώτο αριθμό σε ό,τι θέλετε να είναι το νέο σας soft όριο για διεργασίες. Επιλέξαμε 4096. Ο δεύτερος αριθμός σε αυτή τη γραμμή είναι το σκληρό όριο. Δεν το προσαρμόσαμε αυτό.
Αποθηκεύστε το αρχείο και κλείστε το πρόγραμμα επεξεργασίας.
Πρέπει να επαναλάβουμε αυτή τη λειτουργία στο αρχείο “/etc/systemd/user.conf”.
sudo gedit /etc/systemd/user.conf
Κάντε τις ίδιες προσαρμογές στη γραμμή που περιέχει τη συμβολοσειρά “DefaultLimitNOFILE”.
Αποθηκεύστε το αρχείο και κλείστε το πρόγραμμα επεξεργασίας. Πρέπει είτε να επανεκκινήσετε τον υπολογιστή σας είτε να χρησιμοποιήσετε το
systemctl
εντολή με το
daemon-reexec
επιλογή έτσι ώστε
systemd
εκτελείται ξανά και απορροφά τις νέες ρυθμίσεις.
sudo systemctl daemon-reexec
Ανοίγοντας ένα παράθυρο τερματικού και ελέγχοντας το νέο όριο θα πρέπει να εμφανίζεται η νέα τιμή που έχετε ορίσει. Στην περίπτωσή μας ήταν 4096.
ulimit -n
Μπορούμε να ελέγξουμε ότι αυτή είναι μια ζωντανή, λειτουργική αξία, εκτελώντας ξανά το πρόγραμμα που είναι άπληστο για αρχεία.
./open-Files
Το πρόγραμμα αποτυγχάνει να ανοίξει τον αριθμό αρχείου 4094, που σημαίνει ότι 4093 ανοίχτηκαν αρχεία. Αυτή είναι η αναμενόμενη τιμή μας, 3 λιγότερο από 4096.
Να θυμάστε ότι τα πάντα είναι ένα αρχείο
Γι’ αυτό το Linux εξαρτάται τόσο πολύ από τους χειρισμούς αρχείων. Τώρα, αν αρχίσετε να σας τελειώνουν, ξέρετε πώς να αυξήσετε το όριο σας.
VIA:
HowToGeek.com
