6

我有一个使用 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] [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 上运行。

那么我下一步要做什么来阻止这个问题呢?

4

2 回答 2

6

SetEnv proxy-nokeepalive 1如果问题是 Apache 和 CP 之间的 keepalive,可能会立即告诉您。有关更多信息,请参阅mod_proxy 文档

于 2008-10-02T21:52:03.957 回答
5

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

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

于 2008-10-02T20:02:22.410 回答