1

事情是这样的:我有一个名为 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 和 OS 似乎都同意有超过 400 个与 A 的打开连接。

但是,当我登录到 A,运行时netstat -ntp | grep 'B's IP' | wc -l,我只看到超过 100 个 TCP 连接。

那么这怎么会发生呢?是我用netstat错了,还是什么?我只是不明白为什么两个主机不同意它们之间有多少 TCP 连接。

快速更新:我们实际上在 A 上有 6 个不同的项目(一些是 Rails 3.2,一些是 Rails 2.3),其中一个是 redmine。我show processlist在 B 上获取结果,将其与netstat -ntpA 上的结果进行比较,发现 B 上的不匹配连接来自不同的项目,包括 redmine。

PS:两个操作系统都是CentOS 5.4,MySQL是Percona 5.1.57-rel12.8-log

PS2:我们重新启动了所有服务器/硬件,但问题仍然存在。由于它完全出乎意料,我猜问题/错误总是在那里,但直到它达到我们设置的 1000 个最大连接时我们才注意到它。所以有什么疯狂的猜测吗?它可能是应用程序代码错误(activerecord 或 mysql gem)吗?操作系统错误?或者是什么?

4

1 回答 1

1

A 上的应用程序在完成时可能不会正确关闭它们与 MySQL 的连接。

当进程在 A 上终止时,它们拥有的连接必须被操作系统自动丢弃,但 B 仍在等待来自 A 的信号。

当达到(MySQL)超时延迟时,B 最终会释放这些连接。

如果不了解更多关于 A 上的应用程序,很难更具体,但这里没有什么值得惊讶的(除非你没想到 A 上的应用程序会被破坏:)

于 2013-06-09T08:16:01.077 回答