我有一个使用 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 上运行。
那么我下一步要做什么来阻止这个问题呢?