硬件略...
系统
swap调整
cat /proc/sys/vm/swappiness
30 内存剩余30% 使用swap
echo 0 >/proc/sys/vm/swapiness 的内容改成0(临时)
vim /etc/sysctl.conf
上添加vm.swappiness=0(永久)
sysctl -p
IO调度策略
centos 7 默认是deadline
cat /sys/block/sda/queue/scheduler
临时更改为deadline(6)
echo deadline >/sys/block/sda/queue/scheduler
vi /boot/grub/grub.conf
更改如下
kernel /boot/vmlinuz-2.6.18-8.el5 ro root=LABEL=/ elevator=deadline rhgb quiet
IO:
RAID
no lvm
ext4 或者xfs
ssd
IO调度策略
参数调优
max_connections
简洁
mysql的最大连接数,如果服务器的并发请求量比较大,可以调高这个值,当然这是要建立在机器能够支撑的情况下,因为如果连接数越来越多,mysql会为每个连接提供缓冲区,就会开销的越多的内存,所以需要适当的调整该值,不能随便去提高设值。
判断依据
mysql> show variables like 'max_connections'; (最好最高3000,慢慢调整)
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 151 |
+-----------------+-------+
1 row in set (0.00 sec)
mysql> show status like 'Max_used_connections'; (数据库连接最多一次)
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| Max_used_connections | 1 |
+----------------------+-------+
1 row in set (0.00 sec)
修改方式
vim /etc/my.cnf
max_connections=1024
补充:
1.开启数据库时,我们可以临时设置一个比较大的测试值
2.观察show status like 'max_used_connections';变化
3.如果max_used_connections跟max_connections相同,
那么就是max_connections设置过低或者超过服务器的负载上限了,低于10%设置过大了
back_log
简介
mysql能暂存的连接数量,当主要mysql线程在一个很短时间内得到非常多的连接请求时候它就会起作用,如果mysql的连接数据达到max_connections时候,新来的请求将会被存在栈中,等待某一个连接释放资源,该堆栈的数量及back_log,如果等待连接的数量超过back_log,将不被授予连接资源。
back_log值指出在mysql暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中,只有如果期望在一个短时间内有很多连接的时候需要增加它
判断依据
show full processlist;
发现大量的待连接进程时,就需要加大back_log或者加大max_connections的值
修改方法
vim /etc/my.cnf
back_log=1024
wait_timeout和interactive_timeout
简介
wait_timeout 指的是mysql在关闭一个非交互的连接之前索要等待的秒数
interactive_timeout:指的是mysql在关闭一个交互的连接之前所需要等待的秒数,比如我们在终端上进行mysql管理,使用的即使交互的连接,这时候,如果没有操作的时间超过了interactive_time设置的时间就会自动的断开,默认的是28800,可以调尤为7200
设置建议
如果设置太大,容易造成连接打开时间过长,在show processlist时候,能看到很多的连接,一般希望wait_timeout尽可能低
修改方式
wait_timeout=60
interactive_timeout=1200 尽量不配置
长连接的应用,为了不去反复的回收和分配资源,降低额外的开销。
一半我们会将wait_timeout设定比较小,interactive_timeout要和应用开发沟通长连接的应用是否很多,如果他需要长连接,那么这个值可以不需要调整,另外还可以使用类外的参数弥补。
key_buffer_size
简介
key_buffer_size指定索引缓冲区的大小,它决定索引处理的速度,尤其是索引读的速度
1.此参数与myisam表的索引有关(几乎不用)
2.临时表的创建有关(多表连接,子查询,union)
在有以上查询语句出现的时候,需要创建临时表,用完之后会被丢弃
临时表有两种创建方式:内存中-------->key_buffer_size
磁盘上-------->ibdata1(5.6)
ibtmp1(5.7)
mysql> show status like 'created_tmp%';
+-------------------------+-------+
| Variable_name | Value |
+-------------------------+-------+
| Created_tmp_disk_tables | 0 | 磁盘临时表个数
| Created_tmp_files | 6 |
| Created_tmp_tables | 1 | 内存临时表个数
+-------------------------+-------+
3 rows in set (0.00 sec)
公式
created_tmp_tables/(created_tmp_disk_tables+created_tmp_tables) 越高越好
created_tmp_disk_tables/(created_tmp_disk_tables + created_tmp_tables)控制在5%-10%以内
如果监控,mysqldump备份的时候回占用大量临时表
可以改成xbk,或者更改监控时间
设置依据
mysql> show variables like 'key_buffer_size';
+-----------------+---------+
| Variable_name | Value |
+-----------------+---------+
| key_buffer_size | 8388608 |
+-----------------+---------+
1 row in set (0.00 sec)
8M大小,16M 32M 微调
配置方法
key_buffer_size=64M (不会超过512M)
max_connect_errors
安全相关的计数器,他负责阻止过多尝试失败的客户端以防止暴力破解密码等情况,当超过指定次数,mysql服务器将禁止host的连接请求,直到mysql服务器重启,或者flush hosts命令清空此host的相关信息 max_connect_error的值与性能无关
max_connect_errors=2000
sort_buffer_size
简介
排序缓冲区,增加这个值加速
ORDER BY
GROUP BY
distinct
union
配置依据
sort_buffer_size并不是越大越好,由于是connection级的参数,过大的设置+高并发可能会消耗系统内存资源
例如:500个连接将会消耗500sort_buffer_size(2M)=1G
161024/1024/8
配置方法
sort_buffer_size=1M
join_buffer_size
select a.name ,b.name from a join b on a.id=b.id where xxxx
用于表间关联缓存的大小,和sort_buffer_size一样
尽量在sql方面进行优化,效果较为明显
优化方法:在on条件列加索引,至少应当是有mul索引
read_buffer_size=1M
mysql读入缓冲区大小,对表进行扫描的请求将分配一个读入缓冲区,mysql会为他分配一段内存缓冲区,如果对表的顺序扫描请求非常频繁,并且你认为频繁扫描进行的太慢,可以通过增加该变量值以及内存缓冲区大小提高其性能。该参数对应的分配内存也是每个连接独享
read_rnd_buffer_size=1M
随机读(查询操作)缓冲区大小,当按照任意顺序读取行时(例如:按照排序顺序),将分配一个随机读缓存区,进行排序查询时,mysql会首先扫描一遍该缓冲,以避免磁盘搜索,提高查询速度,如果需要排序大量数据,可适当调高该值,但mysql会为每个客户连接发放该缓冲空间,所以应尽量适当设置该值,以避免内存开销过大
注意:顺序读是指根据索引的叶节点数据就能顺序地读取所需的行数据。
max_allowed_packet
简介
mysql根据配置文件会限制,server接收的数据包大小
配置根据
有时候大的插入和更新会受到max_allowed_packet参数限制,导致写入或者更新失败,更大值是1G,必须设置1024的倍数
配置方法
max_allowed_packet=256M
thread_cache_size
介绍
服务器线程缓存,这个值表示可以重新利用保存在缓存中线程数量,当断开连接时,那么客户端的线程将被放到缓存中以相应下一个客户,而不是销毁(前提是缓存未能达到上限),如果线程重新被请求,那么请求将从缓存中读取,如果缓存中是空或者是新的请求,那么这个线程将被重新创建,如果有很多新的线程,增加这个值可以改善系统性能。
配置依据
通过比较connections和Threads_created状态的变量,可以看到这个变量的作用
设置规则如下:1GB内存配置为8,2GB配置为16,3GB配置为32,4GB或更高内存,可配置更大。
配置方法
thread_cache_size=32
整理:
Threads_created:一般在架构设计阶段,会设置一个测试值,做压力测试,结合zabbix监控,看一段时间内此状态的变化。
如果在一段时间内,threads_created趋于平稳,说明对应参数设定是ok的
如果一直陡峭的增长,或者出现大量峰值,那么增加此值的大小,在系统资源够用的情况下(内存)
innodb_buffer_pool_size
简介
对于innodb表来说,innodb_buffer_pool_size的作用就相当于key_buffer_size对myisam表的作用一样
配置依据
innodb使用该参数指定大小的内存来缓冲数据和索引
对于单独的mysql数据库服务器,最大可以把该值设置成物理内存的80%,一般我们建议不要超过物理内存的70%
配置方法
innodb_buffer_pool_size=2048M
innodb_flush_log_at_trx_commit
简介
主要控制innodb将log buffer中的数据写入日志文件并flush磁盘的时间点,取值分别为0,1,2三个
0:表示当前事务提交时,不做日志写入操作,而是每秒将log buffer中的数据写入日志文件并flush磁盘一次
1:每次事务提交都会引起redo日志文件写入,flsuh磁盘操作,确保了事务ACID
2:每次事务提交引起写入日志文件动作,但每秒完成一次flush磁盘操作
配置依据
实际测试发现,该值对插入数据的速度影响非常大,设置为2时插入10000条记录只需要2秒,设置0的时候只需要1秒,而设置为1时,侧需要229秒,因此Mysql手册也建议尽量将插入操作合并成一个事务,这样可以大幅提高速度。
根据mysql官方文档,在允许丢失最近部分事务的危险的前提下,可以把值设定0或2
配置方法
innodb_fulsh_log_at_trx_commit=1
双1标准中的一个1
innodb_thread_concurrency
简介
此参数用来设置innodb线程的并发数量,默认值0表示不限制
配置标准
当前系统CPU情况
top
当前连接数,有没有达到顶峰
show status like 'threads_%';
show processlist;
配置方法
innodb_thread_concurrency=8
方法:
1.看top,观察每个cpu的各自负载情况
2.发现不平均,先设置参数为CPU个数,然后不断增加(一倍)这个数值
3.一直观察top状态,直到达到比较平均时,说明已经到位
innodb_log_fubber_size
此参数确定此日志文件所用内存大小,以M为单位,缓冲区更大能提高性能,对于较大的事务,可以增大缓存大小
innodb_log_buffer_size=128M
设定依据
1,大事务:存储过程调用 CALL
2.多事务
innodb_log_file_size=100M
设置ib_logfiel0 ib_logfile1
此参数确定数据日志文件的大小,以M为单位,更大的设置可以提高性能
innodb_log_file_size=100M
innodb_log_files_in_group = 3
为提高性能,mysql可以以循环方式将日志文件写到多个文件,推荐3
bulk_insert_buffer_size = 8M
插入数据缓存大小,可以有效提高插入
tokudb percona
Tidb
mongodb
sync_binlog=1
双1标准(基于安全的控制)
sync_binlog=1 什么时候刷新binlog到磁盘,每次事务commit
innodb_fulsh_log_at_trx_commit=1
set sql_log_bin=0;
show status like 'com_%';
innodb_flush_method=(o_direct,fsync)
基本参数
max_connections=1024
back_log=128
wait_timeout=60
interactive_timeout=7200
key_buffer_size=16M
query_cache_size=64M
query_cache_type=1
query_cache_limit=50M
max_connect_errors=20
sort_buffer_size=2M
max_allowed_packet=32M
join_buffer_size=2M
thread_cache_size=200
innodb_buffer_pool_size=1024M
innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=32M
innodb_log_file_size=128M
innodb_log_files_in_group=3
binlog_cache_size=2M
max_binlog_cache_size=8M
max_binlog_size=512M
expire_logs_days=7
read_buffer_size=2M
read_rnd_buffer_size=2M
bulk_insert_buffer_size=8M