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进阶——多线程系列之四大线程池的使用介绍
线程池一直是初学者最抵触的东西,由于刚开始学习做项目并不会涉及到线程池的使用,但是不去学习它,心里又好像有个石头一直沉着,一直放心不下,其实是很简单的东西,早晚都要学,不如趁现在吧.由于文章从初学者的 ...
随机推荐
- Akka 集群单例Cluster Singleton
一.简介 集群中Cluster Singleton 集群中有而只一个单例,可应用于集群全局调控,单一运算决策,中央命名服务或中央路由等应用场景 二.依赖 dependencies { compile ...
- Libra教程之:move语言的特点和例子
文章目录 move语言的特点 资源优先 灵活性 安全性 可验证性 Move语句初探 点对点支付交易脚本 Currency Module move语言的特点 Libra的目标是打造一个全球话的金融和货币 ...
- 【linux运维】rsync+inotify与sersync+rsync实时数据同步笔记
Rsync(remote sync)远程同步工具,通过rsync可以实现对远程服务器数据的增量备份通过,但rsync自身也有缺陷,同步数据时,rsync采用核心算法对远程服务器的目标文件进行对比,只进 ...
- 初入React源码(一)
导语 React是我接触的第二个框架,我最初开始接触的是vue,但是并没有深入的理解过vue,然后在工作过程中,我开始使用了React,现在已经觉得React会比vue更加实用,但是这只是个人观点,可 ...
- MySQL数据库的套接字文件和pid文件
MySQL数据库的套接字文件和pid文件 socket文件:当用Unix域套接字方式进行连接时需要的文件. pid文件:MySQL实例的进程ID文件. MySQL表结构文件:用来存放MySQL表结构定 ...
- 由JS数组去重说起
一.问题描述: var array=[1,45,3,1,4,67,45],请编写一个函数reDup来去掉其中的重复项,即 reDup(array); console.log(array);//[1,4 ...
- .user.ini 无法修改/删除 怎么办?
首先 了解chattr命令: Linux chattr命令用于改变文件属性. 这项指令可改变存放在ext2文件系统上的文件或目录属性,这些属性共有以下8种模式: a:让文件或目录仅供附加用途.b:不更 ...
- P1466 集合 Subset Sums 搜索+递推+背包三种做法
题目描述 对于从1到N (1 <= N <= 39) 的连续整数集合,能划分成两个子集合,且保证每个集合的数字和是相等的.举个例子,如果N=3,对于{1,2,3}能划分成两个子集合,每个子 ...
- Ant 环境安装
1.下载安装 Ant,配置环境变量 进入 http://ant.apache.org/bindownload.cgi 下载 Ant 配置环境变量 新建 ANT_HOME 配置 Path 环境变量 配置 ...
- ubuntu 和 centos 如何区分系统
Ubuntu Ubuntu有着漂亮的用户界面,完善的包管理系统,强大的软件源支持,丰富的技术社区,Ubuntu还对大多数硬件有着良好的兼容性,包括最新的图形显卡等等.这一切让Ubuntu越来越向大众化 ...