Naprawiamy błąd „Zbyt wiele otwartych plików” w systemie Linux

Bardzo często mogą wystąpić błędy podczas pracy na mocno obciążonych serwerach Linux ”za dużo otwartych plikóws ". Oznacza to, że program otworzył zbyt wiele plików (odczyt deskryptorów plików) i nie może otworzyć nowych. W systemie Linux ograniczenia„ maksymalnego limitu otwartych plików ”są domyślnie ustawione dla każdego procesu i użytkownika i nie są zbyt wysokie.

W tym artykule przyjrzymy się, jak sprawdzić obecne ograniczenia liczby otwartych plików, jak zmienić to ustawienie dla całego serwera, poszczególnych usług i sesji..

Treść

  • Błąd: zbyt wiele otwartych plików i ograniczenie liczby otwartych plików w systemie Linux
  • Ustawienia limitów dla ograniczeń liczby jednocześnie otwartych plików w systemie Linux
  • Zwiększ limit otwartych deskryptorów plików dla pojedynczej usługi
  • Zwiększenie maksymalnej liczby otwartych plików dla Nginx i Apache
  • Maksymalne limity plików dla bieżącej sesji

Błąd: zbyt wiele otwartych plików i ograniczenie liczby otwartych plików w systemie Linux

Najpierw zastanówmy się, gdzie możemy zaobserwować błąd „zbyt wielu otwartych plików”. Najczęściej ten błąd występuje na serwerach z zainstalowanymi serwerami WWW NGINX / httpd, serwerem bazy danych (MySQL / MariaDB / PostgreSQL), podczas odczytywania dużej liczby dzienników. Na przykład, gdy serwer WWW Nginx nie ma wystarczającego limitu do otwierania plików, pojawi się błąd:

gniazdo () nie powiodło się (24: zbyt wiele otwartych plików) podczas łączenia z nadrzędnym

Maksymalną liczbę deskryptorów plików, które można otworzyć w systemie, można znaleźć w następujący sposób:

# cat / proc / sys / fs / file-max

Limit liczby otwartych plików dla bieżącego użytkownika wynosi 1024. Możesz to sprawdzić:

# ulimit -n

Istnieją dwa rodzaje ograniczeń: Trudne i Miękkie. Użytkownik może zmienić limit miękkiego limitu (ale wartość miękka nie może przekroczyć twardego). Twarde ograniczenie można zmienić tylko jako użytkownik uprzywilejowany.

Aby wyświetlić ograniczenie miękkie, wykonaj:

# ulimit -nS

Aby wyprowadzić ograniczenie twarde:

# ulimit -nH

Ustawienia limitów dla ograniczeń liczby jednocześnie otwartych plików w systemie Linux

Aby umożliwić wszystkim usługom otwieranie większej liczby plików, możesz zmienić limity na poziomie całego systemu operacyjnego Linux. Aby nowe ustawienia działały stale i nie były resetowane po ponownym uruchomieniu serwera lub sesji, musisz naprawić plik /etc/security/limits.conf. Dodaj linie:

* twardy nofile 97816 * miękki nofile 97816

Jeśli używasz Ubuntu, musisz napisać wiersz:

wymagana sesja pam_limits.so

Ten parametr dodaje możliwość ładowania ograniczeń podczas autoryzacji użytkownika..

Po zmianach uruchom ponownie terminal i sprawdź wartość graniczną max_open_files:

[root @ server ~] # ulimit -n

97816

Zwiększ limit otwartych deskryptorów plików dla pojedynczej usługi

Możesz zmienić limit liczby otwartych deskryptorów plików dla konkretnej usługi, a nie dla całego systemu. Rozważ apache jako przykład. Aby zmienić wartości, otwórz ustawienia usługi poprzez systemctl: # systemctl edit httpd.service Dodaj niezbędne limity, na przykład:

[Usługa] LimitNOFILE = 16000 LimitNOFILESoft = 16000

Po zmianie musisz zaktualizować konfigurację usługi i zrestartować ją:

# systemctl daemon-reload
# systemctl uruchom ponownie httpd.service

Aby sprawdzić, czy wartości się zmieniły, musisz uzyskać PID usługi:

# systemctl status httpd.service

Na przykład zdefiniowano usługę PID 32724:

# cat / proc / 32724 / limit | grep „Maksymalna liczba otwartych plików”

Zmieniłeś więc wartości Maks. Liczby otwartych plików dla określonej usługi.

Zwiększenie maksymalnej liczby otwartych plików dla Nginx i Apache

Jeśli zmienisz limit liczby otwartych plików dla serwera WWW, musisz również poprawić plik konfiguracji usługi. Na przykład dla Nginx w pliku konfiguracyjnym /etc/nginx/nginx.conf, trzeba zarejestrować / zmienić wartość w dyrektywie:

worker_rlimit_nofile 16000
Podczas konfigurowania Nginx na mocno obciążonym 8-rdzeniowym serwerze z pracownikami_połączeń 8192, podaj 8192 * 2 * 8 (vCPU) = 131072 w pliku_profilu_rlimit.

Następnie uruchom ponownie Nginx.

W przypadku apache musisz utworzyć katalog:

# mkdir /lib/systemd/system/httpd.service.d/

Następnie utwórz plik limit_nofile.conf:

# nano /lib/systemd/system/httpd.service.d/limit_nofile.conf

I dodaj do tego:

[Usługa] LimitNOFILE = 16000

Pamiętaj, aby ponownie uruchomić usługę httpd.

Maksymalne limity plików dla bieżącej sesji

Aby zmienić limity otwartych plików w sesji terminala, uruchom polecenie:

# ulimit -n 3000

Podczas zamykania terminala i tworzenia nowej sesji limity wracają do wartości początkowych określonych w pliku /etc/security/limits.conf.

Aby zmienić ogólną wartość w systemie / proc / sys / fs / file-max, zmień wartość fs.file-max w /etc/sysctl.conf:

fs.file-max = 100000

I zastosuj:

# sysctl -p

W tym artykule wymyśliliśmy, jak rozwiązać problem z niewystarczającym limitem dla otwartych deskryptorów plików w Linuksie i przeanalizowaliśmy kilka opcji zmiany limitów na serwerze.