mysql thread conn_Mysql thread 与 OS thread

2023-11-10

​> 欢迎阅读 陈同学博客原文

本文作为 Mysql插入2.6亿条垃圾数据后会发生什么? 、手工重现Mysql插入的”2.6亿”垃圾数据 的续篇,初始目的是想看看kill掉执行中的事务对应的os thread之后会发生什么,同时学习下mysql thread与os thread的相关知识。

测试环境信息如下:

OS:Ubuntu 16.04 LTS

Mysql:Mysql 5.7.18,使用docker images运行的实例

Mysql如何处理client请求

在Mysql中,连接管理线程(Connection manager threads)用于处理来自客户端的TCP/IP连接请求,它会将每个client connection关联到一个专门的mysql thread,这个thread负责处理通过connection发出的所有请求(也包含请求的安全认证)。

Mysql thread

mysql thread并非操作系统上的真实线程,只是mysql中的一个对象,但是会与os thread(操作系统真实的线程)关联起来。下面了解下如果查看mysql thread。

最简单的方式是使用 show processlist 查看当前连接,这个命令与查看information_schema.processlist表效果一致。

每一个连接进来时,都可以在看到一条新的记录。可以通过不断打开与关闭连接来测试,每次打开一个连接后在 processlist 中将会多出一条记录,连接关闭后这条记录也会被移除。

f37b7eb0ccc64700a5ffd95b7b69658b.png

如果当前连接正在进行事务处理,也可以通过information_schema.innodb_trx 事务表查看,其中trx_mysql_thread_id字段为mysql thread id,与processlist中id一致

43abf068867b409ab332a11631c21ea0.png

如果启用了mysql的性能监控功能( 通过SHOW VARIABLES LIKE 'performance_schema'查看 ),可以通过performance_schema.threads 查看,其中有PROCESSLIST_ID,与上面的两个ID保持一致。

695caba10c9d4ea4934e3148c91deef8.png

Mysql OS thread

虽然每次打开连接,可以看到一个新的 mysql thread 产生,但是OS并不一定会为每个连接创建一个新的os thread。

首先,看看mysqld进程对应的所有os线程。

执行命令 ps -ef | grep mysql 得到mysqld的PID(进程ID)为 16286

999 16286 16267 4 22:39 ? 00:00:00 mysqld

ubuntu 16362 9909 0 22:39 pts/1 00:00:00 grep --color=auto mysql

通过top -H -p 16286 查看进程下的所有线程:

mysqld下有27个线程,PID为每个线程的ID。mysql thread和os thread并不能直接匹配起来。

2d677503425d4d70a42dec21c310ae71.png

可以通过一个例子来看看mysql thread与os thread的关系。

运行两个事务,每个事务往 test表中插入1000W条记录,事务处理时间较长。

在 processlist 表中可以看到两个执行 insert 操作的mysql thread.

d24559526e1d4b3e93dbfeaf22419b2b.png

在os threads中将会使用两个thread来进行实际的处理,top命令可以看到mysqld进程下的线程占用的CPU和内存情况。

00a2f0bde34b4c2e8ff86fdb367ad08e.png

也可以进行如下测试,会发现一些有趣的事情:

使用一个connection连接并按顺序执行几个事务,会使用不同的os thread来进行处理,当然,也可能是同一个os thread(如果只有一个os thread可用,所有事务会有同一个os thread处理;如果有多个os thread可用,将会轮换使用不同的os thread)。

如果kill掉任意一个os thread,mysql server将会shutdown。因此,不要尝试kill掉某个事务对应的os thread,毫无意义,mysql重新启动后,原先的事务该干的事还是得一样干完,以保证事务的ACID特性

如果你kill mysql thread,将不会影响到实际的os thread,但是该mysql thread将被删除。假如你正在执行一个 insert 事务且已经插入了100W数据,如果kill mysql thread,事务对应的trx_mysql_thread_id会设置为0,然后事务开始执行rollback

connection,mysql thread,os thread之间的关系

本小节的探讨基于 thread_handling=one-thread-per-connection,即线程模型是为每个连接分配一个mysql thread

三者的关联如下:

mysql会为每个connection创建一个对应mysql thread,连接关闭后,mysql thread生命周期也终止。这个mysql thread可以在processlist、threads表中查看

每个mysql threard将与一个os thread关联在一起,mysql thread销毁后,os thread不会被销毁,可以继续给其他mysql thread使用

如果所有os thread都被mysql thread用光了,下一个connection请求时将会创建新的os thread

下面做一个小测试:

假定max_connections=151, 使用以下语句应用中循环1000次不断获取连接并且不释放连接

DriverManager.getConnection(url, user, password);

可以观察到以下现象:

mysql将不断的创建mysql thread,由于没有闲置的os thread可用,也将不断创建os thread

当连接达到max_connections后,会报错:MySQLNonTransientConnectionException: Too many connections,同时mysql将无法再创建连接

达到max_connections后,可以手工处理掉空闲时间很长的连接,也可以等待连接达到 wait_timeout 设置的时间后被自动close掉。wait_timeout默认是8小时

一般应用都会通过连接池与DB交互,同时会定期通过连接发送请求(mysql 可以发送select 1) 给DB以重置connection的空闲时间

通过mysql thread找到os thread

通过查看innodb status

如果有事务正在执行,通过 show engine innodb status 查看事务信息,下面是该命令输出的部分信息:

------------

TRANSACTIONS

------------

...

1 lock struct(s), heap size 1136, 0 row lock(s), undo log entries 568226

MySQL thread id 65, OS thread handle 139656030103296, query id 229749097 218.104.153.55 test update

INSERT INTO test (uid, uid2, uid3)

VALUES (UUID(), UUID(), UUID())

可以看到mysql thread为65,OS thread为139656030103296

MySQL thread id 65, OS thread handle 139656030103296

通过查看threads表

题外话之mysql 官方说明:访问threads表对mysql没有什么性能影响,但访问processlist表或者show processlist对性能有一定影响,因为它们都需要mutex(互斥)

performance.threads 表中有 thread_os_id 字段,存储了mysql thread和os thread的关系

3759478f2ec544b4855ec1254c33adc1.png

关于 thread_os_id:

thread_os_id 是操作系统定义的thread或task标识符:

如果mysql thread在生命周期中与一个os thread关联,thread_os_id字段将包含os thread ID

如果mysql thread在生命周期中没有和os thread关联,thread_os_id将为NULL

在windows下,thread_os_id可以在任务管理器中看到;在linux下,thread_os_id和gettid()方法对应,可以使用perl 、ps -L命令或者使用proc文件系统(/proc/[pid]/task/[tid])

不过查阅许多资料后也没有结果,我也没有找到合适的方式将thread_os_id与os线程直接对应起来,只能侧面判断。

有资料 提供了一个偏方:通过gdb attach 命令来调试正在运行的程序,但是这会导致mysqld进程被暂停,并没有实际意义,不过本身找到mysql thread对应的os thread也没什么意义。先贴一下通过gdb attach得到的数据:

先执行gdb attach 11646 ,再执行info threads 命令,输入如下:

包含了线程ID和对应的16进制ID,资料显示:16进制ID在show engine innodb status输出信息中是可以看到的,不过我在mysql 5.7.18版本的输出信息中并未找到16进制的线程ID数据。

61e3c5e9a0124de0aff4db1b8453bd94.png

总结

通过上述讲述和一些例子,可以了解到以下几点:

连接管理线程会为每一个connection分配一个mysql thread来处理

mysql thread实际会使用某个os thread来处理请求

connection关闭或kill mysql thread时,mysql thread会销毁,但是os thread可以继续复用

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql thread conn_Mysql thread 与 OS thread 的相关文章

  • 【hadoop——HDFS操作常用的Shell命令】

    1 Hadoop分布式文件系统 Hadoop Distributed File System HDFS 是Hadoop核心组件之一 我们已经安装好了Hadoop 2 7 1 其中已经包含了HDFS组件 不需要另外安装 最基本的shell命令
  • 最新阿里云ECS服务器挂载数据盘亲测好用挂载成功分享一下

    最近网站打不开了 发现服务器系统盘不够用了 查看磁盘占用情况 系统盘已经快满了 不能考虑到后期的需求 不能每次都去清理 不得不增加数据盘 这里记录下数据盘的挂载过程 也是找了好多参考方法亲测成功分享出来希望可以帮助有需要朋友 总结方法如下
  • 【无标题】BTY-DNS推广机制及首次空投规则

    BTY DNS 致力于创建Web3领域中的去中心化身份 DID BTY DNS的 yuan域名自开放上线以来 获得广大用户的喜爱与勇跃注册 目前 yuan的域名注册量已近千个 BTY DNS具有推广奖励机制 同时对于持有DNS的用户将进行第
  • 软件人员kpi制定模板_软件项目团队绩效考核设计与薪酬激励设计

    关注 本头条号 更多关于制度 流程 体系 岗位 模板 方案 工具 案例 故事 图书 文案 报告 技能 职场等内容 弗布克15年积累免费与您分享 阅读导航 01 软件项目团队绩效考核设计 02 软件项目团队薪酬激励设计 研发部 软件项目团队绩
  • 图像通用操作Python的实现

    平时经常会对一个目录下的图像做统一处理 如缩放 旋转等等 之前使用C 处理 有时不是很方便 发现使用Python比较简单 代码量又很少 在Anacanda下执行起来也比较方便 因此 打算在后面遇到图像的常规处理时都将其实现放入到同一个py文
  • Java:数据集合List与Map的性能比较案例

    假设有这样的一个场景 一组学生数据 一组老师的数据 属性分别如下 public class Student private String courseId private String sduName public Student Stri
  • 一文讲清楚梯度下降算法

    一 随机梯度下降与经典梯度下降 1 经典梯度下降 经典的梯度下降法采用所有训练数据的平均损失来近似目标函数 可以看到每更新一次梯度 就需要计算所有训练数据 当M很大的时候 这需要很大的计算量 耗费很长的计算时间 2 随机梯度下降 随机梯度下
  • [从零开始学习FPGA编程-32]:进阶篇 - 基本时序电路-D触发器(Verilog语言)

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 目录 第1章 什么是时序电路 1 1 时序电路 1 2 什么是触发器
  • 点云 K-Means聚类算法 (附c++代码)

    一 K Means算法 在诸多的聚类方法中 K Means聚类方法是属于 基于原型的聚类 也称为原型聚类 的方法 此类方法均是假设聚类结构能通过一组原型刻画 在现实聚类中极为常用 通常情况下 该类算法会先对原型进行初始化 然后再对原型进行迭
  • Python正则表达式(一看就懂)

    目录 哈喽O O 什么是正则表达式 简单说 正则表达式是 正则表达式怎么用 sreach的用法 匹配连续的多个数值 字符 重复前面一个匹配字符一次或者多次 字符 重复前面一个匹配字符零次或者多次 字符 重复前面一个匹配字符零次或者一次 特殊
  • 【HDLBits 刷题 5】Circuits(1)Combinational Logic

    目录 写在前面 Combinational Logic Basic Gates Wire GND NOR Another gate Two gates More logic gates 7420 chips Truth table Two
  • render的使用

    在很多前端框架中 render 函数通常接受三个参数 val rec和idx 但具体的参数取决于你的应用框架和用法 通常情况下 val 表示当前要渲染的数据值 通常是当前单元格的值 rec 表示当前行的记录或数据对象 包含了这一行的各个字段
  • 某眼查的逆向

    一 准备 APP 某眼查 版本 11 4 0 工具 xposed FDex2 JustTrustMe Fiddler jadx 二 抓包 打开Fiddler 打开天眼查抓包 开启JustTrustMe能抓到包 我们抓取工商信息这块 查看Fi
  • UE Mesh Generation and Editing at Runtime

    UE Mesh Generation and Editing at Runtime 虚幻运行时和编辑器下生成和编辑 网格体 UE Mesh 虚幻中常用的三种网格体 UProceduralMeshComponent 程序化网格体 UStati
  • Java编写好的全国省市名称

    public class PlaceUtil public static final String place 北京市 市辖区 市辖县 天津市 市辖区 市辖县 安徽省 安庆市 蚌埠市 亳州市 巢湖市 池州市 滁州市 阜阳市 合肥市 淮北市
  • Tomcat设置虚拟主机时候startup闪退问题解决

    1 修改 startup bat 文件 将 call EXECUTABLE start CMD LINE ARGS 中的 start 改为 run 2 在 startup bat 文件的最后增加 pause 3 启动 tomcat 后相应错
  • 渗透学习 Linux基础知识

    你生来就值得被爱 这点你无需质疑 小白入坑学废集2 Linux 介绍 什么是Linux Linux系统结构 Linux常见发行版本 版本问题 磁盘分区表示 硬盘和分区结构 目录结构 目录名 Linux系统常用命令 命令行编辑的几个辅助操作
  • 力扣876. 链表的中间结点(java+python)

    给定一个头结点为 head 的非空单链表 返回链表的中间结点 如果有两个中间结点 则返回第二个中间结点 示例 1 输入 1 2 3 4 5 输出 此列表中的结点 3 序列化形式 3 4 5 返回的结点值为 3 测评系统对该结点序列化表述是
  • 【mysql系列】mysql安装和卸载详细教程

    mysql安装和卸载详细教程 一 安装 1 下载 2 安装 1 编辑 my ini 文件 2 初始化数据库 3 安装数据库 4 启动 mysql 服务 5 登录 mysql 数据库 6 更改密码 二 卸载 1 停止Mysql服务 2 卸载m

随机推荐

  • c 服务器信息 源代码,ftp服务器c源代码

    ftp服务器c源代码 内容精选 换一换 根据各功能的平台依赖性 需要分别准备两套环境 一套x86环境 一套鲲鹏环境 本文实际使用了如表1和表2两套环境 鲲鹏代码迁移工具是一款可以简化客户应用迁移到基于鲲鹏916 920的服务器的过程的工具
  • gta5因为计算机丢失xinput1,xinput1_3.dll_gta5丢失xinput1_3.dll_xinput1_3.dll win10

    xinput1 3 dll官方下载由起点下载免费提供 起点提供xinput1 3 dll官方下载 xinput1 3 dll是Microsoft DirectX for Windows的控制模块 当运行程序或者游戏时 系统弹出错误提示 找不
  • 【c语言】练手:一个简单的图书管理系统

    c语言 练手 一个简单的图书管理系统 最近在学习结构体和结构体指针等内容 为了巩固所学习的内容 于是写了一个简陋的图书管理系统 在敲代码过程中也遇到一些容易忽略的问题 于是记录下来 大家可以给给建议 核心功能主要有3个 录入书籍信息 打印书
  • Android 退出整个程序代码

    今天在网上看见个博客关于退出整个程序的 感觉不错 拿来分享学习 SysApplication这个类复制到工程里面 然后在每个Acitivity的oncreate方法里面通过SysApplication getInstance addActi
  • layui table 字体大小_layui table表格详解

    上次做table有些东西 忘记了 这次当作来个分析总结一下 跟大家共同学习 闲话不多说 直接上例子 代码 layuitable初始化代码 layui use table function var table layui table tabl
  • Https 公钥私钥交换过程

    记录一下Https 公钥私钥加密过程 对称加密 编 解码使用相同密钥的算法 一般是共享密钥 非对称加密 非对称加密算法需要两个密钥 公开密钥 publickey 简称公钥 和私有密钥 privatekey 简称私钥 公钥与私钥是一对 如果用
  • 滤波去噪和小波去噪

    原文 http zhidao baidu com linkurl 7vqgj2oQ4MacZxGLdJXM lTCDdW3TrY6hbeInWeW7NWgcCFjO8qHbbm0U8lONrAanc6BQR7WwJB0GRzgZXZQLK
  • 【云原生&Docker基础篇】Docker的安装与使用(适用于初学者)

    博客首页 派 大 星 欢迎关注 点赞 收藏 留言 本文由派大星原创编撰 系列专栏 Docker 云原生 本系列记录容器化技术的初次探险与深入思考历程 如有描述有误的地方还望诸佬不吝赐教 文章目录 Docker 是什么 Docker的优点 D
  • 机械硬盘分区 最佳性能方案

    原理 机械硬盘的通过磁头读写数据 由于角速度恒定 磁头越靠近外圈 扫描的扇区越多 读写速度越快 3个磁盘分区方案 假设 磁盘半径r 10 内层半径r1 2 5 中层半径r2 5 外层半径r3 7 5 内层面积 s1 r2xr2 r1xr1
  • Android APP 与STM32无线环境控制系统

    本系统为安卓APP的环境参数远程监控系统 以STM32F103单片机作为本设计的中控中心 结合物联网技术 以Android智能手机作为远程控制的客户端 通过8266 WiFi模块实现环境监控系统硬件与Android手机的交互 环境参数的反馈
  • Android学习——MultiAutoCompleteTextView组件

    1 编辑activity main xml文件 添加MultiAutoCompleteTextView组件
  • unity3d 5 GUI Texture不显示原因分析

    Unity5添加GUI组件game视图无显示可能原因如下 1 Transform position应该为0 1之间为屏幕占比 2 scale大小比例 3 如果用系统自带的第一人称控制器 组件中不包括GUI层 因此应该在添加组件中Render
  • WSL2使用cuda

    在微软最新发布的 Windows Insider 预览版本中 WSL2 获得了 GPU 计算支持 这意味着 Linux 二进制文件可以利用 GPU 资源 在 WSL 中进行机器学习 AI 开发或是数据科学等工作 微软在今年五月份的 Buil
  • Web安全基础-SQL MySQL

    文章目录 SQL简介 数据库简介 SQL语句 SELECT 语句 INSERT INTO 语句 Delete语句 Update 语句 Order by 语句 Where 语句 运算符 Limit 控制输出 MySQL注释符 MySQL基础
  • IntelliJ IDEA搭建一个Spring boot项目运行“Hello World”

    目录 IntelliJ IDEA搭建一个Spring boot项目 Hello World 创建新项目 1 Create New Project 2 创建Spring Boot项目 3 项目命名 4 搭建Web项目 5 选择项目目录 6 导
  • VMware tools详细教程 解决安装失败等问题

    1 打开虚拟机VMware Workstation 启动Ubuntu系统 菜单栏 虚拟机 安装VMware Tools 不启动Ubuntu系统是无法点击 安装VMware Tools 选项的 如下图 必须在虚拟机内部进行安装 2 如果弹出如
  • 创建安装程序Visual Studio Installer

    1 在vs2010 选择 新建项目 其他项目类型 Visual Studio Installer 安装项目 命名为 Setup1 这是在VS2010中将有三个文件夹 1 应用程序文件夹 表示要安装的应用程序需要添加的文件 2 用户的 程序
  • Redis的启动方式三种

    Redis的启动方式三种 启动一个 进入到redis中的src目录下 在控制台输入指令 redis server 注意 这样启动默认端口是 6379 进入客户端输入 redis cli 查看进程 杀死进程 指定端口启动redis服务 red
  • 如果使用Vue3.0实现一个 Modal,你会怎么进行设计?

    一 组件设计 组件就是把图形 非图形的各种逻辑均抽象为一个统一的概念 组件 来实现开发的模式 现在有一个场景 点击新增与编辑都弹框出来进行填写 功能上大同小异 可能只是标题内容或者是显示的主体内容稍微不同 这时候就没必要写两个组件 只需要根
  • mysql thread conn_Mysql thread 与 OS thread

    gt 欢迎阅读 陈同学博客原文 本文作为 Mysql插入2 6亿条垃圾数据后会发生什么 手工重现Mysql插入的 2 6亿 垃圾数据 的续篇 初始目的是想看看kill掉执行中的事务对应的os thread之后会发生什么 同时学习下mysql