有时候,在业务高峰期,生产环境的MySQL压力太大,没法正常响应,需要短期内、临时性地提升一些性能。本文就来讲讲一些临时方法,并着重说它们可能存在的风险。
短连接风暴
正常的短连接模式是连接到数据库后,执行很少的SQL语句就断开,下次需要的时候再重连。如果使用的是短连接,在业务高峰期时,可能出现连接数突然暴涨的情况。
MySQL建立连接的过程成本很高,在数据库压力比较小的时候,这些额外成本并不明显。
短连接模型存在一个风险,就是一旦数据库处理慢一些,连接数就会暴涨。max_connections参数用来控制一个MySQL实例同时存在的连接数的上限,超过这个值,系统就会拒绝接下来的连接请求并报错。对于被拒绝连接的请求来说,从业务角度看就是数据库不可用。
当机器负载较高,处理现有请求时间变长,每个连接保持的时间也更长,这时来的新连接很可能就超过数量限制。此时如果调高参数,那么系统负载可能进一步加大,大量的资源耗费在权限验证等逻辑上,结果可能更差。
这里还有两种方法,但都是有损的。
方法一:先处理掉那些占着连接但是不工作的线程
对于不需要保持的连接,可以通过kill connection主动剔除,这个行为和事先设置wait_timeout效果相同。wait_timeout参数表示线程空闲多少时间后会被MySQL直接断开连接。
在show processlist的结果里,踢掉显示为sleep的线程,可能是有损的:
