mysql小白系列_03 体系结构-线程池
- thread pool的原理是什么?
- 为什么用double write就能解决page坏的问题?
- Innodb redo log 与 binlog有什么区别?有了Innodb redo log为什么还要binlog?
1. thread pool的原理是什么?
- 高并发、高性能
- 每一个连接到数据库都需要CPU分配线程栈,进行身份验证、建立上下文信息、执行请求、返回结果,关闭连接,释放资源
- 并发访问时,资源会被不断请求和释放,请求释放会大量消耗资源,导致资源率用率降低
- 线程池 预先创建一定是数量的线程,当有请求访问时,从线程池中分配一个线程提供服务,请求结束后,该线程又去服务其他请求,避免了线程和内存对象的频繁创建和释放,提高资源利用率,减少上下文切换和资源竞争
上下文信息指的是进程的描述信息,就是当前进程相关的寄存器内容、内存页表内容
用于当前进程被再次执行的时候,可以得到上次切换时的状态继续执行下去
mysql是单进程多线程的服务
mysql5.6以前:
采用的是One-Connection-Per-Thread,每线程一连接 当请求连接进来时,分配一个独立的线程,完成请求后销毁进程,再来请求,再分配线程
高并发下,会导致线程的频繁创建销毁,资源被浪费
thread-cache可以缓存线程,供下次使用,但无法解决高连接数问题 高连接数:高并发、高内存消耗、更多上下文切换、服务抖动
Thread-pool
- 线程处理的最小单位是statement,就是语句,一个线程可以处理多个连接请求。
3种连接管理方式
- No-Threads
主要用于调试,the server uses a single thread to handle one connection - One-Thread-Per-Connection
the server uses one thread to handle each client connection - dynamically-loaded
If the thread pool plugin is enabled, the server sets the thread_handling value to dynamicallyloaded.
thread pool参数
mysql> show variables like 'thread%';
+--------------------+---------------------------+
| Variable_name | Value |
+--------------------+---------------------------+
| thread_cache_size | |
| thread_concurrency | |
| thread_handling | one-thread-per-connection |
| thread_stack | |
+--------------------+---------------------------+
rows in set (0.01 sec)
- thread_cache_size 缓存起来可重用的线程数目
默认值是: 8 + max_connections / 100
How many threads the server should cache for reuse. When a client disconnects, the client's threads are put in the cache if there are fewer than thread_cache_size threads there. Requests for threads are satisfied by reusing threads taken from the cache if possible, and only when the cache is empty is a new thread created.
mysql> show variables like '%max_connections%';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | |
+-----------------+-------+
row in set (0.00 sec)
- thread_concurrency 5.7以后已经删除
This variable is specific to Solaris 8 and earlier systems, for which mysqld invokes the thr_setconcurrency() function with the variable value. This function enables applications to give the threads system a hint about the desired number of threads that should be run at the same time. Current Solaris versions document this as having no effect.
thread_handling 使用的线程池模型
thread_stack 每个线程堆栈大小,也就是么给线程被创建的时候,mysql给他分配的内存空间,单位是byte
The stack size for each thread.
- thread_pool_size 社区版没有这个参数
thread_pool_size: The number of thread groups in the thread pool. This is the most important
parameter controlling thread pool performance. If the primary storage engine is InnoDB, the optimal thread_pool_size setting is likely to be between 16 and 36, with the most common optimal values tending to be from 24 to 36. We have not seen any situation where the setting has been optimal beyond 36. There may be special cases where a value smaller than 16 is optimal.
mysql> show status like 'connections';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Connections | |
+---------------+-------+
row in set (0.00 sec)
mysql启动共接收的连接次数
mysql> show status like 'thread%';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Threads_cached | |
| Threads_connected | |
| Threads_created | |
| Threads_running | |
+-------------------+-------+
rows in set (0.00 sec)
Threads_cached 缓存的连接线程个数
Threads_connected 客户端已经连接上的线程个数
Threads_created 共创建的连接线程个数
Threads_running 与客户端活动的连接线程个数
查看进程的线程个数,使用pstack/pstree
yum install gdb,psmisc -y
IO多路复用 I/Om ultiplexing(select and poll)
- IO 写入经过两步骤
- 第一步等待数据准备好
- 第二部将数据从kernel中复制到进程
一个mysql数据包从网络到达服务器,首先被拷贝到系统kernel的buffer区域,然后再从kernel的buffer区域拷贝到应用程序的buffer,这里的应用程序应该指的是mysql。
- 阻塞
- 通常IO的操作指的是数据的读取、写入
- 当进程准备读取数据到buffer或者从cache写入数据disk,当发现数据没准备好,那么进程就会被挂起,也就是阻塞
- 当数据准备好了,进程开始工作,阻塞期间,CPU则被浪费
2. 为什么用double write就能解决page坏的问题?
什么是doublewrite?
指的是innodb存储引擎在写数据到表空间的时候,会写2次,写到日志文件只有1次
- mysql将脏数据flush到datafile的时候,先用memcopy将脏数据复制到内存的double write buffer上
- 然后通过double write buffer写到共享表空间(一个文件),然后马上调用fsync函数,同步到磁盘上
- 如果发生断电等原因造成carsh,page没完全写入对应的数据文件,那么就从double write buffer进行数据恢复
关于存储的概念
- sector扇区(windows里叫簇)
[root@docker02 ~]# fdisk -l|grep Sector
Sector size (logical/physical): bytes / bytes
- IO block 磁盘操作的逻辑单位块大小
[root@docker02 ~]# blockdev --getbsz /dev/mapper/centos-home
- OS blcok 操作系统存储数据的块大小
[root@docker02 ~]# getconf PAGESIZE
- DB block 数据库存储数据的块大小
mysql> show variables like 'innodb_page_size';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| innodb_page_size | |
+------------------+-------+
row in set (0.00 sec)
DB里的page指的是DB存储数据的块大小,也就是db block size
page问题
一个DB block写到磁盘的时候,会落在多个OS block,最终落在一个IO的一个或者多个扇区上 block上,也就是可能会产生部分页写到了磁盘上。
double write恢复机制
- double write buffer本身写失败,就是实例中的内存写失败,则重新从磁盘load数据进来,然后通过inndob事务日志进行数据redo
- double write buffer写成功,就是写文件成功,但是写数据文件最终存储失败,则double write buffer再写一次
- 恢复的时候,innodb比较页面page的checksum值,如果不一致,通过load数据+事务的方式计算出正确的数据
3. Innodb redo log 与 binlog有什么区别?有了Innodb redo log为什么还要binlog?
- binlog是mysql服务启动后的server层记录
- 记录的是事务的变更操作,不仅仅支持innodb,还支持其他存储引擎
- 属于逻辑记录
- 记录对数据的更改或者潜在更改
- For replication
- Certain data recovery operations require use of the binary log
- 在事务最终commit前写入binlog????根据sync_binlog值刷入磁盘
- redolog是innodb存储引擎使用的
- 记录的是该引擎自己的事务,没有mysql,一样可以运行存储数据
- 日志内容是关于每个页更改的物理情况,属于物理记录
- 数据最终被写入磁盘时,先写入到redolog
参考:
http://blog.csdn.net/guolong1983811/article/details/50421857
https://www.cnblogs.com/cchust/p/3961260.html
mysql小白系列_03 体系结构-线程池的更多相关文章
- Java并发编程系列-(6) Java线程池
6. 线程池 6.1 基本概念 在web开发中,服务器需要接受并处理请求,所以会为一个请求来分配一个线程来进行处理.如果每次请求都新创建一个线程的话实现起来非常简便,但是存在一个问题:如果并发的请求数 ...
- 并发编程系列:Java线程池的使用方式,核心运行原理、以及注意事项
并发编程系列: 高并发编程系列:4种常用Java线程锁的特点,性能比较.使用场景 线程池的缘由 java中为了提高并发度,可以使用多线程共同执行,但是如果有大量线程短时间之内被创建和销毁,会占用大量的 ...
- mysql小白系列_09 mysql性能优化关键点
一 服务器参数调优,有哪些关键点? 1. 应用访问优化 优化方法 性能提升效果 优化成本 说明 减少数据访问能不访问就不访问-减少磁盘IO 1~1000 低 缓存服务器缓存mysql数据,Redis. ...
- 【java线程系列】java线程系列之java线程池详解
一线程池的概念及为何需要线程池: 我们知道当我们自己创建一个线程时如果该线程执行完任务后就进入死亡状态,这样如果我们需要在次使用一个线程时得重新创建一个线程,但是线程的创建是要付出一定的代价的,如果在 ...
- java多线程系列六、线程池
一. 线程池简介 1. 线程池的概念: 线程池就是首先创建一些线程,它们的集合称为线程池. 2. 使用线程池的好处 a) 降低资源的消耗.使用线程池不用频繁的创建线程和销毁线程 b) 提高响应速度,任 ...
- elasticsearch 5.x 系列之二 线程池的设置
1,概述 每个Elasticsearch节点内部都维护着多个线程池,如index.search.get.bulk等,用户可以修改线程池的类型和大小,以及其他的比如reflesh, flush,warm ...
- 线程池系列一:线程池作用及Executors方法讲解
线程池的作用: 线程池作用就是限制系统中执行线程的数量. 根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果:少了浪费了系统资源,多了造成系统拥挤效率不高.用线程池控制线程数量 ...
- (Java多线程系列九)线程池
线程池 1.什么是线程池 线程池是指在初始化一个多线程应用程序过程中创建一个线程集合,然后在需要执行新的任务时重用这些线程而不是新建一个线程.线程池中线程的数量通常取决于可用内存数量和应用程序的需求. ...
- Android进阶——多线程系列之四大线程池的使用介绍
线程池一直是初学者最抵触的东西,由于刚开始学习做项目并不会涉及到线程池的使用,但是不去学习它,心里又好像有个石头一直沉着,一直放心不下,其实是很简单的东西,早晚都要学,不如趁现在吧.由于文章从初学者的 ...
随机推荐
- 2019-2020-1 20199303 《Linux内核原理与分析》 第十一周作业
缓冲区溢出漏洞实验 安装一些用于编译C程序的32位软件包 sudo apt-get install -y lib32z1 libc6-dev-i386 sudo apt-get install -y ...
- 虚拟化KVM之概述(一)
云计算基本概述 云计算是一种按使用量付费的模式,这种模式提供可用的.便捷的.按需的网络访问,进入可配置的计算资源共享池(资源包括网络,服务器,存储,应用程序,服务),这些资源能够被快速提供,只需投入很 ...
- 自建Git服务器 - 创建属于你自己的代码仓库
最近有线上朋友私信问我怎么搭建个人博客,也有咨询我个人项目的代码是如何保管的,还有一个朋友问我买了服务器玩了一段时间,等新鲜感过了就不知道做什么了. 关于这些问题并没有一个标准答案,每个人都有自己的使 ...
- 打造更好用的 EF 自动审计
打造更好用的 EF 自动审计 Intro 上次基于 EF Core 实现了一个自动审计的功能,详细可以参考 https://www.cnblogs.com/weihanli/p/auto-audit- ...
- Java Web:jstl处理字符串
用法:${fn:methodName(args....)} 在使用这些函数之前必须在JSP中引入标准函数的声明<%@ taglib prefix="fn" uri=" ...
- 【学习笔记:Python-网络编程】Socket 之初见
Socket 是任何一种计算机网络通讯中最基础的内容.当你在浏览器地址栏中输入一个地址时,你会打开一个套接字,可以说任何网络通讯都是通过 Socket 来完成的. Socket 的 python 官方 ...
- Jenkins联动码云自动匹配分支进行构建流水线
一.安装Generic Webhook Trigger插件 二.创建项目 创建项目之前先准备自己的项目,如果没有可以我fork的一个项目.地址是:https://gitee.com/jokerbai/ ...
- 如何使用thrift 服务引擎组件
在本文中将介绍如果通过thrift 组件集成到surging 微服务引擎中,然后可以选择dotnetty 或thrift作为服务远程调用RPC,也可以通过其它语言的thrift 调用surging 服 ...
- 【python】numpy库和matplotlib库学习笔记
Numpy库 numpy:科学计算包,支持N维数组运算.处理大型矩阵.成熟的广播函数库.矢量运算.线性代数.傅里叶变换.随机数生成,并可与C++/Fortran语言无缝结合.树莓派Python v3默 ...
- 自己封装函数,实现数组的内置方法indexOf的功能
在学习或开发过程中,经常会有朋友需要使用到一个数组方法-indexOf,这里我们先来谈谈它的功能:返回指定数据所在的索引,如果没有则返回-1. 那么我们在使用时通常是直接使用它这个数组内置方法 今天这 ...