这是事情: 我有一个名为A的应用程序服务器和一个名为B的数据库服务器。
在B(DB)上,当我运行netstat -ntp | grep 'A's IP' | wc -l
时,我看到超过400个TCP连接。
当我使用MySQL客户端连接MySQL并运行select count(*) from processlist where host like 'A's IP%'
时,我也看到了超过400个结果,所以看起来MySQL和&操作系统同意A有超过400个开放式连接。
但是,当我登录A时,运行netstat -ntp | grep 'B's IP' | wc -l
,我只看到100多个TCP连接。
那怎么会发生这种情况呢?我使用netstat
错了,或者是什么?我只是不明白为什么两个主机不同意它们之间有多少TCP连接。
快速更新:
我们实际上在A上有6个不同的项目(有些是Rails 3.2,有些是Rails 2.3),其中一个是redmine。我在B上抓取show processlist
结果,将其与A上的netstat -ntp
进行比较,发现B上不匹配的连接来自不同的项目,包括redmine。
PS:两个操作系统都是CentOS 5.4,MySQL是Percona 5.1.57-rel12.8-log
PS2:我们重新启动了所有服务器/硬件,但问题仍然存在。由于它完全出乎意料,我猜测问题/错误始终存在,但我们没有注意到它直到达到我们设置的1000个最大连接。所以任何疯狂的猜测?它可能是一个应用程序代码错误(activerecord或mysql gem)? OS bug?或者什么?答案 0 :(得分:1)
A上的应用程序在完成时可能无法正确关闭与MySQL的连接。
当进程终止于A时,操作系统必须自动丢弃它们拥有的连接,但B仍在等待来自A的信号。
当达到(MySQL)超时延迟时,B将最终释放这些连接。
如果不了解A上的应用程序,很难更具体,但这里没有什么可惊讶的(除非你没想到A上的应用程序被打破了)。