我有一个使用CherryPy编写的Web应用程序,它在 127.0.0.1:4321 上本地运行。我们使用mod-rewrite和mod-proxy让Apache充当反向代理; Apache还处理我们的SSL加密,最终可能用于传输所有静态内容。

这一切都适用于小型工作负载。但是,我最近使用 urllib2 编写了一个压力测试脚本,可以模拟100个客户端的工作负载。一段时间后,每个客户端从Apache收到503错误,表明Apache无法连接到 127.0.0.1:4321 。 CherryPy运行正常,但我的Apache错误日志显示如下行:

[Thu Oct 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 docs

其他提示

您可以运行netstat命令,看看是否有一堆处于TIME_WAIT状态的套接字。根据您的MaxUserPort设置,您可能会严重限制可用端口的数量。此外,TcpTimedWaitDelay通常设置为240秒,因此使用的任何套接字都不能在四分钟内重复使用。

这里有更多有用的信息 - > http://smallvoid.com/article/winnt-tcpip-max-limit.html

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top