Увеличить Max Open File Limit

Thank you for reading this post, don't forget to subscribe!

«Too many open files»(Слишком мно­го откры­тых фай­лов) на сер­ве­ре с высо­кой нагруз­кой. Это озна­ча­ет, что сер­вер исчер­пы­ва­ет  ресурс на мак­си­маль­ный пре­дел откры­тых фай­лов (max open file limit).

Увеличить Max Open File Limit в Linux

Для нача­ла про­ве­рим какой пре­дел уста­нов­лен в ОС:

# cat /proc/sys/fs/file-max
Уве­ли­чи­ва­ем дан­ный пре­дел  в Linux

Мы можем уве­ли­чить лими­ты для откры­тых файлов:

  • Вре­мен­но.
  • Посто­ян­но.

==ВРЕМЕННО==

Если есть необ­хо­ди­мость уве­ли­чить лимит вре­мен­но (для тести­ро­ва­ния, напри­мер), то мож­но это сде­лать так:

# sysctl -w fs.file-max=500000

Или:
# echo "500000" > /proc/sys/fs/file-max
Вот еще один пример:
# ulimit -n 65635
==ПОСТОЯННО==

Если есть необ­хо­ди­мость уве­ли­чить лимит навсе­гда, то  мож­но это сде­лать так:

# vim /etc/sysctl.conf
[]
fs.file-max = 500000
[]
Эти настрой­ки будут сохра­нять­ся даже после пере­за­груз­ки систе­мы. После добав­ле­ния кон­фи­гу­ра­ции в файл, выпол­ни­те сле­ду­ю­щую коман­ду, что­бы изме­не­ния всту­пи­ли в силу:
# sysctl -p
Настрой­ка лими­тов для каж­до­го пользователя
# vim /etc/security/limits.conf
Добав­ля­ем параметры:
* hard nofile 500000
* soft nofile 500000
root hard nofile 500000
root soft nofile 500000
Про­вер­ка уста­нов­лен­ных лимитов

Исполь­зуй­те сле­ду­ю­щую коман­ду, что­бы уви­деть мак­си­маль­ное чисто для откры­тых файлов:
# cat /proc/sys/fs/file-max

Под­клю­ча­ем­ся от поль­зо­ва­те­ля (у меня это nginx):
# su nginx
Про­ве­ря­ем пара­мет­ры Hard лими­тов:
# ulimit -Hn
В кон­со­ле, мож­но вве­сти дан­ную коман­ду (очень удоб­но отображает):
#·for pid in `pidof nginx`; do echo "$(< /proc/$pid/cmdline)"; egrep 'files|Limit' /proc/$pid/limits; echo "Currently open files: $(ls -1 /proc/$pid/fd | wc -l)"; echo; done
Про­ве­ря­ем пара­мет­ры лими­тов Soft:
# ulimit -Sn

Увеличюем nginx worker_rlimit_nofile  в nginx ( на уровне Nginx)

В nginx так­же мож­но уве­ли­чить лими­ты с дирек­ти­вой worker_rlimit_nofile, кото­рая поз­во­ля­ет уве­ли­чить этот лимит, если это не хва­та­ет дан­но­го ресур­са на лету на уровне процесса:

# vim /etc/nginx/nginx.conf
И про­пи­сы­ва­ем (редак­ти­ру­ем):
# set open fd limit to 30000
worker_rlimit_nofile 30000;
После чего, про­ве­ря­ем кон­фи­гу­ра­цию nginx и пере­за­пус­ка­ем его:

Save and close the file. Reload nginx web server, enter:

# nginx -t &&·service·nginx -s reload

Включение ограничений на основе PAM в Unix/Lixux

Редак­ти­ру­ем файл

# vim /etc/pam.d/login
Встав­ля­ем:
session · ·required · pam_limits.so
Откры­ва­ем еще один файл:
# vim·/etc/security/limits.conf

Про­пи­сы­ва­ем лимиты:
* soft nofile 65536

* hard nofile 200000

Откры­ва­ем:
# vim·/etc/ssh/sshd_config
И, при­во­дим к виду:
UseLogin yes

И выпол­ня­ем рестарт:
# reboot