2009-05-02 102 views
1

我们有一个相当繁忙的网站(每天100万次页面浏览量)使用Apache mod代理,在TIME_WAIT状态下连接(> 1,000)不断超载。连接到端口3306(mysql),但mysql只显示几个连接(显示进程列表),并表现良好。 我们尝试改变一堆东西(保持活跃/关闭),但似乎没有任何帮助。所有其他系统资源都在合理范围内。太多的TIME_WAIT连接

我搜索了四周,这似乎表明更改tcp_time_wait_interval。但那似乎有点激烈。我以前在繁忙的网站上工作过,但从未遇到过这个问题。

有什么建议吗?

回答

0

我们有类似的问题,我们的网络服务器都冻结了,因为我们的php连接到一个mysql服务器,该服务器被设置为对传入连接执行反向主机查找。

当事情进展缓慢时,它可以正常工作,但是在负载下,responstimes通过屋顶拍摄,所有apache服务器都卡在time_wait中。

我们通过使用xdebug在高负载下创建脚本的性能分析数据并查看问题的方式。 mysql_connect调用占用了80-90%的执行时间。

+0

但是,连接是否都来自同一台服务器,您的Web服务器或您的应用程序服务器?我会认为在第一次连接之后,mysql会触发主机缓存。他们做了 – 2009-05-02 00:55:49

+0

,但事实并非如此。 – xkcd150 2009-05-02 01:12:01

5

每个time_wait连接是一个已关闭的连接。

您可能连接到mysql,发出查询,然后断开连接。对页面上的每个查询重复。考虑使用连接池工具,或者至少使用一个保存在数据库连接上的全局变量。如果您使用全局,则必须在页面末尾关闭连接。希望你有一些常见的东西可以放在那里,就像一个页脚包含。

作为奖励,你应该得到更快的页面加载。 MySQL很快连接,但不需要重新连接更快。

+0

我们使用的是PHP,所以您无法真正做连接池,因为一旦页面交付,流程结束。 – 2009-05-02 02:18:09

+0

通过将db连接分配给全局变量,您仍然可以在页面内重用连接。而不是每次重新创建。你也可以使用类似http://httpd.apache.org/docs/2.2/mod/mod_dbd.html的方法在php进程之外进行池化。 – Trey 2009-05-02 16:45:41

+0

@trey @craig任何php演示如何创建全局变量 – 2011-03-15 12:03:27