MySQL|数据库|MySQL数据库的Sleep进程过多的处理方式

打印 上一主题 下一主题

主题 896|帖子 896|积分 2688

前言:

MySQL数据库是和别的的关系型数据库基本一样,开箱了就能用,但性能方面还需要仔细的设置,末了才能完全的发挥它的性能,也需要相关服务的开辟遵循数据库的开辟规范,例如,减少大事件,尽量使用短连接,常用查询使用缓存技术,连接池扩展,读写分离,读写负载均衡等等技术,而这些技术通常是根据业务量来选择的,并不是用上就会提拔性能,究竟鞋子符合不符合,只有穿过了才知道。
那么,没有优化大概优化较少的情况下,MySQL轻易出现Sleep进程过多的问题,这些进程会挤占MySQL数据库所在的操纵体系的内存,导致体系的运行痴钝,当然了。数据库的查询,插入等等使用效率也会有所降低,严重的甚至会导致连接数据库的业务停止。

MySQL中的Sleep进程过多是一个常见的数据库维护问题,它通常指的是很多数据库连接处于空闲状态(Sleep状态),这些连接虽然没有实验任何实际操纵,但仍占用了服务器的资源(如内存、线程等)。以下是处理MySQL中Sleep进程过多的一些步调和建议:

  • 理解原因:

    • 持久连接:假如应用步调使用了持久连接(如PHP中的mysql_pconnect或mysqli的持久连接模式),即使脚本实验完毕,连接也不会立刻关闭,而是在一段时间内保持闲置状态,形成Sleep进程。
    • 超时设置:wait_timeout 和 interactive_timeout 参数设置不合理,导致空闲连接在设定的时间内未自动关闭,依然保持在Sleep状态。
    • 步调计划问题:步调代码中未能正确关闭数据库连接,例如忘记调用 mysql_close 或使用PDO、mysqli等现代接口时没有确保连接释放。

  • 办理方案

    • 调解连接计谋:假如因持久连接引起,思量改用非持久连接,确保每个请求结束后连接能被正常关闭。
    • 优化超时参数:根据应用的实际需求,得当减小wait_timeout和interactive_timeout的值,以便空闲连接能更快地被回收。但是要注意不要设置得过小,以免频仍创建新连接带来额外开销。
    • 步调层面改进:确保在所有数据库操纵完成后,步调都正确且实时地关闭数据库连接。
    • 监控与清理:定期检查并手动清理长时间处于Sleep状态的连接,可以通过实验KILL下令终止这些连接(注意审慎操纵,避免误杀正在工作的连接);也可以编写脚本或使用数据库监控工具自动监测和清理。
    • 连接池优化:对于高并发场景,可思量使用连接池技术,它可以更高效地管理和复用数据库连接,从而减少Sleep进程数量。

  • 数据库设置:

    • 假如MySQL服务器版本支持,可以启用thread_pool功能以更智能地管理线程资源,特别注意MySQL5.7并不支持此设置,Percona Server for MySQL或MariaDB才有此功能
    • 调解max_connections参数,合理限制最大并发连接数,防止过多无用连接耗尽体系资源。

  • 应用层缓存:

    • 在应用层增长缓存机制,减少不必要的数据库访问,间接降低Sleep连接的产生。

总之,针对MySQL Sleep进程过多的问题,核心思绪是找生产生这些空闲连接的原因,从应用步调计划、数据库设置、连接管理等多个角度举行优化。同时,定期审计和维护也是非常紧张的。
         当然了,以上的建议对于云上MySQL也是有用的,而且据观察,云上数据库RDS大概更轻易出现此类问题
         稍作总结

假如希望快速的立刻减少Sleep进程过多现象,无疑监控并清理选项是可以立竿见影的(上面的办理方案的第四条),当然,这个方法是即是自己实现的优化超时参数,也就是上面的办理方案的第二条,别的的方法需要更多的时间和耐烦举行调解(重要看开辟的优化意愿了)
办理方案的第四条,使用数据库监控工具

许多数据库监控工具,如MySQL Enterprise Monitor、Percona Monitoring and Management (PMM)、Zabbix等,都支持自定义告警规则和自动操纵。你可以设置规则来监控长时间处于Sleep状态的连接,并在满足一定条件时自动清理。
例如,在PMM中,可以设置自定义警报,当发现长时间Sleep的连接时发送通知或直接实验清理操纵。这样就能实时且安全地管理MySQL的Sleep连接,避免资源浪费。
本文迁就手动清理做一个详细的解释
一、

脚本手动治理MySQL的Sleep进程过多问题

假设现在我有一个RDS数据库,那么,在一台可以连接到RDS的服务器上,任意安装一个maridb数据库,该数据库不需要启动,编写如下脚本即可:
vim kill_mysql_pid.sh
  1. #!/bin/bash
  2. #!author zsk
  3. set -eu
  4. ip=192.168.123.19
  5. port=3306
  6. password=123456
  7. id=`mysqladmin -h $ip -uroot -P$port -p$password processlist |grep Sleep |awk -F '| '  '{print $2}'`
  8. echo $id
  9. for i in $id
  10. do
  11. mysqladmin -h $ip -uroot -P$port -p$password kill $i
  12. done
复制代码
三个变量,IP是RDS的IP地址(假设),port是RDS的对外端口(假设),密码是RDS的root密码,变量按实际填写就可以使用了,关键是root密码和连接地址,对于RDS服务器同样实用的
这样的清理比较霸道,需要审慎实用
大概手动实现MySQL参数timeout的脚本:
  1. #!/bin/bash
  2. MYSQL_USER="your_username"
  3. MYSQL_PASS="your_password"
  4. MYSQL_HOST="localhost"
  5. MYSQL_CONN="-u$MYSQL_USER -p$MYSQL_PASS -h$MYSQL_HOST"
  6. # 空闲连接阈值,单位秒
  7. IDLE_THRESHOLD=3600
  8. # 获取所有Sleep状态且空闲时间超过阈值的连接ID
  9. CONNECTION_IDS=$(mysql $MYSQL_CONN -e "SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE TIME > ${IDLE_THRESHOLD} AND STATE = 'Sleep';")
  10. # 关闭这些连接
  11. for CONN_ID in $CONNECTION_IDS; do
  12.     mysql $MYSQL_CONN -e "KILL ${CONN_ID};"
  13. done
复制代码

二、

线程池功能

线程池功能可以有用的自动控制MySQL的Sleep进程
MySQL 5.7并不自带内建的线程池功能。假如希望在MySQL 5.7中使用线程池技术来改善服务器性能,可以思量使用第三方MySQL分支大概插件。
Percona Server for MySQL,作为MySQL的一个增强分支,提供了线程池插件。要在Percona Server 5.7中启用线程池功能,您可以按照以下步调操纵:

  • 安装Percona Server 5.7: 确保您已安装了包含线程池插件的Percona Server版本。假如不是,请从Percona官网下载并安装正确的版本。
  • 安装线程池插件: 登录到MySQL服务器(使用root权限或具有相应权限的用户),并安装线程池插件:
    1. [/code] [code]INSTALL PLUGIN thread_pool SONAME 'percona-threadpool';
    复制代码
  • 设置线程池参数: 设置线程池的相关参数,如线程池大小、队列大小等。例如:
    1. [/code] Sql [code]SET GLOBAL thread_pool_size = 16;
    2. SET GLOBAL thread_pool_max_threads = 32;
    3. SET GLOBAL thread_pool_min_threads = 4;
    复制代码
    根据实际业务负载需求调解这些参数。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

科技颠覆者

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表