Сокеты Apache не закрываются?

У меня есть веб-приложение, написанное с использованием CherryPy, которое запускается локально на 127.0.0.1:4321. Мы используем mod-rewrite и mod-proxy, чтобы Apache работал как обратный прокси; Apache также обрабатывает наше SSL-шифрование и в конечном итоге может использоваться для передачи всего нашего статического контента.

Все это отлично работает для небольших рабочих нагрузок. Однако недавно я использовал urllib2 для написания сценария стресс-тестирования, который имитировал бы рабочую нагрузку 100 клиентов. Через некоторое время каждый клиент получает сообщение об ошибке 503 от Apache, указывающее, что Apache не может подключиться к 127.0.0.1:4321. CherryPy работает правильно, но в моем журнале ошибок Apache есть такие строки:

[Thu Oct 02 12:55:44 2008] [error] (OS 10048)Only one usage of each socket address (protocol/network address/port) is normally permitted. : proxy: HTTP: attempt to connect to 127.0.0.1:4321 (*) failed

Поиск в Google для этой ошибки показывает, что в Apache, вероятно, закончились дескрипторы файлов сокетов. Поскольку у меня работает только 100 клиентов, это означает, что соединения не закрываются ни между моим соединением urllib2 и Apache (я определенно вызываю .close() по возвращаемому значению urlopen), или между Apache и CherryPy.

Я подтвердил, что мой запрос urllib2 отправляет заголовок HTTP Connection: close, хотя Apache настроен с KeepAlive On, если это имеет значение.

Если это важно, я использую Python 2.5, Apache 2.2, CherryPy 3.0.3, а сервер работает на Windows Server 2003.

Итак, каков мой следующий шаг, чтобы решить эту проблему?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
5
0
5 492
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете запустить команду netstat и посмотреть, есть ли у вас несколько сокетов в состоянии TIME_WAIT. В зависимости от настроек MaxUserPort вы можете быть серьезно ограничены в количестве портов, доступных для использования. Кроме того, TcpTimedWaitDelay обычно устанавливается на 240 секунд, поэтому любые используемые сокеты не могут быть повторно использованы в течение четырех минут.

Здесь больше полезной информации -> http://smallvoid.com/article/winnt-tcpip-max-limit.html

Ответ принят как подходящий

SetEnv proxy-nokeepalive 1, вероятно, сразу же скажет вам, если проблема в поддержании активности между Apache и CP. См. mod_proxy документы для получения дополнительной информации.

Другие вопросы по теме