Много често могат да възникнат грешки при работа на силно заредени 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 и разгледахме няколко опции за промяна на сървърните лимити.