Я использую CentOS 6.3 64bit, и у меня проблемы с увеличением ограничения FD: SSH не работает после изменения ограничения, каждый раз, когда я входил на свой сервер, после ввода пароля, затем «соединение закрыто удаленным сервером».
Это удаленный сервер без какого-либо «режима восстановления», поэтому нет возможности выполнить локальный вход, чтобы получить журнал ошибок. Я также пробовал ulimit -SHn до того, как возникла эта проблема, но также не работал.
Теперь мне приходится восстанавливать снимок каждый раз, когда возникает эта проблема, и я до сих пор не понимаю, что не так с моим сервером.
Поскольку я работаю над высокопроизводительным сервером, обрабатывающим миллионы запросов в секунду, мне нужно очень высокое ограничение FD, вот моя конфигурация:
/etc/security/limits.conf
* hard nofile 2000000
* soft nofile 2000000
/etc/security/limits.d/90-nproc.conf
* soft nproc 1024
/etc/ssh/sshd_config
Protocol 2
SyslogFacility AUTHPRIV
PasswordAuthentication yes
ChallengeResponseAuthentication no
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes
UsePAM yes
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
X11Forwarding yes
Subsystem sftp /usr/libexec/openssh/sftp-server
/etc/pam.d/sshd
auth required pam_sepermit.so
auth include password-auth
account required pam_nologin.so
account include password-auth
password include password-auth
session required pam_selinux.so close
session required pam_loginuid.so
session required pam_selinux.so open env_params
session optional pam_keyinit.so force revoke
session include password-auth
session required pam_limits.so
/etc/sysctl.conf
fs.file-max = 2000000
fs.nr_open = 2000000
2 ^ 20 (приблизительно один миллион) - максимальный предел дескриптора файла (NR_OPEN
), который поддерживается в Linux. Чтобы поднять его, потребуется много изменений, включая перекомпиляцию ядра. Это также нарушит работу многих приложений пользовательского пространства, которые полагаются на низкий лимит.
Но я подозреваю, что ты лаешь не на то дерево. Нет корреляции между частотой запросов и количеством необходимых файловых дескрипторов.
Наконец, я нашел способ преодолеть ограничение 2 ^ 20 без изменения исходного кода ядра:
В /etc/sysctl.conf
:
fs.nr_open = 10485760
Изменить fs.nr_open
более 2 ^ 20 могут решить эту проблему.
Более того, ограничение в 2 ^ 20 - это еще не конец света. Я знаю одного человека, который успешно построил сервер CentOS, максимально приближенный к этому пределу, его рекорд 1025216
на данный момент. Если он будет использовать более высокую память при правильной настройке, без сомнения, он сможет легко преодолеть это ограничение.
Вот что он сделал (написано на китайском, но вы можете увидеть его конфигурацию):
http://www.blogjava.net/yongboy/archive/2013/04/09/397559.html http://www.blogjava.net/yongboy/archive/2013/04/11/397677.html http://www.blogjava.net/yongboy/archive/2013/04/10/397631.html http://www.blogjava.net/yongboy/archive/2013/04/09/397594.html