Apache套接字未关闭?
我有一个用CherryPy写的网页应用程序,它在本地的 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)每个套接字地址(协议/网络地址/端口)通常只允许使用一次。 : proxy: HTTP: 尝试连接到 127.0.0.1:4321 (*) 失败
通过谷歌搜索这个错误,发现Apache可能已经用完了套接字文件描述符。因为我只有100个客户端在运行,这意味着连接没有被关闭,可能是在我的 urllib2
连接和Apache之间(我确实在 urlopen
的返回值上调用了 .close()
),或者是在Apache和CherryPy之间。
我确认我的 urllib2
请求发送了一个HTTP Connection: close
头,尽管Apache的配置是 KeepAlive On
,如果这有影响的话。
顺便提一下,我使用的是Python 2.5,Apache 2.2,CherryPy 3.0.3,服务器运行在Windows Server 2003上。
那么,我接下来该怎么做才能解决这个问题呢?
2 个回答
你可以运行 netstat 命令,看看是否有很多连接处于 TIME_WAIT 状态。根据你的 MaxUserPort 设置,你可能会在可用端口数量上受到很大限制。此外,TcpTimedWaitDelay 通常设置为 240 秒,这意味着任何被使用过的连接在四分钟内不能再次使用。
这里还有更多有用的信息 --> http://smallvoid.com/article/winnt-tcpip-max-limit.html
SetEnv proxy-nokeepalive 1
这个命令可能会立刻告诉你,问题是不是出在 Apache 和 CP 之间的保持连接上。想了解更多信息,可以查看 mod_proxy 的文档。