У меня есть веб-приложение, написанное с использованием 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.
Так, каков мой следующий шаг, чтобы остановить эту проблему?