Ние поправяме грешката „Твърде много отворени файлове“ в Linux

Много често могат да възникнат грешки при работа на силно заредени Linux сървъри „твърде много отворен файлs ". Това означава, че програмата е отворила твърде много файлове (четене на дескриптори на файлове) и не може да отваря нови. В Linux ограниченията за" максимален отворен файл "са зададени по подразбиране за всеки процес и потребител и те не са твърде високи.

В тази статия ще разгледаме как да проверим текущите ограничения за броя на отворените файлове, как да променим тази настройка за целия сървър, за отделните услуги и за сесията.

Съдържание:

  • Грешка: Твърде много отворени файлове и ограничения за броя на отворените файлове в Linux
  • Ограничете настройките за ограничения на броя едновременно отворени файлове в Linux
  • Увеличете лимита на отворени дескриптори на файлове за една услуга
  • Увеличаване на максималния брой отворени файлове за Nginx и Apache
  • Ограничения за максимален размер на файла за текущата сесия

Грешка: Твърде много отворени файлове и ограничения за броя на отворените файлове в Linux

Първо, нека да разберем къде можем да наблюдаваме грешката „твърде много отворени файлове“. Най-често тази грешка се появява на сървъри с инсталирани NGINX / httpd уеб сървъри, сървър на база данни (MySQL / MariaDB / PostgreSQL), при четене на голям брой журнали. Например, когато уеб сървърът Nginx няма достатъчно ограничение за отваряне на файлове, ще получите грешка:

socket () не успя (24: Твърде много отворени файлове), докато се свързвате с upstream

Максималният брой дескриптори на файлове, които могат да бъдат отворени във вашата система, можете да намерите, както следва:

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

Ограничението за броя на отворените файлове за текущия потребител е 1024. Можете да проверите това:

# ulimit -n

Има два вида ограничения: трудно и мек. Потребителят може да промени ограничението за мекия лимит (но меката стойност не може да надвишава силно). Твърдото ограничение може да бъде променено само като привилегирован потребител.

За да покажете Soft-ограничение, изпълнете:

# ulimit -nS

За да изведете твърдо ограничение:

# ulimit -nH

Ограничете настройките за ограничения на броя едновременно отворени файлове в Linux

За да позволите на всички услуги да отварят повече файлове, можете да промените ограниченията на нивото на цялата Linux операционна система. За да работят новите настройки постоянно и да не се нулират при рестартиране на сървъра или сесията, /etc/security/limits.conf файлът трябва да бъде коригиран. Добавяне на редове:

* твърд nofile 97816 * soft nofile 97816

Ако използвате Ubuntu, трябва да напишете реда:

сесия изисква pam_limits.so

Този параметър добавя възможност за зареждане на ограничения по време на разрешение от потребителя..

След промените рестартирайте терминала и проверете граничната стойност max_open_files:

[root @ server ~] # ulimit -n

97816

Увеличете лимита на отворени дескриптори на файлове за една услуга

Можете да промените ограничението за броя на отворените дескриптори на файлове за определена услуга, а не за цялата система. Разгледайте апаш като пример. За да промените стойностите, отворете настройките на услугата чрез systemctl: # systemctl редактиране на httpd.service Добавете необходимите ограничения, например:

[Услуга] LimitNOFILE = 16000 LimitNOFILESoft = 16000

След промяната трябва да актуализирате конфигурацията на услугата и да я рестартирате:

# systemctl презареждане на демон
# systemctl рестартирайте httpd.service

За да проверите дали стойностите са се променили, трябва да получите услугата PID:

# systemctl статус httpd.service

Например, дефинирахте услугата PID 32724:

# cat / proc / 32724 / граници | grep "Макс. отворени файлове"

Така че променихте стойностите на Max open файлове за определена услуга.

Увеличаване на максималния брой отворени файлове за Nginx и Apache

Ако промените ограничението за броя на отворените файлове за уеб сървър, трябва също да коригирате конфигурационния файл на услугата. Например за Nginx в конфигурационния файл /etc/nginx/nginx.conf, трябва да регистрирате / промените стойността в директивата:

работник_рлимит_нофил 16000
Когато конфигурирате Nginx на силно натоварен 8-ядрен сървър с работни връзки 8192, посочете 8192 * 2 * 8 (vCPU) = 131072 в Working_rlimit_nofile.

След това рестартирайте Nginx.

За apache трябва да създадете директория:

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

След това създайте файла limit_nofile.conf:

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

И добавете към него:

[Услуга] LimitNOFILE = 16000

Не забравяйте да рестартирате httpd услугата.

Ограничения за максимален размер на файла за текущата сесия

За да промените ограниченията за отворени файлове в рамките на сесията на вашия терминал, изпълнете командата:

# ulimit -n 3000

Когато затваряте терминала и създавате нова сесия, ограниченията се връщат към първоначалните стойности, посочени във файла /etc/security/limits.conf.

За промяна на общата стойност в системата / proc / sys / fs / file-max, променете стойността на fs.file-max в /etc/sysctl.conf:

fs.file-max = 100000

И кандидатствайте:

# sysctl -p

В тази статия разбрахме как да разрешим проблема с недостатъчен лимит за дескриптори на отворени файлове в Linux и разгледахме няколко опции за промяна на сървърните лимити.