Я пытался создать простую программу на разных языках (C #, Java, C ++, PHP) для подключения к серверу, и все вели себя одинаково. Поэтому я считаю, что эта проблема скорее относится к уровню ОС.
По сути, я хочу, чтобы программа подключилась к серверу через сокет TCP, отправила 1 байт и затем закрыла сокет. Это необходимо делать тысячи раз в секунду и поддерживать в течение определенного периода времени. Это для целей сравнительного анализа сервера.
Пока что после нескольких тысяч клиентских сокетов система полностью останавливается. Он может начать создавать сокеты только через минуту или около того, чтобы остыть. Я удостоверился, что закрыл каждое гнездо после передачи.
Теперь эта проблема знакома с серверами, такими как Apache, где утилиты (например, ab / siege) рекомендуют тестировать Apache с использованием протокола keep-alive. Т.е. создать небольшое количество TCP-соединений, но сделать несколько запросов через них для целей тестирования. Однако в нашем случае это невозможно, поскольку наш собственный сервер не обслуживает HTTP и не поддерживает модель поддержки активности HTTP 1.1.
Так как же этого достичь? Я проверил следующие ограничения
ulimit
установлен на очень большое число
TCP TIME_WAIT
устраняется установкой /proc/sys/net/ipv4/tcp_rw_recycle
и /proc/sys/net/ipv4/tcp_rw_reuse
на 1. (Я действительно подтвердил с netstat
нет TIME_WAIT
сокетов)
- Это не связано с ограничениями на количество потоков / процессов. Я попытался перезапустить мое клиентское приложение, и это то же самое. Как только ОС откажется от новых сокетов, ничто не поможет.
PS. Это НЕ ограничение на стороне сервера. Мы проверили это, купив другой ящик и запустив на нем тот же код клиента, когда первый клиентский ящик отказался создавать новые сокеты. Сервер справился с этим нормально. Мы не хотим покупать 5-10 коробок и вращаться между ними, чтобы преодолеть эту проблему.
ОС: Fedora 10 Linux 2.6.24-23-xen # 1 SMP