Проблема множества одновременных соединений (С10K Problem)
Linux 2.6
Как известно, по умолчанию tcp/ip в Linux 2.6 настроен на довольно высокую пропускную нагрузку.
Если предельное количество соединений для службы устанавливаться в раёне одной тысячи, а ресурсов системы более чем предостаточно поискать причину можно вот в какой месте:
Рассмотрим конкретный пример.
Служба состоит из двух частей front-end и back-end
Front часть устанавливает соединение в любом случае, но после приблизительно 1000 активных подключений соединения эти не доходят до back части.
Дело всё в том, что по tcp обещаться только front-end, а связка front-back работала на UNIX сокетах. Причём каждое подключение порождает открытие дополнительного UNIX сокета.
Кто знаком с UNIX сокетами знает, что каждый такой сокет требует создание отдельного дискриптора файла. А в linux есть явное ограничение открытых файлов для процесса. По умолчанию это 1024.
Проверить можно так:
# количество открытых Unix сокетов для демона back
$ netstat -ux -p|grep back|wc -l
# количество открытых Unix сокетов в системе
$ netstat -ux -p|wc -l
# количество открытых tpc сокетов для демона front
$ netstat -tnp|grep front|wc -l
# количество открытых tpc сокетов в системе
$ netstat -tnp|wc -l
Везде нужны права root
Снять ограничение можно здесь:
/etc/security/limits.conf
demonusername soft nofile 2048
demonusername hard nofile 2048
- demonusername - имя пользователя с правами которого запускаться демон, использующий Unix сокеты. Можно устанавливать огриначение для группы (@demonusername) или для всех (*)
- Параметры soft и hard используються для установки мягкого и жесткого лимита соответственно. soft может быть изменен в самой программе. hard может быть изменен только суперпользователем.
ВНИМАНИЕ! Необходима установка и soft и hard ограничения. - 2048 – собственно ограничение.
Не изменяйте лимит для всей системы и не выставляйте слишком большого числа. Все эти лимиты введены не просто так. В случае взлома, атаки или просто сбоя это может привести к негативным результатам – например потере контроля за машиной.
Далее необходим ребут, чтобы преинициализировать ядро.
Ссылки на полезные статьи:
http://www.kegel.com/c10k.html