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 : 0vendor_id:GenuineIntel
cpu family: 6model: 23model name: Intel(R) Xeon(R) CPU E5405 @ 2.00GHz
stepping: 10cpu MHz: 1995.288
看上面的 cpu MHz : 1995.288 和 实际是否一致。
具体参见:http://www.cnblogs.com/digdeep/p/4847484.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 则表示该进程不会