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 16000Podczas 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.