W tej chwili wiem, jak:
- znajdź limit otwartych plików na proces:
ulimit -n
- policz wszystkie otwarte pliki według wszystkich procesów:
lsof | wc -l
- uzyskaj maksymalną dozwoloną liczbę otwartych plików:
cat /proc/sys/fs/file-max
Moje pytanie brzmi: dlaczego istnieje limit otwartych plików w systemie Linux?
open-files
limit
Xanpeng
źródło
źródło
Odpowiedzi:
Powodem jest to, że system operacyjny potrzebuje pamięci do zarządzania każdym otwartym plikiem, a pamięć jest ograniczonym zasobem - szczególnie w systemach osadzonych.
Jako użytkownik root możesz zmienić maksymalną liczbę otwartych plików na proces (przez
ulimit -n
) i na system (npecho 800000 > /proc/sys/fs/file-max
.).źródło
/.../file-max
z dość dużą wartością, dopóki pamięć nie zostanie zużyta?file-max
wydaje się, że rozmiar pamięci RAM jest podzielony przez 10k. Ponieważ rzeczywista pamięć używana na moduł obsługi plików powinna być znacznie mniejsza (rozmiarstruct file
plus część pamięci zależnej od sterownika), wydaje się to dość konserwatywnym ograniczeniem.Należy pamiętać, że
lsof | wc -l
podsumowuje wiele zduplikowanych wpisów (rozwidlone procesy mogą współużytkować uchwyty plików itp.). Liczba ta może być znacznie wyższa niż ustawiony limit/proc/sys/fs/file-max
.Aby uzyskać bieżącą liczbę otwartych plików z punktu widzenia jądra Linux, wykonaj następujące czynności:
cat /proc/sys/fs/file-nr
Przykład: na tym serwerze jest 40096 spośród maksymalnie 65536 otwartych plików, chociaż lsof zgłasza znacznie większą liczbę:
źródło
lsof
zgłosi wiele plików dwa razy lub więcej, na przykład/dev/null
możesz spróbować zgadnąć z:lsof|awk '{print $9}'|sort|uniq|wc -l
lsof|awk '!a[$NF]++{c++}END{print c}'
aby uzyskać nieuplikowaną liczbę otwartych plików.Myślę, że dzieje się tak głównie z przyczyn historycznych.
Deskryptor pliku Unix jest mała
int
wartość zwracana przez funkcje jakopen
icreat
, i przeszedł doread
,write
,close
i tak dalej.Przynajmniej we wczesnych wersjach Uniksa deskryptor pliku był po prostu indeksem struktury tablic struktur o stałym rozmiarze na proces, w których każda struktura zawiera informacje o otwartym pliku. Jeśli dobrze pamiętam, niektóre wczesne systemy ograniczały rozmiar tej tabeli do około 20.
Bardziej nowoczesne systemy mają wyższe limity, ale zachowały ten sam ogólny schemat, w dużej mierze poza bezwładnością.
źródło
fileno
ifdopen
funkcje będę oczekiwać ich być prawie zamiennie.int
deskryptora czyFILE*
. Jeśli otworzysz więcej niż 20 plików za pośrednictwemopen()
, niefdopen()
powiedzie się?