MySQL 一般运行于Linux系统中。对于MySQL的调优一般分为Linux操作系统层面的调优和MySQL层面的调优(当然还有架构层面、业务层面、应用程序层面的调优)。操作系统主要是管理和分配硬件资源,所以其实系统层面的调优包括了硬件的调优,也就是调整硬件参数。Linux系统层面的调优一般分为 CPU的调优、内存的调优、磁盘的调优、网络的调优、Linux后台service调优等等。
?
1. CPU 调优
?
1.1 CPU 的节能模式
?
在server环境的CPU一定要关闭节能模式,节能模式不适应于服务器环境。因为他会自动给CPU降频进入休眠模式!一般笔记本电脑,手机为了续航时间,才需要。关闭CPU的节能模式有两种方法:
?
1)在BIOS中进行设置,彻底关闭;
?
2)关闭Linux中的服务 cpuspeed 和 irqbalance;
?
[root@localhost ~]# chkconfig --level 35 cpuspeed off
[root@localhost ~]# chkconfig | grep cpuspeed
cpuspeed ? ? ? ?0:off ? 1:on ? ?2:off ? 3:off ? 4:off ? 5:off ? 6:off
[root@localhost ~]# chkconfig --level 35 irqbalance off
[root@localhost ~]# chkconfig | grep irqbalance
irqbalance ? ? ?0:off ? 1:off ? 2:off ? 3:off ? 4:off ? 5:off ? 6:off
?
cpuspeed 就是负责CPU节能的后台服务;而irqbalance在cpuspeed将某个或某几个CPU调节进入休眠模式时,它负责将中断发送到没有休眠的CPU。关闭irqbalance会将所有中断均衡的发送到所有cpu.
?
1.2 关闭CPU的numa
?
numa的会导致mysqld产生swap,严重影响性能。因为numa架构的CPU和内存是bind的,如果CPU自己node中的内存不够,就会导致swap的产生,即使此时其它node中有大量的空闲内存,它也不会去使用。这就是numa的一个缺陷。有多种方法关闭CPU的numa:
?
1)在BISO中进行配置;
?
2)numactl --interleave=all
?
[root@localhost ~]# numactl --interleave=all
?
interleave=all 其实是将NUMA架构的各个node中的内存,又重新虚拟成了一个共享的内存来进行分配,但是和SMP不同的是,因为每两个node之间有 inter-connect ,所以又避免了SMP架构总线争用的缺陷。
?
查看CPU是否被休眠导致降频:
?
[root@localhost ~]# cat /proc/cpuinfo
processor ? ? ? : 0
vendor_id ? ? ? : GenuineIntel
cpu family ? ? ?: 6
model ? ? ? ? ? : 23
model name ? ? ?: Intel(R) Xeon(R) CPU ? ? ? ? ? E5405 ?@ 2.00GHz
stepping ? ? ? ?: 10
cpu MHz ? ? ? ? : 1995.288
?
看上面的 cpu MHz : 1995.288 和 实际是否一致。
?
具体参见:http://www.2cto.com/database/201510/445109.
html
?
2. 内存的调优
?
内存主要是要防止发生 swap。因为发生swap的话,从内存访问直接下降为硬盘访问,随机访问的速度下降10的6次方倍,也就是10万倍。顺序访问下降10倍左右。
?
2.1 防止发生swap:
?
1)关闭CPU的numa,防止numa导致的swap;
?
2)设置 vm.swappiness=1; 在 /etc/sysctl.conf 中添加:vm.swappiness=1,然后 sysctl -p; 也可以 sysctl vm.swappiness=1临时修改,然后sysctl -p
?
注意:在RHEL/CentOS 6.4及更新的内核中 vm.swappiness = 0 的默认行为被修改了,如果继续设置vm.swappiness = 0,
?
有可能导致系统内存溢出,从而导致MySQL被意外kill掉。所以这里我们设置为 1 而不是传统的 0.
?
3)设置 /proc/$(pidof -s mysqld)/oom_adj为较小的值(-15,-16或者-17)来尽量避免MySQL由于内存不足而被关闭
?
[root@localhost ~]# echo -17 > /proc/$(pidof mysqld)/oom_adj
[root@localhost ~]# cat /proc/$(pidof mysqld)/oom_adj
-17
这个oom_adj中的变量的范围为15到-16之间。越大越容易在内存不足时被kill。-17 则表示该进程不会被kill掉,当内存不足时,会kill其它进程。
?
4)使用 hugepage 可以避免swap out; 但是 huagepage也是有代价的(导致page争用加剧)。
?
?
2.3 调节 disk cache 刷新到磁盘的行为
?
因为Linux默认会大量的进行文件cache,也就是将大量内存用于disk cache。这样的话,会影响
mysql使用内存。所以我们可以调节disk cache在脏块达到多大的百分比时,进行刷新。vm.dirty_background_ratio=10; 默认值为10,表示disk cache中的脏页数量达到10%时,pdflush内核线程会被调用,异步刷新disk cache; vm.dirty_ratio=20; 表示disk cache中的脏页数量达到20%时,会进行同步的disk cache刷新,从而会阻塞
系统中应用进程的IO操作!我们可以调低vm.dirty_background_ratio来降低disk cache对mysql使用内存的影响,但是可能会增加磁盘IO,因为文件cache减少了,增加其他进程的page fault;(vm.dirty_background_ratio / vm.dity_ratio 带有backround表示异步刷新,没有带的是同步刷新。)
?
具体参见:http://www.2cto.com/database/201510/445112.html
?
3. 磁盘IO的调优
?
磁盘IO的调优涉及到文件系统的调优和磁盘的调优。
?
3.1 文件系统的调优
?
1)文件系统的选择:在rhel6.4之前ext4性能比xfs好,因为xfs有lock争用的bug。但是6.4开始,xfs的bug被fix了。测试表明xfs性能比ext4好。
?
2)文件挂载选项:文件挂