Назад | Перейти на главную страницу

Увеличить ограничение 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 ^ 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