【mysql】关于IO/内存方面的一些优化
这里使用的是mysql Ver 14.14 Distrib 5.6.19, for Linux (i686) using EditLine wrapper
一、mysql目录文件
ibdata1:系统表空间 包含数据字典、回滚日志/undolog等
(insert buffer segment/double write segment/rollback segment/index segment/dictionary segment/undo segment)
ib_logfile0/ib_logfile1:事务日志/redolog
mysql-relay-bin:中继日志
binarylog:二进制日志
general_log.log:常规日志
mysql_error.log:错误日志
slow_query.log:慢日志
.ibd:用户表空间-数据文件(insert buffer bitmap page/leaf page segment/none leaf page segment)
Innodb buffer pool(内存):undo page /insert buffer page/adaptive hash index/index page/lock info/data dictionary
二、mysql线程
FILE IO
- --------
- FILE I/O
- --------
- I/O thread 0 state: waiting for i/o request (insert buffer thread)
- I/O thread 1 state: waiting for i/o request (log thread)
- I/O thread 2 state: waiting for i/o request (read thread)
- I/O thread 3 state: waiting for i/o request (read thread)
- I/O thread 4 state: waiting for i/o request (read thread)
- I/O thread 5 state: waiting for i/o request (read thread)
- I/O thread 6 state: waiting for i/o request (write thread)
- I/O thread 7 state: waiting for i/o request (write thread)
- I/O thread 8 state: waiting for i/o request (write thread)
- I/O thread 9 state: waiting for i/o request (write thread)
- Pending normal aio reads: 0 [0, 0, 0, 0] , aio writes: 0 [0, 0, 0, 0] ,
- ibuf aio reads: 0, log i/o's: 0, sync i/o's: 0
- Pending flushes (fsync) log: 0; buffer pool: 0
- 393 OS file reads, 5 OS file writes, 5 OS fsyncs
- 0.00 reads/s, 0 avg bytes/read, 0.00 writes/s, 0.00 fsyncs/s
innodb后台所有线程
- | thread/sql/main | BACKGROUND | YES |
- | thread/innodb/io_handler_thread | BACKGROUND | YES |
- | thread/innodb/io_handler_thread | BACKGROUND | YES |
- | thread/innodb/io_handler_thread | BACKGROUND | YES |
- | thread/innodb/io_handler_thread | BACKGROUND | YES |
- | thread/innodb/io_handler_thread | BACKGROUND | YES |
- | thread/innodb/io_handler_thread | BACKGROUND | YES |
- | thread/innodb/io_handler_thread | BACKGROUND | YES |
- | thread/innodb/io_handler_thread | BACKGROUND | YES |
- | thread/innodb/io_handler_thread | BACKGROUND | YES |
- | thread/innodb/io_handler_thread | BACKGROUND | YES |
- | thread/innodb/srv_master_thread | BACKGROUND | YES |
- | thread/innodb/srv_purge_thread | BACKGROUND | YES |
- | thread/innodb/srv_monitor_thread | BACKGROUND | YES |
- | thread/innodb/srv_error_monitor_thread | BACKGROUND | YES |
- | thread/innodb/srv_lock_timeout_thread | BACKGROUND | YES |
- | thread/innodb/page_cleaner_thread | BACKGROUND | YES |
- | thread/sql/signal_handler | BACKGROUND | YES |
- | thread/sql/slave_sql | BACKGROUND | YES |
- | thread/sql/slave_io | BACKGROUND | YES |
IO线程分别是insert buffer thread、log thread、read thread、write thread。
Too many thread stacks make CPU caches almost useless in highly parallel execution workloads. The thread pool promotes thread stack reuse to minimize the CPU cache footprint.
With too many threads executing in parallel, context switching overhead is high. This also presents a challenging task to the operating system scheduler. The thread pool controls the number of active threads to keep the parallelism within the MySQL server at a level that it can handle and that is appropriate for the server host on which MySQL is executing.
Too many transactions executing in parallel increases resource contention. In InnoDB, this increases the time spent holding central mutexes. The thread pool controls when transactions start to ensure that not too many execute in parallel.
三、mysql访问文件流程
Transaction 来自网络
三、影响IO/内存的一些参数
1、innodb_flush_log_at_trx_commit 设置为2
这参数是指 事务log(ib_logfile0、ib_logfile1)以怎样的方式写入到log buffer
=0 mysql crash 就丢失了,性能最好
buffer pool -> log buffer 每秒 wirte os cache & flush磁盘
=1 不会丢失,效率低
buffer pool -> log buffer 每次 write os cache & flush磁盘
=2 即使mysql崩溃也不会丢数据
buffer pool -> os cache 每秒flush 磁盘
2、sync_binlog
sync_binlog
次后,刷写到磁盘。如果 autocommit
开启,每个语句都写一次 binary log,否则每次事务写一次。
默认值是 0
,不主动同步,而依赖操作系统本身不定期把文件内容 flush 到磁盘
设为 1
最安全,在每个语句或事务后同步一次 binary log,即使在崩溃时也最多丢失一个语句或事务的日志,但因此也最慢。
大多数情况下,对数据的一致性并没有很严格的要求,所以并不会把 sync_binlog
配置成 1,
为了追求高并发,提升性能,可以设置为 100
或直接用 0
3、write/read thread
异步IO线程数
innodb_write_io_threads=16
innodb_read_io_threads=16
(该参数需要在配置文件中添加,重启mysql实例起效)
脏页写的线程数,加大该参数可以提升写入性能
4、innodb_max_dirty_pages_pct
最大脏页百分数,
当系统中脏页所占百分比超过这个值,INNODB就会进行写操作以把页中的已更新数据写入到磁盘文件中。默认75,一般现在流行的SSD硬盘很难达到这个比例。可依据实际情况在75-80之间调节
5、innodb_io_capacity=5000
从缓冲区刷新脏页时,一次刷新脏页的数量。根据磁盘IOPS的能力一般建议设置如下:
SAS 200
SSD 5000
PCI-E 10000-50000
6、innodb_flush_method=O_DIRECT(该参数需要重启mysql实例起效)
控制innodb 数据文件和redo log的打开、刷写模式。有三个值:fdatasync(默认),O_DSYNC,O_DIRECT。
fdatasync模式:写数据时,write这一步并不需要真正写到磁盘才算完成(可能写入到操作系统buffer中就会返回完成),真正完成是flush操作,buffer交给操作系统去flush,并且文件的元数据信息也都需要更新到磁盘。
O_DSYNC模式:写日志操作是在write这步完成,而数据文件的写入是在flush这步通过fsync完成。
O_DIRECT模式:数据文件的写入操作是直接从mysql innodb buffer到磁盘的,并不用通过操作系统的缓冲,而真正的完成也是在flush这步,日志还是要经过OS缓冲。
通过图可以看出O_DIRECT相比fdatasync的优点是避免了双缓冲,本身innodb buffer pool就是一个缓冲区,不需要再写入到系统的buffer,但是有个缺点是由于是直接写入到磁盘,所以相比fdatasync的顺序读写的效率要低些。
在大量随机写的环境中O_DIRECT要比fdatasync效率更高些,顺序写多的话,还是默认的fdatasync更高效。
7、innodb_adaptive_flushing 设置为 ON (使刷新脏页更智能)
影响每秒刷新脏页的数目
规则由原来的“大于innodb_max_dirty_pages_pct时刷新100个脏页到磁盘”变为 “通过buf_flush_get_desired_flush_reate函数判断重做日志产生速度确定需要刷新脏页的最合适数目”,即使脏页比例小于 innodb_max_dirty_pages_pct时也会刷新一定量的脏页。
8、innodb_adaptive_flushing_method 设置为 keep_average
影响checkpoint,更平均的计算调整刷脏页的速度,进行必要的flush.(该变量为mysql衍生版本Percona Server下的一个变量,原生mysql不存在)
9、innodb_stats_on_metadata=OFF
关掉一些访问information_schema库下表而产生的索引统计。
当重启mysql实例后,mysql会随机的io取数据遍历所有的表来取样来统计数据,这个实际使用中用的不多,建议关闭.
10、innodb_change_buffering=all
当更新/插入的非聚集索引的数据所对应的页不在内存中时(对非聚集索引的更新操作通常会带来随机IO),会将其放到一个insert buffer中,当随后页面被读到内存中时,会将这些变化的记录merge到页中。当服务器比较空闲时,后台线程也会做merge操作。
由于主要用到merge的优势来降低io,但对于一些场景并不会对固定的数据进行多次修改,此处则并不需要把更新/插入操作开启change_buffering,如果开启只是多余占用了buffer_pool的空间和处理能力。这个参数要依据实际业务环境来配置。
11、innodb_old_blocks_time=1000
使Block在old sublist中停留时间长为1s,不会被转移到new sublist中,避免了Buffer Pool被污染BP可以被认为是一条长链表。被分成young 和 old两个部分,其中old默认占37%的大小(由innodb_old_blocks_pct 配置)。靠近顶端的Page表示最近被访问。靠近尾端的Page表示长时间未被访问。而这两个部分的交汇处成为midpoint。每当有新的Page需要加载到BP时,该page都会被插入到midpoint的位置,并声明为old-page。当old部分的page,被访问到时,该page会被提升到链表的顶端,标识为young。
由于table scan的操作是先load page,然后立即触发一次访问。所以当innodb_old_blocks_time =0 时,会导致table scan所需要的page不读的作为young page被添加到链表顶端。而一些使用较为不频繁的page就会被挤出BP,使得之后的SQL会产生磁盘IO,从而导致响应速度变慢。
这时虽然mysqldump访问的page会不断加载在LRU顶端,但是高频度的热点数据访问会以更快的速度把page再次抢占到LRU顶端。从而导致mysqldump加载入的page会被迅速刷下,并立即被evict(淘汰)。因此,time=0或1000对这种压力环境下的访问不会造成很大影响,因为dump的数据根本抢占不过热点数据。不只dump,当大数据操作的时候也是如此。
12、binlog_cache_size
二进制日志缓冲大小:一个事务,在没有提交(uncommitted)的时候,产生的日志,记录到Cache中;等到事务提交(committed)需要提交的时候,则把日志持久化到磁盘。
怎么判断我们当前的binlog_cache_size设置的没问题呢?
- mysql> show status like 'binlog_%';
- +-----------------------+-----------+
- | Variable_name | Value |
- +-----------------------+-----------+
- | Binlog_cache_disk_use | 1425 |
- | Binlog_cache_use | 126945718 |
- +-----------------------+-----------+
- 2 rows in set (0.00 sec)
- mysql> select @@binlog_cache_size;
- +---------------------+
- | @@binlog_cache_size |
- +---------------------+
- | 1048576 |
- +---------------------+
- 1 row in set (0.00 sec)
运行情况Binlog_cache_use 表示binlog_cache内存方式被用上了多少次,Binlog_cache_disk_use表示binlog_cache临时文件方式被用上了多少次
13、innodb_file_per_table
innodb_file_per_table=1
独立表空间
优点:
每个表的数据和索引都会存在自已的表空间中
可以实现单表在不同的数据库中移动
空间可以回收(除drop table操作)
删除大量数据后可以通过:alter table TableName engine=innodb;回缩不用的空间
使用turncate table也会使空间收缩
对于使用独立表空间的表,不管怎么删除,表空间的碎片不会太严重的影响性能
缺点:单表增加过大,如超过100个G
结论:共享表空间在Insert操作上少有优势。其它都没独立表空间表现好。当启用独立表空间时,请合理调整一 下:innodb_open_files ,InnoDB Hot Backup(冷备)的表空间cp不会面对很多无用的copy了。而且利用innodb hot backup及表空间的管理命令可以实现单现移动。
14、增加本地端口,以应对大量连接
echo ‘1024 65000′ > /proc/sys/net/ipv4/ip_local_port_range
该参数指定端口的分配范围,该端口是向外访问的限制。mysql默认监听的3306端口即使有多个请求链接,也不会有影响。但是由于mysql是属于高内存、高cpu、高io应用,不建议把多少应用于mysql混搭在同一台机器上。即使业务量不大,也可以通过降低单台机器的配置,多台机器共存来实现更好。
15、增加队列的链接数
echo ‘1048576’ > /proc/sys/net/ipv4/tcp_max_syn_backlog
建立链接的队列的数越大越好,但是从另一个角度想,实际环境中应该使用连接池更合适,避免重复建立链接造成的性能消耗。使用连接池,链接数会从应用层面更可控些。
16、设置链接超时时间
echo ’10’ > /proc/sys/net/ipv4/tcp_fin_timeout
该参数主要为了降低TIME_WAIT占用的资源时长。尤其针对http短链接的服务端或者mysql不采用连接池效果比较明显。
参考文章
http://dev.cmcm.com/archives/107/comment-page-1
http://www.zhdba.com/mysqlops/2012/05/24/mysql-io/
http://blog.itpub.net/22664653/viewspace-1063134/
http://liyangliang.me/posts/2014/03/innodb_flush_log_at_trx_commit-and-sync_binlog/
http://www.cnblogs.com/snifferhu/p/4736479.html
http://www.cnblogs.com/xuanzhi201111/p/4040681.html
http://mysqllover.com/?p=636
【mysql】关于IO/内存方面的一些优化的更多相关文章
- MySQL服务器 IO 100%的分析与优化方案
前言 压力测试过程中,如果因为资源使用瓶颈等问题引发最直接性能问题是业务交易响应时间偏大,TPS逐渐降低等.而问题定位分析通常情况下,最优先排查的是监控服务器资源利用率,例如先用TOP 或者nmon等 ...
- jemalloc优化MySQL、Nginx内存管理
上一篇文章<TCMalloc优化MySQL.Nginx.Redis内存管理>,下面来看下jemalloc jemalloc源于Jason Evans 2006年在BSDcan confer ...
- 高性能MySQL笔记 第6章 查询性能优化
6.1 为什么查询速度会慢 查询的生命周期大致可按照顺序来看:从客户端,到服务器,然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端.其中“执行”可以认为是整个生命周期中最重要的阶段. ...
- MySQL查询语句执行过程及性能优化(JOIN/ORDER BY)-图
http://blog.csdn.net/iefreer/article/details/12622097 MySQL查询语句执行过程及性能优化-查询过程及优化方法(JOIN/ORDER BY) 标签 ...
- mysql案例~关于linux服务器本身的优化问题
简介:mysql服务优化分为 1服务器本身的优化 2mysql本身的性能优化 今天咱们来讨论下服务器本身的优化性能 一 参数的优化简介 1 文件系统的选择 Linux 常用文件系统: ext3, ex ...
- MySQL占用IO过高解决方案【转】
1.日志产生的性能影响: 由于日志的记录带来的直接性能损耗就是数据库系统中最为昂贵的IO资源.MySQL的日志包括错误日志(ErrorLog),更新日志(UpdateLog),二进制日志(Binlog ...
- MySQL查询语句执行过程及性能优化-查询过程及优化方法(JOIN/ORDER BY)
在上一篇文章MySQL查询语句执行过程及性能优化-基本概念和EXPLAIN语句简介中介绍了EXPLAIN语句,并举了一个慢查询例子:
- mysql(4):性能分析和性能优化
性能分析 慢查询日志分析 ①查询慢查询日志的状态 show global variables like '%slow_query_log%'; ②开启慢查询日志(当mysql重启时会重置) set g ...
- MySQL读写IO的操作过程解析
数据库作为存储系统,所有业务访问数据的操作都会转化为底层数据库系统的IO行为(缓存系统也可以当做是key-value的数据库),本文主要介绍访问MySQL数据库的IO流程以及IO相关的参数. 一.My ...
随机推荐
- 【转】sql server开启全文索引方法
利用系统存储过程创建全文索引的具体步骤: 1) 启动数据库的全文处理功能 (sp_fulltext_database) 2) 建立全文目录 (sp_fulltext_catalog) 3) 在全文目录 ...
- mysql 输出当前月所有日期与对应的星期
其实可以用存储过程,但想用另一种方法实现: 首先创建一个辅助表,可以设置CREATE TABLE `t4` ( `id` ) NOT NULL AUTO_INCREMENT, `num` ) DEFA ...
- PowerDesigner的安装和数据库创建(转载)
此文描述详细,特此转载,仅复制了大部分内容,可参考原文CodeSmith和PowerDesigner的安装和数据库创建(原创) 请大家不要用于商业用途哈,要支持正版,大家都是做软件的,知道开发一套软件 ...
- Winform开发框架的重要特性总结
从事Winform开发框架的研究和推广,也做了有几个年头了,从最初的项目雏形到目前各种重要特性的加入完善,是经过了很多项目的总结归纳和升华,有些则是根据客户需要或者应用前景的需要进行的完善,整个Win ...
- 重新想象 Windows 8.1 Store Apps (80) - 控件增强: WebView 之基本应用, POST 数据, 与 JavaScript 交互
[源码下载] 重新想象 Windows 8.1 Store Apps (80) - 控件增强: WebView 之基本应用, POST 数据, 与 JavaScript 交互 作者:webabcd 介 ...
- 将C1Chart数据导出到Excel
大多数情况下,当我们说将图表导出到Excel时,意思是将Chart当成图片导出到Excel中.如果是这样,你可以参考帮助文档中保存和导出C1Chart章节. 不过,也有另一种情况,当你想把图表中的数据 ...
- 环境搭建二 secureCRT配置
上一篇里面讲到了虚拟机安装,以及secureCRT的远程连接.此篇文章介绍secureCRT的配置. 颜色设置 参考 http://jingyan.baidu.com/article/a681b0 ...
- Python数学运算的一个小算法(求一元二次方程的实根)
请定义一个函数quadratic(a, b, c),接收3个参数,返回一元二次方程:ax² + bx + c = 0的两个解. #!/usr/bin/env python # -*- coding: ...
- javascript Array 方法学习
原生对象Array学习 Array.from() 从类似数组的对象或可迭代的对象返回一个数组 参数列表 arraylike 类似数组的对象或者可以迭代的对象 mapfn(可选) 对对象遍历映 ...
- SQL2012 提示评估已过期 解决方案- sql server问题
SQL2012 提示评估已过期 解决方案提示评估已过期的解决方法和 sql2008一样 第1步:进入SQL2012配置工具中的安装中心第2步:再进入维护界面,选择版本升级第3步:进入产品密钥,输入密钥 ...