Вопрос

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

[Чт, 02 октября 12:55:44 2008] [ошибка] (OS 10048) Обычно разрешено только одно использование каждого адреса сокета (протокол / сетевой адрес / порт). : proxy: HTTP: попытка подключения к 127.0.0.1:4321 (*) не удалась

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

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

Это было полезно?

Решение

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top