MySQL优化脑图现在MySQL运行的环境大多在Linux上,如何在Linux操作系统上优化MySQL,这里给出一些通用的简单策略。这些方法都有助于提高MySQL的性能。闲话少说,进入正题。1.CPU让我们从CPU说起。如果仔细查看,在某些服务器上会有一个有趣的现象:当你cat/proc/cpuinfo时,你会发现CPU的频率与其标称频率不同:这是一个IntelE5-2620CPU,它是2.00G*24CPU,然而我们发现第5个CPU的频率是1.2G。是什么原因?这些其实都源于最新的CPU技术:节能模式。操作系统与CPU硬件协作。当系统不忙时,它会降低CPU频率以达到省电和降低温度的目的。这对环保主义者和对抗全球变暖的斗争来说是一个福音,但对MySQL来说,这可能是一场灾难。为了保证MySQL能够充分利用CPU资源,建议将CPU设置为最大性能模式。可以在BIOS和操作系统中设置此设置。当然,在BIOS中设置这个选项会更好更彻底。由于各种BIOS类型的差异,将CPU设置为最大性能模式差异很大,这里就不具体介绍如何设置了。2.内存然后我们来看内存,我们可以优化什么。1.Numa非均匀内存访问结构(NUMA:Non-UniformMemoryAccess)也是最新的内存管理技术。它对应于对称多处理器结构(SMP:SymmetricMulti-Processor)。简单团队如下:如图所示,这里就不介绍详细的NUMA信息了。但是我们可以直观的看出SMP访问内存的开销是一样的;但是在NUMA架构下,访问本地内存和非本地内存的开销是不同的。相应的,根据这个特点,在操作系统上,我们可以设置进程的内存分配方式。目前支持的方式有:简而言之,就是可以指定内存在本地分配,在某些CPU节点上分配,或者roundrobin分配。除非设置为--interleave=nodes轮询分配方式,即可以在任意NUMA节点上分配内存,其他方式即使其他NUMA节点上还有剩余内存,Linux也不会??为这个过程分配剩余内存,使用SWAP方式获取内存。有经验的系统管理员或DBA都知道SWAP导致的数据库性能下降是多么具有欺骗性。所以最简单的方法就是关闭这个功能。关闭该功能的方法分别为:您可以从BIOS、操作系统或启动进程时暂时关闭该功能。a)由于各种BIOS类型的不同,关闭NUMA的方法也大不相同,这里就不具体说明如何设置了。b)在操作系统中关闭,可以直接在/etc/grub.conf中的kernel行末尾添加numa=off,如下图:另外可以设置vm.zone_reclaim_mode=0来回收尽可能多的记忆。c)启动MySQL时,关闭NUMA功能:当然,最好的办法是在BIOS中将其关闭。2.vm.swappinessvm.swappiness是操作系统控制物理内存交换的策略。它允许的值是一个百分比值,最小为0,最大为100,默认为60。如果vm.swappiness设置为0,表示尽可能少的swap,100表示??换出非活动内存页面尽可能多。具体来说:当内存快满时,系统会根据这个参数判断是换出内存中很少使用的非活动内存,还是释放数据缓存。从磁盘读取的数据缓存在缓存中。根据程序的局部性原则,以后可能会再次读取这些数据;inactivememory,顾名思义,就是那些被应用程序映射但“长时间”不使用的内存。我们可以使用vmstat查看非活动内存的数量:您可以通过/proc/meminfo查看更详细的信息:这里我们进一步讨论非活动非活动内存。在Linux中,内存可能处于三种状态:空闲、活动和非活动。众所周知,LinuxKernel内部维护了很多LRU列表来管理内存,比如LRU_INACTIVE_ANON、LRU_ACTIVE_ANON、LRU_INACTIVE_FILE、LRU_ACTIVE_FILE、LRU_UNEVICTABLE。其中LRU_INACTIVE_ANON和LRU_ACTIVE_ANON用于管理匿名页面,LRU_INACTIVE_FILE和LRU_ACTIVE_FILE用于管理页面缓存。系统内核会根据内存页的访问情况,时不时的将活跃内存移动到非活跃链表中,这些非活跃内存可以交换到swap。一般来说,MySQL,尤其是InnoDB管理的是内存缓存,内存占用比较大,不经常访问的内存也会有很多。如果这些内存被Linux误换出,会浪费大量的CPU和IO资源。InnoDB自己管理缓存,缓存中的文件数据占用内存,对InnoDB几乎没有任何好处。所以我们最好在MySQL服务器上设置vm.swappiness=0。我们可以通过在sysctl.conf中添加一行并使用sysctl-p来使该参数生效。3、文件系统最后我们来看一下文件系统的优化。1.挂载建议在文件系统的挂载参数中加入noatime和nobarrier选项。使用noatimemount,当程序访问相应的文件或文件夹时,文件系统不会更新相应的访问时间。一般来说,Linux会为文件记录三个时间,更改时间、修改时间和访问时间。我们可以通过stat查看文件的三次访问时间:accesstime是指最后一次读取文件的时间,modifytime是指文件的文本内容最后一次改变的时间,changetime是指最后一次修改文件的时间文件的inode发生变化的时间(如位置、用户属性、组属性等)。一般来说,文件读多写少,我们很少关心某个文件最近什么时候被访问过。因此,我们推荐使用noatime选项,让文件系统不记录访问时间,避免浪费资源。当前很多文件系统在提交数据时都会强制底层设备刷新缓存,以避免数据丢失,这被称为写屏障。但是,实际上,我们的数据库服务器的底层存储设备要么使用RAID卡,RAID卡本身的电池可以断电保护;或者使用闪存卡,闪存卡也有自我保护机制,保证数据不会丢失。所以我们可以放心的使用nobarrier来挂载文件系统。设置方法如下:对于ext3、ext4、reiserfs文件系统,挂载时可以指定barrier=0;对于xfs,您可以指定nobarrier选项。2、deadline文件系统上还有一个提升IO的优化万能钥匙,就是deadline。在Flash技术出现之前,我们都是使用机械磁盘来存储数据。机械盘的寻道时间是影响其速度的最重要因素,这直接导致每秒的IOs(IOPS)非常有限。为了对多个请求进行排序和合并,使得一个seek可以满足多个IO请求。Linux文件系统设计了多种IO调度策略,适用于各种场景和存储设备。Linux的IO调度策略包括:Deadlinescheduler、Anticipatoryscheduler、CompletelyFairQueuing(CFQ)、NOOP。这里不对每种调度策略的详细调度方法进行描述。这里主要介绍CFQ和Deadline。CFQ是Linux内核2.6.18之后的默认调度策略。它声称对每个IO请求都是公平的。这种调度策略适用于大多数应用程序。但是如果数据库有两个请求,一个请求3个IO,另一个请求10000个IO,出于绝对公平的考虑,这个3个IO的请求需要和其他10000个IO请求竞争,可能要等上千个IO完成在返回之前,导致它的响应时间很慢。而如果在处理过程中有很多IO请求一个接一个发出,有些IO请求甚至可能无法调度而被“饿死”。deadline考虑到一个请求不会在队列中等待太久而造成饥饿,比较适合数据库等应用。对于实时设置,我们可以将sda的调度策略设置为deadline。我们也可以直接在/etc/grub.conf的kernel行末尾加上elevator=deadline来永久生效。总结一下CPU方面:关闭电源保护模式内存:vm.swappiness=0关闭numa文件系统:使用noatime,nobarrier挂载系统IO调度策略,改成deadline。
