Come risolvere l’errore “Troppi file aperti” in Linux
Sui computer Linux, le risorse di sistema sono condivise tra gli utenti. Prova a utilizzare più della tua giusta quota e raggiungerai il limite superiore. Puoi anche diventare un collo di bottiglia per altri utenti o processi.
Risorse di sistema condivise
Tra le altre innumerevoli attività, il kernel di un computer Linux è sempre impegnato a monitorare chi sta utilizzando quante risorse di sistema limitate come RAM e cicli della CPU. Un sistema multiutente richiede un’attenzione costante per garantire che persone e processi non utilizzino alcuna risorsa di sistema più del necessario.
Ad esempio, non è giusto se qualcuno utilizza così tanto tempo della CPU che il computer sembra lento a tutti gli altri. Anche se sei l’unica persona che utilizza il tuo computer Linux, ci sono dei limiti alle risorse che i tuoi processi possono utilizzare. Dopotutto, sei ancora solo un altro utente.
Alcune risorse di sistema sono ben note e ovvie, come RAM, cicli del processore e spazio su disco rigido. Ma ci sono molte più risorse che vengono monitorate e per le quali ogni utente o ogni processo di proprietà di un utente ha un limite superiore impostato. Uno di questi è il numero di file che il processo può aprire contemporaneamente.
Se hai mai visto il messaggio di errore “Troppi file aperti” in una finestra del terminale o l’hai trovato nei log di sistema, significa che è stato raggiunto il limite superiore e il processo non è più autorizzato ad aprire i file.
Non hai aperto solo file
Esiste un limite a livello di sistema sul numero di file aperti che Linux può gestire. Come vedremo, si tratta di un numero molto grande, ma c’è ancora un limite. Ogni processo utente ha una selezione che può utilizzare. Ognuno di loro riceve una piccola quota dell’importo totale del sistema a lui assegnato.
Ciò che davvero spicca è il numero di descrittori di file. È necessario un handle per ogni file aperto. Anche con un’allocazione delle risorse abbastanza generosa, i descrittori di file a livello di sistema possono essere utilizzati più velocemente di quanto si possa pensare.
Linux astrae quasi tutto in modo che sembri essere un file. A volte saranno solo vecchi file. Ma anche altre azioni, come l’apertura di una directory, utilizzano un handle di file. Linux utilizza file speciali di blocco come una sorta di driver per i dispositivi hardware. I file speciali di caratteri sono molto simili, ma sono più comunemente usati con dispositivi che hanno un concetto di larghezza di banda, come canali e porte seriali.
I file di blocchi speciali elaborano blocchi di dati contemporaneamente e i file di simboli speciali elaborano ciascun carattere separatamente. È possibile accedere a entrambi questi file speciali solo utilizzando descrittori di file. Le librerie utilizzate da un programma utilizzano un handle di file, i thread utilizzano un handle di file e le connessioni di rete utilizzano un handle di file.
L’astrazione di tutti questi diversi requisiti in modo che appaiano come file semplifica l’interazione con essi e consente a cose come pipeline e flussi di funzionare.
Puoi vedere dietro le quinte che Linux apre i file e utilizza solo descrittori di file per l’esecuzione, per non parlare dei processi utente. Il numero di file aperti non è solo il numero di file che hai aperto. Quasi tutto nel sistema operativo utilizza descrittori di file.
Limiti del descrittore di file
Con questo comando puoi vedere il numero massimo di descrittori di file di sistema.
cat /proc/sys/fs/file-max
Ciò restituisce un numero assurdamente grande di 9,2 quintilioni. Questo è il massimo teorico del sistema. Questo è il valore massimo che puoi memorizzare in un intero con segno a 64 bit. Se il tuo povero computer può gestire così tanti file aperti contemporaneamente è un’altra questione.
A livello di utente, non esiste un valore esplicito per il numero massimo di file aperti che puoi avere. Ma possiamo approssimativamente risolverlo. Per scoprire il numero massimo di file che uno dei tuoi processi può aprire, possiamo utilizzare ulimit
il comando con l’ -n
opzione (file aperti).
ulimit -n
E per trovare il numero massimo di processi che un utente può avere, useremo l’ ulimit
opzione -u
(processi utente) .
ulimit -u
Moltiplicando 1024 per 7640 si ottengono 7.823.360 Naturalmente, molti di questi processi sono già utilizzati dall’ambiente desktop e da altri processi in background. Quindi questo è un altro massimo teorico che non raggiungerai mai.
La cifra importante è il numero di file che il processo può aprire. Per impostazione predefinita, questo è 1024. Vale la pena notare che aprire lo stesso file 1024 volte contemporaneamente equivale ad aprire 1024 file diversi contemporaneamente. Dopo aver esaurito tutti i descrittori di file, il gioco è fatto.
È possibile regolare il numero di file che un processo può aprire. In realtà ci sono due valori da considerare quando si imposta questo numero. Uno di questi è il valore attualmente impostato o che si sta tentando di impostare. Questo è chiamato il limite morbido. C’è anche un limite rigido, e questo è il massimo a cui puoi aumentare il limite morbido.
Puoi pensarla in questo modo: il limite morbido è in realtà il “valore corrente” e il limite superiore è il valore massimo che il valore corrente può raggiungere. Un normale utente non root può aumentare il proprio limite soft a qualsiasi valore fino al proprio limite hard. L’utente root può aumentare il suo limite rigido.
Per visualizzare i limiti software e hardware correnti, utilizzare ulimit
le opzioni -S
(soft) e -H
(hard), nonché l’ -n
opzione (file aperti).
ulimit -Sn
ulimit -Hn
Per creare una situazione in cui possiamo vedere l’applicazione del limite morbido, abbiamo creato un programma che apre ripetutamente i file fino a quando non fallisce. Quindi attende la pressione di un tasto prima di eliminare qualsiasi descrittore di file in uso. Il programma si chiama open-files
.
./open-Files
Apre 1021 file e non riesce quando si tenta di aprire il file 1022.
1024 meno 1021 è uguale a 3. Cosa è successo agli altri tre descrittori di file? STDIN
Sono stati utilizzati per i flussi STDOUT
e. STDERR
Vengono creati automaticamente per ogni processo. Hanno sempre i valori del descrittore di file 0, 1 e 2.
Possiamo vederli usando lsof
il comando con il -p
parametro (process) e l’ID di processo del open-files
programma. Convenientemente, stampa il suo ID processo sulla finestra del terminale.
lsof -p 11038
Ovviamente, in una situazione reale, potresti non sapere quale processo ha mangiato tutti i descrittori di file. Per avviare un’indagine, puoi utilizzare questa sequenza di comandi. Ti parlerà dei quindici utenti di descrittori di file più attivi sul tuo computer.
lsof | awk '{ print $1 ""$2; }' | sort -rn | uniq -c | sort -rn | head -15
Per visualizzare più o meno voci, regolare il -15
parametro del comando head
. Una volta identificato il processo, devi scoprire se è diventato illegale e sta aprendo troppi file perché è fuori controllo o se ha davvero bisogno di quei file. Se ne ha bisogno, è necessario aumentare il limite del descrittore di file.
Aumentare il limite morbido
Se aumentiamo il limite soft ed eseguiamo nuovamente il nostro programma, dovremmo vedere che apre più file. Useremo ulimit
il comando e il parametro -n
(file aperti) con un valore numerico di 2048. Questo sarà il nuovo limite soft.
ulimit -n 2048
Questa volta abbiamo aperto con successo 2045 file. Come previsto, sono tre in meno rispetto al 2048 a causa dei descrittori di file utilizzati per STDIN
, STDOUT
e STDERR
.
Apportare modifiche permanenti
L’aumento del limite morbido influisce solo sulla shell corrente. Apri una nuova finestra del terminale e controlla il limite morbido. Vedrai che questa è la vecchia impostazione predefinita. Ma c’è un modo per impostare globalmente un nuovo valore predefinito per il numero massimo di file aperti che un processo può avere, che è costante e sopravvive al riavvio.
I consigli legacy spesso consigliano di modificare file come “/etc/sysctl.conf” e “/etc/security/limits.conf”. Tuttavia, nelle distribuzioni basate su systemd, queste modifiche non funzionano in modo coerente, soprattutto per le sessioni di accesso grafiche.
La tecnica mostrata qui è un modo per farlo su distribuzioni basate su systemd. Dobbiamo lavorare con due file. Il primo è il file “/etc/systemd/system.conf”. Avremo bisogno di usare sudo
.
sudo gedit /etc/systemd/system.conf
Trova la riga contenente la stringa “DefaultLimitNOFILE”. Rimuovi il segno di cancelletto “#” all’inizio della riga e cambia il primo numero in quello che vuoi che sia il tuo nuovo limite di processo. Abbiamo scelto 4096. Il secondo numero su questa riga è il limite rigido. Non lo abbiamo regolamentato.
Salva il file e chiudi l’editor.
Dobbiamo ripetere questa operazione con il file “/etc/systemd/user.conf”.
sudo gedit /etc/systemd/user.conf
Apportare le stesse modifiche alla riga contenente la stringa “DefaultLimitNOFILE”.
Salva il file e chiudi l’editor. È necessario riavviare il computer o utilizzare systemctl
il comando con un daemon-reexec
parametro per systemd
farlo funzionare di nuovo e accettare le nuove impostazioni.
sudo systemctl daemon-reexec
Aprendo una finestra di terminale e controllando il nuovo limite dovrebbe mostrare il nuovo valore che hai impostato. Nel nostro caso erano 4096.
ulimit -n
Possiamo verificare se questo è un valore attivo e funzionante eseguendo nuovamente il nostro programma avido di file.
./open-Files
Il programma non può aprire il file numero 4094, ovvero sono stati aperti 4093 file. Questo è il nostro valore atteso, 3 in meno di 4096.
Tutto è un file
Questo è il motivo per cui Linux è così dipendente dai descrittori di file. Ora, se inizi a esaurirli, sai come aumentare la tua quota.
Lascia un commento