Проблема множества одновременных соединений (С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