mysql5.7 大量sleep进程常规处理方式

这篇具有很好参考价值的文章主要介绍了mysql5.7 大量sleep进程常规处理方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 现象      

在日常的mysql运维中我们在巡检的时候经常会发现大量的sleep进程,如下图:

mysql sleep线程过多,数据库,运维,dba,mysql

2. 原因

这种现象一般由三种情况导致的:

1.程序中对mysql_close的调用不佳

2.数据库中sql的查询时间过长

3.wait_timeout、interactive_timeout两个参数的值过大

3.解决方案

常见的问题是第三种,我们先来理解一下wait_timeout、interactive_timeout这两个参数的含义:

根据mysql5.7官方文档的说明:

mysql sleep线程过多,数据库,运维,dba,mysql

wait_timeout可设置为全局、会话级别,吗,默认值28800,最小值1,最大值3153600 ,单位是秒 。

他是指服务器在关闭非交互式连接之前等待该连接活动的秒数。

在线程启动时,会话wait_timeout值从全局wait_timeout值或从全局interactive_timeout值初始化,这取决于客户端的类型(由mysql_real_connect()的CLIENT_INTERACTIVE connect选项定义)。另请参见interactive_timeout。

mysql sleep线程过多,数据库,运维,dba,mysql

interactive_timeout可设置为全局、会话级别,吗,默认值28800,最小值1,最大值3153600 ,单位是秒 。

服务器在关闭交互式连接之前等待其活动的秒数。交互式客户端定义为使用mysql_real_connect()的CLIENT_INTERACTIVE选项的客户端。另请参见wait_timeout。

在配置这两个参数的时候要同时配置保持一致。

下面我们理解一下这两个参数真正的作用:

wait_timeout 用来控制jdbc等应用程序连接数据库长时间不活跃MySQL主动断开连接的时间

interactive_timeout 用来控制mysql客户端ide工具连接数据库长时间不活跃MySQL主动断开连接的时间

在MySQL中,Sleep是一个状态,表示连接已建立,但当前没有任何活动。Sleep进程是指MySQL中当前处于Sleep状态的进程,这些进程占用了MySQL资源,但却没有实际运作。当连接建立之后,如果没有任何操作,连接将一直保持在Sleep状态,直到连接超时或被关闭。

Mysql通过wait_timeout 、interactive_timeout 这两个参数完成对Sleep进程的释放,当sleep的时间达到wait_timeout 、interactive_timeout的阈值时会被mysql自动清理。

注意:这里引申一个概念:一般数据库与中间件连接的时候都会通过连接池去管理客户端对数据库发起的连接,在代码里conn.close()方法,在实际意义上只是把这个连接交还给了连接池,和数据库的连接并没有真正断开。wait_timeout时间到了以后,服务端MySQL断掉连接后,并不会通知(也没法通知)连接池,所以连接池里的连接如果被拿去使用时,就会产生Communications link failure 报错。

处理方式:

1.查看sleep默认的超时时间
SHOW GLOBAL VARIABLES LIKE 'wait_timeout'; 
SHOW GLOBAL VARIABLES LIKE 'interactive_timeout';

2.设置超时时间编程30秒,注意:必须两个参数同时设置才会生效。
set global wait_timeout=30;
set global interactive_timeout=30;

具体的参数值要结合连接池的超时时间,最大sql执行时间,业务的最大持续时间来设定。比如阿里的默认配置时间是120s。对于高并发业务对于这两个值的配置建议在1~3分钟之内。

建议写到mysql配置文件中否则下次重启mysql参数失效。

手动处理sleep进程的方法:

1.查询需要kill掉的无效连接进程
SELECT GROUP_CONCAT(CONCAT('kill ',Id) SEPARATOR';') AS cmd FROM information_schema.processlist WHERE command='Sleep'
USER='root'
AND command='Sleep'
and db = 'test';

具体条件根据实际情况修改

2.执行查询结果

注意:查询结果会显示大量的kill语句,受到字符长度限制在执行后验证并继续执行.

3.重新执行查询验证sleep是否消失
SELECT
*
FROM
information_schema.processlist WHERE USER='root'
AND command='Sleep'
and db = 'test'
order by time desc;

具体条件根据实际情况修改

配置示例

3.最佳实践:

3.1 MySQL参数设置

wait_timeout :900秒 #通常设置为900秒超时,各业务线可以根据实际情况调整
interactive_timeout :900秒 #建议和wait_timeout保持一致

3.2 jdbc端设置:

jdbc.connection-pool.max-idle-time  <  wait_timeout
jdbc.connection-pool.idle-test-interval  <  interactive_timeout

3.3 apache连接池配置文章来源地址https://www.toymoban.com/news/detail-698023.html

validationQuery = "SELECT 1"  验证连接是否可用,使用的SQL语句
testWhileIdle = "true"      指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败,则连接将被从池中去除.
timeBetweenEvictionRunsMillis = "30000"  每30秒运行一次空闲连接回收器
minEvictableIdleTimeMillis = "1800000"  //1000 * 60 * 30  连接在池中保持空闲而不被空闲连接回收器线程,(如果有)回收的最小时间值,单位毫秒池中的连接空闲30分钟后被回收,默认值就是30分钟。
numTestsPerEvictionRun="5" 在每次空闲连接回收器线程(如果有)运行时检查的连接数量,默认值就是5.

到了这里,关于mysql5.7 大量sleep进程常规处理方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【linux 多线程并发】多线程模型下的信号通信处理,与多进程处理的比较,属于相同进程的线程信号分发机制

    ​ 专栏内容 : 参天引擎内核架构 本专栏一起来聊聊参天引擎内核架构,以及如何实现多机的数据库节点的多读多写,与传统主备,MPP的区别,技术难点的分析,数据元数据同步,多主节点的情况下对故障容灾的支持。 手写数据库toadb 本专栏主要介绍如何从零开发,开发的

    2024年01月17日
    浏览(36)
  • Java并发(三)----创建线程的三种方式及查看进程线程

    例如: 输出 注意:这里通过 @Slf4j 注解打印的日志 把【线程】和【任务】(要执行的代码)分开 Thread 代表线程 Runnable 可运行的任务(线程要执行的代码) 例如: 输出 Java 8 以后可以使用 lambda 精简代码 小结 方法1 是把线程和任务合并在了一起,方法2 是把线程和任务分开

    2023年04月24日
    浏览(39)
  • Centos7 两种方式安装 MySQL5.7 步骤 yum 、本地 tar 文件

    1、卸载系统自带 mariadb MariaDB Server 是最流行的开源 关系型数据库 之一。它由 MySQL 的原始开发者制作,并保证保持开源。 在 CentOS 7 中默认安装有 MariaDB 可忽略,安装完成之后可以直接覆盖掉 MariaDB。 查看并卸载系统自带的 Mariadb 2、下载并安装 MySQL 官方的 Yum 由于 CentOS 的

    2024年01月24日
    浏览(40)
  • 补充:es与mysql之间的数据同步 2 使用分页导入的方式把大量数据从mysql导入es

    本片文章只是对之前写的文章的补充, es与mysql之间的数据同步 http://t.csdn.cn/npHt4 补充一: 之前的文章对于交换机、队列、绑定,使用的是@bean, 而这里使用的是纯注解版 在消费方,声明交换机: 补充二: 之前的文章是直接使用es操作数据,新增和修改,这样做不是很合适

    2024年02月12日
    浏览(40)
  • selenium并发处理多个窗口线程/进程任务

    这里以百度搜索为例,通过不同的浏览器来启动不同的线程。

    2024年01月20日
    浏览(33)
  • Python sleep函数用法:线程睡眠

    如果需要让当前正在执行的线程暂停一段时间,并进入阻塞状态,则可以通过调用 time 模块的 sleep(secs) 函数来实现。该函数可指定一个 secs 参数,用于指定线程阻塞多少秒。 当前线程调用 sleep() 函数进入阻塞状态后,在其睡眠时间段内,该线程不会获得执行的机会,即使系

    2024年01月21日
    浏览(33)
  • Python并行处理数据多进程/多线程,榨干你的CPU

      最近在公司实习,给整了个活,像是数学建模一样的数据分析的活,目标是在几个互相有关联的大表中找出满足某条件的那些业务,其中第一步就是把两个表拼起来,就叫它们A和B吧,省略拼表过程中需要的逻辑判断。   两个长为M和N的表,在判断中需要一个M*N级别的

    2024年02月15日
    浏览(42)
  • 单元测试使用Thread.sleep()后线程直接停止

    单元测试中测试多线程,使用sleep()阻塞线程,但是运行后发现Thread.sleep()后的代码不执行,直接退出了线程。 在单元测试中,如果子线程处于阻塞、死亡状态时,单元测试会立刻停止所有子线程。 如下图,不会输出running

    2024年02月13日
    浏览(34)
  • 【Java基础教程】(四十二)多线程篇 · 上:多进程与多线程、并发与并行的关系,多线程的实现方式、线程流转状态、常用操作方法解析~

    理解进程与线程的区别; 掌握Java 中多线程的两种实现方式及区别; 掌握线程的基本操作方法; 进程是程序的一次动态执行过程,它经历了从代码加载、执行到执行完毕的一个完整过程,这个过程也是进程本身从产生、发展到最终消亡的过程 。多进程操作系统能同时运行多

    2024年02月16日
    浏览(38)
  • 【Shell 命令集合 系统管理 】⭐⭐Linux 让进程休眠 sleep命令 使用指南

    Shell 命令专栏:Linux Shell 命令全解析 在Linux中,sleep命令用于在一段指定的时间内暂停当前进程的执行。它的作用是让进程休眠,暂停执行一段时间,然后继续执行后续的指令。 使用sleep命令可以在脚本中设置延迟,以便在执行后续操作之前等待一段时间。这对于需要在特定

    2024年02月07日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包