Apache сокеты не закрываются? - PullRequest
4 голосов
/ 02 октября 2008

У меня есть веб-приложение, написанное с использованием 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

Поиск этой ошибки показывает, что 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.

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

Ответы [ 2 ]

5 голосов
/ 03 октября 2008

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

5 голосов
/ 03 октября 2008

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

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

...