Увеличение ограничения FD, тогда SSH не работает?
Я использую 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 ответа
Наконец, я нашел способ преодолеть ограничение 2^20 без изменения исходного кода ядра:
В /etc/sysctl.conf
:
fs.nr_open = 10485760
изменять fs.nr_open
более 2^20 может решить эту проблему.
Более того, предел 2^20 - это не конец света. Я знаю одного человека, который успешно построил сервер CentOS очень близко к этому пределу, его запись 1025216
теперь. Если он использует более высокий mem с правильной конфигурацией, он, несомненно, сможет легко преодолеть это ограничение.
Вот что он сделал (написано на китайском, но вы можете увидеть его конфигурацию):
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
2^20 (приблизительно один миллион) - максимальный предел дескриптора файла (NR_OPEN
) это поддерживается в Linux. Чтобы поднять его, потребуется много изменений, включая перекомпиляцию ядра. Это также сломало бы множество приложений пользовательского пространства, которые полагаются на низкий лимит.
Я подозреваю, что вы полностью лаете не на то дерево. Нет корреляции между частотой запросов и количеством необходимых файловых дескрипторов.