Czym różnią się ulimit -n i / proc / sys / fs / file-max?

32

Zauważam, że na nowym obrazie CentOS, który właśnie uruchomiłem z EC2, domyślną wartością ulimit są 1024 otwarte pliki, ale / proc / sys / fs / file-max jest ustawiony na 761,408 i zastanawiam się, jak działają te dwie limity razem. Zgaduję, że ulimit -n jest limitem liczby deskryptorów plików na użytkownika, podczas gdy / proc / sys / fs / file-max jest ogólnosystemowy? Jeśli tak jest, powiedzmy, że zalogowałem się dwukrotnie jako ten sam użytkownik - czy każdy zalogowany użytkownik ma limit 1024 otwartych plików, czy jest to limit 1024 otwartych plików między każdym z tych zalogowanych? w użytkownikach?

Czy ma duży wpływ na wydajność ustawienie maksymalnej liczby deskryptorów plików, jeśli system nigdy nie otwiera bardzo wielu plików?

bantyczny
źródło
Dodano tagi: zasoby systemowe jądra bash linux
Warner

Odpowiedzi:

28

file-maxto maksymalna liczba deskryptorów plików (FD) wymuszona na poziomie jądra, której nie można przekroczyć przez wszystkie procesy bez zwiększenia. ulimitJest wykonywane na poziomie procesu, który może być mniejsza niż file-max.

Zwiększenie nie powoduje ryzyka wpływu na wydajność file-max. We współczesnych dystrybucjach maksymalny FD ustawiony jest dość wysoko, podczas gdy w przeszłości wymagał on ponownej kompilacji i modyfikacji jądra, aby zwiększyć go powyżej 1024. Nie zwiększyłbym całego systemu, chyba że będzie taka potrzeba techniczna.

Konfiguracja poszczególnych procesów często wymaga dostrojenia do obsługi konkretnego demona, czy to bazy danych, czy serwera WWW. Jeśli całkowicie usuniesz limit, demon może potencjalnie wyczerpać wszystkie dostępne zasoby systemowe; co oznacza, że ​​nie będziesz w stanie rozwiązać problemu, chyba że naciśniesz przycisk resetowania lub wyłączanie zasilania. Oczywiście jedno z nich może spowodować uszkodzenie otwartych plików.

Warner
źródło
Czy rozumiem, że limity na użytkownika ustawione przy użyciu ulimit są takie same dla wszystkich użytkowników? Czy istnieje sposób użycia różnych wartości dla użytkownika, czy nie?
Oliver
Tak, ustawienia można ustawić zarówno globalnie, jak i dla poszczególnych użytkowników.
Warner
Jeśli otrzymam prawidłowy post, nie jest to prawdą. Jest procesem spawnowanym przez użytkownika xy i jest to ograniczone przez maksimum systemu plików zdefiniowane w /etc/sysctl.conf
Jeredepp
3
ulimitGranica nie jest dla każdego użytkownika, ale na proces! Zobacz unix.stackexchange.com/questions/55319/…
Tonin
@ Tonin - Tak, ta odpowiedź jest po prostu błędna.
Nemo
11

Ograniczenie ulimit dotyczy jednego unikalnego użytkownika. Zatem użytkownik 1, bez względu na to, ile razy się zalogował lub uruchomionych procesów, byłby ograniczony do 1024. Jest to połączone.

Nie jestem pewien, czy całkowicie rozumiem znaczenie tego zdania (angielski nie jest moim językiem ojczystym) Jeśli to zdanie oznacza, że ​​konfiguracja ulimit dla deskryptorów plików nie jest ograniczeniem dla poszczególnych procesów, zaakceptowana odpowiedź (AFAIK) jest błędna.

Mam na myśli to, że jeśli jakiś użytkownik uruchomił 4 procesy, a konfiguracja ulimit dla FD wynosi 1024, każdy proces może otworzyć 1024 FD. Użytkownik nie będzie ograniczony do 1024 FD, ale procesy uruchomione przez tego użytkownika.

Na przykład:

me@superme:~$ ulimit -n
1024
me@superme:~$ lsof | grep $USER | wc -l
8145

Oto przykład perla, w którym osiągamy limit (jest to limit na proces):

#!/usr/bin/perl

$count = 0;
@filedescriptors;

while ($count <= 1024) {
    $FILE = ${count};
    open $FILE, ">", "/tmp/example$count" or die "\n\n FDs: $count $!";
    push(@filedescriptors, $FILE);
    $count ++;
}

Wynik:

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

1021, ponieważ były 3 otwarte deskryptory plików przed osiągnięciem pętli while (stdout, stdin i stderr)

Przepraszam, jeśli całkowicie się mylę lub źle zrozumiałem odpowiedź.

Gooseman
źródło
Masz rację. @ Odpowiedź Warnera jest w tym sensie błędna, ponieważ limit dotyczy bazy na proces, a nie na użytkownika
filipenf