我的基本问题是这对服务器会有什么样的影响?
举例来说,我公司有一个较旧的程序,它以高频率打开与 mysql 数据库服务器的连接(他们对应用程序所做的一切基本上都会打开服务器连接)。但是,此应用程序的设计方式并未在创建连接后将其处理掉。很多时候,这些连接保持打开状态,但从未再次使用,我猜您可以说它们是打开“死”连接。
它们会一直保持连接状态,直到服务器超时,或者直到管理员进入并手动删除休眠连接。我猜这可能是我们有时从尝试访问 mysql 数据库的其他系统收到无法连接错误等的原因?(已达到连接限制)
这也会降低服务器速度吗?很好奇这一切到底会造成什么后果。
答案1
您可以使用 MySQL 中的超时值玩一些游戏。
例如,' wait_timeout
' 和 ' interactive_timeout
' 的默认值为 28800(即 8 小时)
你可以通过运行以下命令来查看它们的设置:
SHOW VARIABLES LIKE 'interactive_timeout';<BR>
SHOW VARIABLES LIKE 'wait_timeout';
如果您想将这些时间降低到 1 分钟,则无需重新启动 MySQL。
以 root 用户身份运行这些:
SET GLOBAL interactive_timeout=60;<BR>
SET GLOBAL wait_timeout=60;
这将确保任何新的 MySQL 连接在 60 秒内超时。
然后将这些行添加到/etc/my.cnf
[mysqld] 部分下
interactive_timeout=60
wait_timeout=60
当然,重启 mysql 来移除剩余的休眠连接更简单。从这里开始的所有连接将在 60 秒内超时。
尝试一下并告诉我们!!!
答案2
除非您运行的服务器非常有限,否则这不太可能减慢任何速度。执行此操作的应用程序会慢慢出现内存泄漏,直到达到最大连接数,但我怀疑不会有那么多内存。
您可能遇到的主要问题是您已经注意到的问题,即连接数达到最大值。最好的选择是修复程序,让其自行清理。如果出于某种原因,这确实不是一个选择,那么您可能能够从运行该应用程序的框中设置连接限制,以便该框无法打开超过 X 个到 mysql 服务器的连接,这样它就无法独占它(我不知道您使用的是什么操作系统,不知道这是否可行,但如果是 Linux,这将是一个简单的 iptables 规则)。
答案3
是的,interactive_timeout 和 wait_timeout。只要 mysql 中的清理线程继续运行,它就会自行清理它们
答案4
直到连接耗尽且合法客户端无法连接时,它才会造成问题。
当然,您需要将 max_connections 设置得足够低,以免耗尽内存或地址空间(MySQL 每个连接使用一个线程)。您不应该在 32 位系统上运行 mysql,但如果这样做,这意味着您需要(实际上)将 max_connections 设置得小于 1000。
如果应用服务器无法关闭连接,则很可能也会泄漏其资源。让服务器超时可以解决 mysql 端的问题,但可能不会释放另一端的内存(等等)。如果不加以控制,故障的应用服务器最终将失败。它确实需要修复。
另外,在将超时时间设置得很低时要非常小心,有些应用程序希望连接不会超时。默认值为 8 小时,因此将其更改为 1 分钟似乎非常激进。