MySQL thread_stack连接线程的优化

 更新时间:2021年03月16日 00:48:31   投稿:mdxy-dxy  
当有新的连接请求时,MySQL首先会检查Thread Cache中是否存在空闲连接线程,如果存在则取出来直接使用,如果没有空闲连接线程,才创建新的连接线程

MySQL连接不仅能通过网络方式,还可以通过命名管道的方式,不论是哪种方式连接MySQL,在MySQL中都是通过线程的方式管理所有客户端请求的。每一个客户端连接都会有一个与之对应的连接线程。在MySQL中实现了一个Thread Cache池,将空闲的连接线程存放其中,而不是完成请求后就销毁。这样,当有新的连接请求时,MySQL首先会检查Thread Cache中是否存在空闲连接线程,如果存在则取出来直接使用,如果没有空闲连接线程,才创建新的连接线程。具体参数:
Thread_cache_size:Thread Cache池中应该存放的连接线程数。
Thread_stack:每个连接线程被创建时,MySQL给它分配的内存大小。当MySQL创建一个新的连接线程时,需要给它分配一定大小的内存堆栈空间,以便存放客户端的请求的Query及自身的各种状态和处理信息。
查看连接线程相关的系统变量的设置值: show variables like 'thread%';

mysql> show variables like 'thread%';
+-------------------+--------+
| Variable_name | Value |
+-------------------+--------+
| thread_cache_size | 32 |
| thread_stack | 196608 |
+-------------------+--------+
2 rows in set (0.00 sec)

如图,系统设置了Thread Cache池最多将缓存25个连接线程,每个连接线程创建之初,系统分配192KB的内存堆栈给它。
查看系统被连接的次数及当前系统中连接线程的状态值

mysql> show status like 'connections';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Connections | 620 |
+---------------+-------+
1 row in set (0.00 sec)

mysql> show status like '%thread%';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| Delayed_insert_threads | 0 |
| Slow_launch_threads | 0 |
| Threads_cached | 3 |
| Threads_connected | 4 |
| Threads_created | 7 |
| Threads_running | 1 |
+------------------------+-------+
6 rows in set (0.00 sec)

系统启动到现在共接受到客户端的连接620次,共创建了7个连接线程,当前有1个连接线程处于和客户端连接的状态,而3个连接状态的线程中只有一个处于 active 状态,即只有一个正在处理客户端提交的请求,。而在Thread Cache池中共缓存了3个连接线程。

Thread Cache 命中率:
Thread_Cache_Hit = (Connections - Threads_created) / Connections * 100%;
一般在系统稳定运行一段时间后,Thread Cache命中率应该保持在90%左右才算正常。

实际应用:

针对16G/32G的机器,一般设置 512K

当然如果遇到下面的错误提示就应该考虑增加这个值了。

mysql-debug: Thread stack overrun

bug info

报错信息:
java.sql.SQLException: Thread stack overrun: 5456 bytes used of a 131072 byte stack, and 128000 bytes needed. Use 'mysqld --thread_stack=#' to specify a bigger stack.

官方相应信息:

The default (192KB) is large enough for normal operation. If the thread stack size is too small, it limits the complexity of the SQL statements that the server can handle, the recursion depth of stored procedures, and other memory-consuming actions

可以使用

show variables where `variable_name` = 'thread_stack';

查询当前数据库的默认线程栈的大小,一般情况下都能正常使用,但是当查询语句或者存储过程复杂时会报Thread stack overrun错误,此时只要修改默认配置就可以。

解决

windows: 修改mysql安装目录下的my-small.ini或者my.ini设置为256k,或者更大,然后重启服务

[mysqld]
thread_stack = 256k
linux: 同样要修改配置文件,但是!!!,不是安装目录下的配置文件,是/etc/my.cnf,只有这个文件才能生效,然后重启服务service mysql restart

[mysqld]
thread_stack = 256k

相关文章

  • mysql缺少my.ini文件的最佳解决方法

    mysql缺少my.ini文件的最佳解决方法

    my.ini是MySQL数据库中使用的配置文件,修改这个文件可以达到更新配置的目的,下面这篇文章主要给大家介绍了关于mysql缺少my.ini文件的最佳解决方法,需要的朋友可以参考下
    2024-01-01
  • mysql 超大数据/表管理技巧

    mysql 超大数据/表管理技巧

    在实际应用中经过存储、优化可以做到在超过9千万数据中的查询响应速度控制在1到20毫秒。看上去是个不错的成绩,不过优化这条路没有终点,当我们的系统有超过几百人、上千人同时使用时,仍然会显的力不从心
    2013-03-03
  • MySQL数据库的shell脚本自动备份

    MySQL数据库的shell脚本自动备份

    这篇文章主要介绍了MySQL数据库的shell脚本自动备份的相关资料,网站或应用的后台都有备份数据库的功能按钮,但需要去手工执行。我们需要一种安全的,每天自动备份的方法需要的朋友可以参考下
    2017-03-03
  • 基于MySql的扩展功能生成全局ID

    基于MySql的扩展功能生成全局ID

    本文借用 MySQL的扩展功能 REPLACE INTO 来生成全局id,REPLACE INTO和INSERT的功能一样,但是当使用REPLACE INTO插入新数据行时,如果新插入的行的主键或唯一键(UNIQUE Key)已有的行重复时,已有的行会先被删除,然后再将新数据行插入
    2015-12-12
  • MySQL的InnoDB扩容及ibdata1文件瘦身方案完全解析

    MySQL的InnoDB扩容及ibdata1文件瘦身方案完全解析

    在使用InnoDB存储引擎后,MySQL的ibdata1文件常常会占据大量存储空间,这里我们就为大家带来MySQL的InnoDB扩容及ibdata1文件瘦身方案完全解析:
    2016-06-06
  • Mysql的列修改成行并显示数据的简单实现

    Mysql的列修改成行并显示数据的简单实现

    这篇文章主要介绍了Mysql的列修改成行并显示数据的简单实现,本文给大家介绍的非常详细,具有参考借鉴价值,需要的朋友可以参考下
    2016-10-10
  • mysql踩坑之limit与sum函数混合使用问题详解

    mysql踩坑之limit与sum函数混合使用问题详解

    这篇文章主要给大家介绍了关于mysql踩坑之limit与sum函数混合使用问题的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用mysql具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-06-06
  • IOS 数据库升级数据迁移的实例详解

    IOS 数据库升级数据迁移的实例详解

    这篇文章主要介绍了IOS 数据库升级数据迁移的实例详解的相关资料,这里提供实例帮助大家解决数据库升级及数据迁移的问题,需要的朋友可以参考下
    2017-07-07
  • MySql explain命令返回结果详细介绍

    MySql explain命令返回结果详细介绍

    explain 是MySql提供的SQL语句查询性能的工具,是我们优化SQL的重要指标手段,要看懂explain返回的结果集就尤为重要,这篇文章主要介绍了MySql explain命令返回结果解读,需要的朋友可以参考下
    2023-09-09
  • MySQL 服务和数据库管理

    MySQL 服务和数据库管理

    今天MySQL总结一些方法和一些基础的内容,下面文章将围绕MySQL 服务与数据库管理得相关资料展开内容,需要的朋友可以参考一下,希望对你有所帮助
    2021-11-11

最新评论