Cum să rezolvi eroarea „Prea multe fișiere deschise” pe Linux

Publicat: 2022-06-29
Laptop Linux afișează un prompt bash
fatmawati achmad zaenuri/Shutterstock.com

Pe computerele Linux, resursele de sistem sunt partajate între utilizatori. Încercați să utilizați mai mult decât cota echitabilă și veți atinge o limită superioară. De asemenea, puteți bloca alți utilizatori sau procese.

Resurse de sistem partajate

Printre alte milioane de locuri de muncă ale sale, nucleul unui computer Linux este mereu ocupat să urmărească cine folosește câte dintre resursele finite ale sistemului, cum ar fi RAM și cicluri CPU. Un sistem multi-utilizator necesită o atenție constantă pentru a se asigura că oamenii și procesele nu folosesc mai mult din orice resursă de sistem dată decât este adecvat.

Nu este corect, de exemplu, ca cineva să obțină atât de mult timp CPU încât computerul să se simtă lent pentru toți ceilalți. Chiar dacă ești singura persoană care folosește computerul tău Linux, există limite stabilite pentru resursele pe care procesele tale le pot folosi. La urma urmei, ești încă doar un alt utilizator.

Ce este RAM? Tot ce trebuie să știți
RELATE Ce este RAM? Tot ce trebuie să știți

Unele resurse de sistem sunt binecunoscute și evidente, cum ar fi RAM, ciclurile CPU și spațiul pe hard disk. Dar există multe, multe mai multe resurse care sunt monitorizate și pentru care fiecare utilizator – sau fiecare proces deținut de utilizator – are o limită superioară stabilită. Unul dintre acestea este numărul de fișiere pe care un proces le poate avea deschise simultan.

Dacă ați văzut vreodată mesajul de eroare „Prea multe fișiere deschise” într-o fereastră de terminal sau l-ați găsit în jurnalele de sistem, înseamnă că limita superioară a fost atinsă și procesului nu i se permite să mai deschidă fișiere.

Nu sunt doar fișierele pe care le-ați deschis

Există o limită la nivelul întregului sistem pentru numărul de fișiere deschise pe care Linux le poate gestiona. Este un număr foarte mare, după cum vom vedea, dar există încă o limită. Fiecare proces de utilizator are o alocare pe care o poate folosi. Fiecare primește o mică parte din totalul sistemului care le este alocat.

Ceea ce este de fapt alocat este un număr de handle de fișiere . Fiecare fișier care este deschis necesită un mâner. Chiar și cu alocări destul de generoase, la nivelul întregului sistem, mânerele fișierelor se pot epuiza mai repede decât v-ați putea imagina la început.

Ce înseamnă „Totul este un fișier” în Linux?
RELATE Ce înseamnă „Totul este un fișier” în Linux?

Linux retrage aproape totul, astfel încât să pară ca și cum ar fi un fișier. Uneori vor fi doar atât, simple fișiere vechi. Dar alte acțiuni, cum ar fi deschiderea unui director, folosesc și un handle de fișier. Linux folosește fișierele speciale bloc ca un fel de driver pentru dispozitivele hardware. Fișierele speciale cu caractere sunt foarte asemănătoare, dar sunt mai des folosite cu dispozitive care au un concept de debit, cum ar fi conductele și porturile seriale.

Fișierele speciale bloc gestionează blocuri de date la un moment dat, iar fișierele speciale cu caractere gestionează fiecare caracter separat. Ambele fișiere speciale pot fi accesate numai folosind mânere de fișiere. Bibliotecile utilizate de un program folosesc un handle de fișier, fluxurile folosesc handle de fișier, iar conexiunile de rețea folosesc handle de fișier.

Abstragerea tuturor acestor cerințe diferite, astfel încât să apară ca fișiere, simplifică interfața cu ele și permite ca elemente precum conductele și fluxurile să funcționeze.

Puteți vedea că în spatele scenei Linux deschide fișiere și folosește mânere de fișiere doar pentru a rula singur, indiferent de procesele dvs. de utilizator. Numărul de fișiere deschise nu este doar numărul de fișiere pe care le-ați deschis. Aproape totul în sistemul de operare folosește mânere de fișiere.

Limite de gestionare a fișierelor

Numărul maxim de mânere de fișiere la nivelul întregului sistem poate fi văzut cu această comandă.

 cat /proc/sys/fs/file-max 

Găsirea sistemului maxim pentru fișierele deschise

Aceasta returnează un număr ridicol de mare de 9,2 chintilioane. Acesta este sistemul teoretic maxim. Este cea mai mare valoare posibilă pe care o puteți păstra într-un număr întreg cu semn de 64 de biți. Dacă computerul tău sărac ar putea face față cu atâtea fișiere deschise simultan, este cu totul altă problemă.

La nivel de utilizator, nu există o valoare explicită pentru numărul maxim de fișiere deschise pe care le puteți avea. Dar o putem rezolva aproximativ. Pentru a afla numărul maxim de fișiere pe care unul dintre procesele dvs. le poate deschide, putem folosi comanda ulimit cu opțiunea -n (deschideți fișiere).

 ulimit -n 

Aflarea câte fișiere poate deschide un proces

Și pentru a găsi numărul maxim de procese pe care le poate avea un utilizator, vom folosi ulimit cu opțiunea -u (procese utilizator).

 ulimit -u 

Găsirea numărului de procese pe care le poate avea un utilizator

Înmulțind 1024 și 7640 ne dă 7.823.360. Desigur, multe dintre aceste procese vor fi deja utilizate de mediul dvs. desktop și de alte procese de fundal. Deci, acesta este un alt maxim teoretic și unul pe care nu îl vei atinge niciodată în mod realist.

Cifra importantă este numărul de fișiere pe care un proces le poate deschide. În mod implicit, acesta este 1024. Merită remarcat faptul că deschiderea aceluiași fișier de 1024 de ori simultan este același cu deschiderea a 1024 de fișiere diferite simultan. După ce ați epuizat toate mânerele fișierelor, ați terminat.

Este posibil să ajustați numărul de fișiere pe care un proces le poate deschide. Există de fapt două valori de luat în considerare atunci când ajustați acest număr. Una este valoarea la care este setată în prezent sau la care încercați să o setați. Aceasta se numește limită soft . Există și o limită rigidă , iar aceasta este cea mai mare valoare la care puteți ridica limita soft.

Modul de a gândi la acest lucru este că limita slabă este într-adevăr „valoarea curentă”, iar limita superioară este cea mai mare valoare pe care o poate atinge valoarea curentă. Un utilizator obișnuit, non-root, își poate ridica limita soft la orice valoare până la limita lor rigidă. Utilizatorul root își poate crește limita durată.

Pentru a vedea limitele actuale soft și hard, utilizați ulimit cu opțiunile -S (soft) și -H (hard) și opțiunea -n (deschideți fișiere).

 ulimit -Sn
 ulimit -Hn 

Găsirea limitei soft și hard pentru mânerele fișierelor de proces

Pentru a crea o situație în care putem vedea că limita soft este aplicată, am creat un program care deschide în mod repetat fișierele până când eșuează. Apoi așteaptă o apăsare a tastei înainte de a renunța la toate mânerele de fișier pe care le-a folosit. Programul se numește open-files .

 ./deschide-Fișiere 

Programul de fișiere deschise atinge limita soft de 1024

Deschide fișierele 1021 și eșuează când încearcă să deschidă fișierul 1022.

1024 minus 1021 este 3. Ce sa întâmplat cu celelalte trei handle de fișiere? Au fost utilizate pentru fluxurile STDIN , STDOUT și STDERR . Sunt create automat pentru fiecare proces. Acestea au întotdeauna valori de descriptor de fișiere de 0, 1 și 2.

LEGATE: Cum să utilizați comanda Linux lsof

Acestea le putem vedea folosind comanda lsof cu opțiunea -p (proces) și ID-ul de proces al programului open-files . La îndemână, își imprimă ID-ul de proces în fereastra terminalului.

 lsof -p 11038 

Fluxurile stdin, stdout și stderr și mânerele fișierelor din ieșirea comenzii lsof

Desigur, într-o situație reală, s-ar putea să nu știți care proces tocmai a înghițit toate mânerele fișierelor. Pentru a începe investigația, puteți folosi această secvență de comenzi piperate. Vă va spune cei cincisprezece cei mai prolifici utilizatori ai mânerelor de fișiere de pe computer.

 lsof | awk '{ print $1 " " $2; }' | sortare -rn | uniq -c | sortare -rn | cap -15 

Vederea proceselor care folosesc cele mai multe mânere de fișiere

Pentru a vedea mai multe sau mai puține intrări, ajustați parametrul -15 la comanda head . Odată ce ați identificat procesul, trebuie să vă dați seama dacă a devenit necinstit și deschide prea multe fișiere pentru că este scăpat de sub control sau dacă într-adevăr are nevoie de acele fișiere. Dacă are nevoie de ele, trebuie să creșteți limita de gestionare a fișierelor.

Creșterea limitei soft

Dacă creștem limita soft și rulăm programul din nou, ar trebui să vedem că deschide mai multe fișiere. Vom folosi comanda ulimit și opțiunea -n (fișiere deschise) cu o valoare numerică de 2048. Aceasta va fi noua limită soft.

 ulimit -n 2048 

Setarea unei noi limite soft pentru mâner de fișier pentru procese

De data aceasta am deschis cu succes 2045 de fișiere. După cum era de așteptat, acesta este cu trei mai puțin decât 2048, din cauza mânerelor de fișiere utilizate pentru STDIN , STDOUT și STDERR .

Efectuarea de schimbări permanente

Creșterea limitei soft afectează doar shell-ul curent. Deschideți o nouă fereastră de terminal și verificați limita soft. Veți vedea că este vechea valoare implicită. Dar există o modalitate de a seta la nivel global o nouă valoare implicită pentru numărul maxim de fișiere deschise pe care un proces le poate avea, care este persistentă și supraviețuiește repornirilor.

Sfaturile învechite vă recomandă adesea să editați fișiere precum „/etc/sysctl.conf” și „/etc/security/limits.conf”. Cu toate acestea, pe distribuțiile bazate pe systemd, aceste editări nu funcționează în mod constant, mai ales pentru sesiunile de conectare grafică.

Tehnica prezentată aici este modalitatea de a face acest lucru pe distribuțiile bazate pe systemd. Sunt două fișiere cu care trebuie să lucrăm. Primul este fișierul „/etc/systemd/system.conf”. Va trebui să folosim sudo .

 sudo gedit /etc/systemd/system.conf 

Editarea fișierului system.conf

Căutați linia care conține șirul „DefaultLimitNOFILE”. Eliminați simbolul „#” de la începutul liniei și editați primul număr la ceea ce doriți să fie noua limită soft pentru procese. Am ales 4096. Al doilea număr de pe acea linie este limita tare. Nu am ajustat asta.

Valoarea DefaultLimitNOFILE din fișierul system.conf

Salvați fișierul și închideți editorul.

Trebuie să repetăm ​​acea operație pe fișierul „/etc/systemd/user.conf”.

 sudo gedit /etc/systemd/user.conf 

Editarea fișierului user.conf

Efectuați aceleași ajustări la linia care conține șirul „DefaultLimitNOFILE”.

Valoarea DefaultLimitNOFILE din fișierul user.conf

Salvați fișierul și închideți editorul. Trebuie fie să reporniți computerul, fie să utilizați comanda systemctl cu opțiunea daemon-reexec , astfel încât systemd să fie re-executat și să ingereze noile setări.

 sudo systemctl daemon-reexec 

Se repornește systemd

Deschiderea unei ferestre de terminal și verificarea noii limite ar trebui să arate noua valoare pe care o setați. În cazul nostru, a fost 4096.

 ulimit -n 

Verificarea noii limite soft cu ulimit -n

Putem testa că aceasta este o valoare activă, operațională, reluând programul nostru lacom de fișiere.

 ./deschide-Fișiere 

Verificarea noii limite soft cu programul open-files

Programul nu reușește să deschidă fișierul cu numărul 4094, adică 4093 au fost fișiere deschise. Aceasta este valoarea noastră așteptată, cu 3 mai puțin decât 4096.

Totul este un Fișier

De aceea, Linux este atât de dependent de mânerele fișierelor. Acum, dacă începi să rămâi fără ele, știi cum să-ți crești cota.

RELATE: Ce sunt stdin, stdout și stderr pe Linux?