@wxf
2018-01-25T10:00:35.000000Z
字数 6794
阅读 1009
【实战课】MySql性能管理及架构设计
服务器硬件对MySQL性能的影响可总结为如下几点:
内核相关参数(/etc/sysctl.conf)
网络相关
对于一个tcp链接来说服务器与客户端之间需要三次握手来建立网络链接,当三次握手成功后可以通过
netstat
命令查看端口状态由监听变为可链接,接着这条链路上就可以传输数据了。
net.core.somaxconn=65535
【设置每个端口最大的监听队列长度,一般设为2048即可】 net.core.netdev_max_backlog=65535
【网络接口接收数据快于内核处理速度时,允许被发送到队列中的数据包的数量】 net.ipv4.tcp_max_syn_backlog=65535
【还未获得对方链接的请求可保存到队列中的最大数目】net.ipv4.tcp_fin_timeout=10
【用于控制tcp链接的等待状态的时间,可适当减少等待状态的时间,以加快tcp链接的回收速度】 net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_tw_recycle=1
net.core.wmem_default=87380
【发送套接字缓冲区大小的默认值(以字节为单位)】 net.core.wmem_max=16777216
net.core.rmem_default=87380
【接收套接字缓冲区大小的默认值(以字节为单位)】 net.core.rmem_max=16777216
net.ipv4.tcp_keepalive_time=120
net.ipv4.tcp_keepalive_intvl=30
net.ipv4.tcp_keepalive_probes=3
内存相关
kernel.shmmax=4294967295
【定义单个共享内存段的最大值,该值应该足够大,以便能在一个共享内存段下容纳下整个的Innodb缓冲池的大小。说明:对于64位系统,可取值的最大值为物理内存值-1byte,建议值为大于物理内存的一半,一般取值大于Innodb缓冲池的大小即可。】
vm.swappiness=0
【当内存不足时,该参数会对性能产生比较明显的影响。该参数是告诉Linux内核除非虚拟内存完全满了,否则不要使用交换分区。】
增加资源限制(/etc/security/limit.conf)
* soft nofile 65535
* hard nofile 65535
将上面两个参数加到limit.conf文件的末尾即可,需重启操作系统才能生效。
说明:
关键字 | 说明 |
---|---|
* | 表示对所有用户有效 |
soft | 指的是当前系统生效的设置 |
hard | 表明系统中所能设定的最大值 |
nofile | 表示所限制的资源是打开文件的最大数目 |
65535 | 限制的数量 |
硬盘调度策略(/sys/block/设备名/queue/scheduler)
参考:磁盘IO调度算法
说明:
客户端(Java、C API、.Net以及JDBC等),在客户端层面主要完成的是链接处理授权认证等功能。每个链接到MySql的客户端都会在进程中拥有一个线程。链接的查询只会在这个单独的线程中执行,也就是每个链接的查询只能用到一个CPU的核心。
MySql服务层,包括链接管理器、查询缓存、查询解析、查询优化器以及所有的内置函数等。
存储引擎层(innodb,myisam,XtraDB等),了解MySql存储引擎对我们后面优化MySql性能有重要的影响。
MySql5.5之前版本默认存储引擎
特性:
check table tablename
(检查表状态);repair table tablename
(修复数据表)myisampack -b 表名.MYI
。使用场景:
MySql5.5之后版本默认存储引擎,Innodb是事务型存储引擎,它是支持事务的ACID特性的。Innodb使用表空间进行数据存储。
Innodb有表空间的概念,表中的数据是存储在表空间的。而参数innodb_file_per_table
决定了使用什么样的表空间,若值为NO
则表示数据会存储到独立表空间(tablename.ibd);若值为OFF
则表示数据会存储到系统共享表空间(ibdataX)。
查看innodb_file_per_table值的方式:
show variables like 'innodb_file_per_table';
设置innodb_file_per_table值的方式:set global innodb_file_per_table = off;
那么问题来了,如何选择系统表空间和独立表空间呢?
1.比较:
optimize table
命令收缩系统文件2.建议:使用独立表空间
表空间转移的步骤(把原来存在于系统表空间中的表转移到独立表空间中的方法):
Innodb存储引擎的特性
innodb_log_buffer_size
参数决定,查看方式:show variables like 'innodb_log_buffer_size'
。ib_logfile
开头的文件,该文件数量由innodb_log_files_in_group
参数决定。Innodb支持行级锁,行级锁可以最大限度的支持并发(写操作时锁定的资源更少),行级锁是由存储引擎层实现的。
锁的类型
-: | 写锁 | 读锁 |
---|---|---|
写锁 | 不兼容 | 不兼容 |
读锁 | 不兼容 | 兼容 |
锁的粒度
show engine innodb status
CSV存储引擎是基于CSV格式文件存储数据的。
.csv
文件存储表内容 .csm
文件存储表的元数据如表状态和数据量 .frm
文件存储表结构信息也称为HEAP存储引擎,所以数据保存在内存中,具有易失性。
Memory存储引擎的特点:
max_heap_table_size
参数决定(其对已经创建的数据表无效)适用场景:
mysqld --help --verbose | grep -A 1 'Default options'
/etc/my.cnf
/etc/mysql/my.cnf
/home/mysql/my.cnf
~/.my.cnf
确定MySql的每个链接使用的内存,禁止给每个链接分配的内存过大。MySql对于一些缓存会单独分配给每个链接的,主要有以下几个:
参数名 | 名称及作用 | 注意事项 |
---|---|---|
sort_buffer_size | 排序缓存区,该参数定义了MySql每个线程使用的排序缓存区的大小。 | MySql并不是在链接初始化时为每个缓冲区分配内存,而是在有排序操作时才会为每个缓冲区分配内存,此时会分配该参数指定大小的全部内存。 |
join_buffer_size | 链接缓存区,该参数定义了MySql每个线程使用的链接缓存区的大小。 | 如果一个查询关联了多张表,那么就会为每个关联分配一个链接缓存区。所以每个查询可能会有多个链接缓存区。 |
read_buffer_size | 读缓存区,该参数定义了当对MyISAM表进行全表扫描时所分配的读缓存区大小 | MySql只会在有查询需要时才会对该缓存分配内存。同样分配该参数指定大小的全部内存。注意:该参数的大小一定要是4K的倍数。 |
read_rnd_buffer_size | 索引缓存区 | MySql只会在有查询需要时才会对该缓存分配内存。同样分配该参数指定大小的全部内存。 |
select sum(index_length) from information_schema.tables where engine = 'myisam';
这部分参数决定了MySql如何同步缓存区的数据到磁盘上。下面主要介绍一下Innodb引擎的I/O相关参数。
innodb_log_file_size和innodb_log_files_in_group这个两个参数决定了Innodb事务日志(Redo Log)的大小和数量。Innodb是一种事务型的存储引擎,为了减少提交事务时产生的开销Innodb使用了预写日志的方式,也就是每次提交事务时会先将数据写入到事务日志中,而不是每次都把修改后的数据写入到数据文件中,从而提高I/O性能。
注意:事务日志是循环使用的,写满一个文件后才会继续写下一个。
一般来说事务日志的总大小可以记录服务器一个小时左右的事务信息即可。
事务日志并不是每次提交都写到事务日志文件中的,而是先写入到事务日志的缓冲区中。