Cum diferă ulimit -n și /proc/sys/fs/file-max? (Administrarea sistemului, Linux, Bash, Kernel, Ulimit)

bantic a intrebat.

Am observat că pe o nouă imagine CentOS pe care tocmai am pornit-o de pe EC2 că valoarea implicită ulimit este de 1024 de fișiere deschise, dar /proc/sys/fs/file-max este setat la 761.408 și mă întreb cum funcționează aceste două limite împreună. Bănuiesc că ulimit -n este o limită per utilizator a numărului de descriptori de fișiere, în timp ce /proc/sys/fs/file-max este la nivelul întregului sistem? Dacă acesta este cazul, să spunem că m-am logat de două ori ca același utilizator – fiecare utilizator logat are o limită de 1024 de fișiere deschise sau este o limită de 1024 de fișiere deschise combinate între fiecare dintre acești utilizatori logați?

Și există un impact semnificativ asupra performanței dacă setați numărul maxim de descriptori de fișiere la un număr foarte mare, dacă sistemul dumneavoastră nu deschide niciodată foarte multe fișiere?

Comentarii

  • Etichete adăugate: bash linux kernel kernel system-resurse –  > Por Warner.
2 răspunsuri
Warner

file-max este numărul maxim de descriptori de fișiere (FD) impus la nivel de kernel, care nu poate fi depășit de toate procesele fără a crește. La ulimit este impus la nivel de proces, care poate fi mai mic decât file-max.

Nu există niciun risc de impact asupra performanței prin creșterea file-max. În distribuțiile moderne, valoarea maximă a FD este destul de ridicată, în timp ce în trecut era necesară o recompilare și o modificare a kernelului pentru a depăși 1024. Eu nu aș crește la nivelul întregului sistem decât dacă aveți o nevoie tehnică.

Configurația per proces trebuie adesea ajustată pentru a servi un anumit demon, fie că este vorba de o bază de date sau de un server web. Dacă eliminați complet limita, acel demon ar putea epuiza toate resursele disponibile ale sistemului, ceea ce înseamnă că nu veți putea remedia problema decât apăsând butonul de resetare sau prin întreruperea alimentării. Bineînțeles, oricare dintre acestea ar putea duce la coruperea fișierelor deschise.

Comentarii

  • Am înțeles corect că limitele per utilizator stabilite cu ajutorul ulimit sunt aceleași pentru toți utilizatorii? Există o modalitate de a utiliza valori diferite pentru fiecare utilizator sau nu? –  > Por Oliver.
  • Da, setările pot fi setate atât la nivel global, cât și pe fiecare utilizator în parte. –  > Por Warner.
  • Dacă am înțeles bine mesajul dvs., acest lucru nu este adevărat. Este pentru fiecare proces generat de utilizatorul xy, iar acesta este limitat de valoarea maximă a sistemului de fișiere definită în /etc/sysctl.conf –  > Por Jeredepp.
  • Site-ul ulimit limită nu este pe utilizator, ci pe proces! Vezi unix.stackexchange.com/questions/55319/… –  > Por Tonin.
  • @Tonin – Da, acest răspuns este pur și simplu greșit. –  > Por Nemo.
Gooseman

Limitarea lui ulimit este pe utilizator unic. Deci, user1, indiferent de câte ori s-a logat sau de câte procese rulează, ar fi limitat la 1024. Este combinat.

Nu sunt sigur că înțeleg complet sensul acestei propoziții (engleza nu este limba mea maternă) Dacă această propoziție înseamnă că configurația ulimit pentru descriptorii de fișiere nu este o limitare per proces, răspunsul acceptat (AFAIK) este greșit.

Ceea ce vreau să spun este că, dacă un utilizator a lansat 4 procese, iar configurația ulimit pentru FD-uri este de 1024, fiecare proces poate deschide 1024 de FD-uri. Nu utilizatorul va fi limitat la 1024 FD-uri, ci procesele care sunt lansate de acel utilizator.

De exemplu:

[email protected]:~$ ulimit -n
1024
[email protected]:~$ lsof | grep $USER | wc -l
8145

Iată un exemplu perl în care atingem limita (este o limită per proces):

#!/usr/bin/perl

$count = 0;
@filedescriptors;

while ($count <= 1024) {
    $FILE = ${count};
    open $FILE, ">", "/tmp/example$count" or die "

 FDs: $count $!";
    push(@filedescriptors, $FILE);
    $count ++;
}

Rezultat:

FDs: 1021 Too many open files at ./test.pl line 8.

1021 deoarece au existat 3 descriptori de fișiere deschise înainte de a ajunge la bucla while (stdout, stdin și stderr).

Îmi pare rău dacă greșesc complet sau dacă am înțeles greșit răspunsul.

Comentarii

  • Așadar, aveți dreptate. Răspunsul lui @Warner este greșit în acest sens, deoarece limita este pe bază de per-proces și nu per-utilizator –  > Por filipenf.
  • Doar pentru a menționa: lsof raportează nu numai Descriptorii de fișiere, ci și fișierele deschise. Merită să citiți acest articol: thegeekdiary.com/… –  > Por ivanleoncz.