Linux系统中MySQL优化技巧有哪些(linux,mysql,开发技术)

时间:2024-05-04 15:50:57 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

Linux系统中MySQL优化技巧有哪些

1.禁止操作系统更新文件的atime属性

atime是Linux/UNIX系统下的一个文件属性,每当读取文件时,操作系统都会将读操作时间回写到磁盘上。对于读写频繁的数据库文件来说,记录文件的访问时间一般没有任何用处,却会增加磁盘系统的负担,影响I/O性能!因此,可以通过设置文件系统的mount熟悉,阻止操作系统写atime信息,减轻磁盘I/O负担。方法如下:

(1)修改文件系统配置文件/etc/fstab,指定noatime选项:

UUID=33958004-e8a7-4135-844f-707a5537e86a/dataext4noatime01

(2)重新mount文件系统使其修改生效:

[root@MySQL-01~]#mount-oremount/data

2.调整I/O调度算法

详细说明请参考前面文章提到的I/O调度算法的选择

(1)查看当前系统支持的I/O调度算法:

[root@MySQL-01~]#dmesg|grep-ischedulerioschedulernoopregisteredioscheduleranticipatoryregisteredioschedulerdeadlineregisteredioschedulercfqregistered(default)[root@MySQL-01~]#

(2)查看当前设备(/dev/sda)使用的I/O调度算法:

[root@MySQL-01~]#cat/sys/block/sda/queue/schedulernoopanticipatorydeadline[cfq][root@MySQL-01~]#

(3)修改当前设备使用的I/O调度算法,普通磁盘可以选择Deadline,SSD我们可以选择使用NOOP或者Deadline

[root@MySQL-01~]#echo"deadline">>/sys/block/sda/queue/scheduler[root@MySQL-01~]#cat/sys/block/sda/queue/schedulernoopanticipatory[deadline]cfq[root@MySQL-01~]#

永久修改I/O调度算法,可以通过修改内核引导参数,增加elevator=调度算法名

[root@MySQL-01~]#vim/boot/grub/menu.lst

更改后的内容:

[root@MySQL-01~]#grep"deadline"/boot/grub/menu.lstkernel/vmlinuz-2.6.32-220.el6.x86_64roroot=UUID=c0618639-a967-4601-bca7-cc3b99c5c332elevator=deadlinerd_NO_LUKSrd_NO_LVM.UTF-8rd_NO_MDquietSYSFONT=latarcyrheb-sun16rhgbcrashkernel=autoKEYBOARDTYPE=pcKEYTABLE=usrd_NO_DM[root@MySQL-01~]#

3.NUMA架构优化

从系统架构来看,目前的商用服务器大体可以分为三类:

(1)对称多处理器架构(Symmetric Multi-Processor,SMP)

(2)非一致存储访问架构(Non-Uniform Memory Access,NUMA)

(3)海量并行处理架构(Massive Parallel Processing,MPP)

一般服务器是SMP或者NUMA架构的较多。我这里只详细说明NUMA架构,至于其他的童鞋们可以自行查阅资料_

NUMA把一台计算机分成多个节点(Node),每个节点内部拥有多个CPU,节点内部使用共有的内存控制器,节点之间是通过互联模块进行连接和信息交互,因此节点的所有内存对于本节点所有的CPU是等同的,而对于其他节点中的所有CPU都是不同的。因此每个CPU可以访问整个系统内存,但是访问本地节点的内存速度最快(不需要经过互联模块),访问非本地节点的内存速度较慢(需要经过互联模块),即CPU访问内存的速度与节点的距离有关,距离称为Node Distance。如下图:

Linux系统中MySQL优化技巧有哪些

显示当前NUMA的节点情况:

Linux系统中MySQL优化技巧有哪些

[root@localhost~]#numactl--hardwareavailable:2nodes(0-1)node0cpus:0246node0size:16338MBnode0free:136MBnode1cpus:1357node1size:16384MBnode1free:66MBnodedistances:node010:10201:2010[root@localhost~]#free-mtotalusedfreesharedbufferscachedMem:3206031856204036213016-/+buffers/cache:1847713582Swap:799967993[root@localhost~]#

Linux系统中MySQL优化技巧有哪些

当前服务器上有两个节点Node 0和Node 1,Node 0的本地内存约为16GB,Node 1的本地内存约为16GB,可以看出系统一共有32GB内存

节点之间的距离(Node Distance)是指节点1访问节点0上的内存需要付出的代价的一种表现形式。在上述例子中,Linux节点本地内存声明距离为10,非本地内存声明距离20.

NUMA的内存分配策略分为以下4种:

(1)缺省default:总是在本地节点分配(分配在当前进程运行的节点上)

(2)绑定bind:强制分配到指定节点上

(3)交叉interleave:在所有节点或者指定节点上交叉分配内存

(4)优先preferred:在指定节点上分配,失败则在其他节点分配

显示当前系统NUMA策略:

Linux系统中MySQL优化技巧有哪些

[root@localhost~]#numactl--showpolicy:defaultpreferrednode:currentphyscpubind:01234567cpubind:01nodebind:01membind:01[root@localhost~]#

Linux系统中MySQL优化技巧有哪些

因为NUMA默认的内存分配策略是优先在进程所在CPU的本地内存中分配,会导致CPU节点之间内存分配不均衡,当某个CPU节点内存不足时,会导致SWAP发生,而不是从远程节点分配内存,这就是Swap Insanity现象。

MySQL是单进程多线程架构的数据库,当NUMA采用默认的内存分配策略时,MySQL进程会被并且仅仅会被分配到NUMA的一个节点上去。假设MySQL进程被分配到Node 1运行,这个节点的本地内存是8GB,而MySQL配置了14GB内存,MySQL分配的14GB内存中,超过节点本地内存部分(14GB-8GB=6GB)Linux系统宁愿使用Swap也不会使用其他节点的物理内存。在这种情况下,能观察到系统虽然总共可用的物理内存还很多,但是MySQL进程已经开始使用Swap了。

MySQL对NUMA的特性支持不好,如果单机只运行一个MySQL实例,可以选择关闭NUMA,关闭的方式有两种:

(1)硬件层,在BIOS中设置关闭

(2)OS内核层,启动时设置numa=off

修改/etc/grub.conf,添加numa=off

[root@MySQL-01~]#vim/etc/grub.conf[root@MySQL-01~]#grep'numa'/etc/grub.confkernel/vmlinuz-2.6.32-220.el6.x86_64roroot=UUID=c0618639-a967-4601-bca7-cc3b99c5c332elevator=deadlinerd_NO_LUKSrd_NO_LVM.UTF-8rd_NO_MDquietSYSFONT=latarcyrheb-sun16rhgbcrashkernel=autoKEYBOARDTYPE=pcKEYTABLE=usrd_NO_DMnuma=off[root@MySQL-01~]#

或者通过numactl命令将NUMA的内存分配策略修改为interleave

/usr/bin/numactl--interleave=all/usr/local/mysql-5.1.66/bin/mysqld_safe--defaults-file=/usr/local/mysql-5.1.66/my.cnf

这样就指定了MySQL启动时内存的分配策略是interleave

如果单机运行多个MySQL实例,可以将不同MySQL实例绑定到不同的CPU节点上,同时配置合适的MySQL内存参数,并且采用绑定的内存分配测试,强制在本地节点分配内存。

4.vm.swappiness调整

swappiness是操作系统控制物理内存交换出去的策略。它允许的值是一个百分比的值,最小为0,最大运行100,该值默认为60。vm.swappiness设置为0表示尽量少swap,100表示尽量将inactive的内存页交换出去。 具体的说:当内存基本用满的时候,系统会根据这个参数来判断是把内存中很少用到的inactive 内存交换出去,还是释放数据的cache。cache中缓存着从磁盘读出来的数据,根据程序的局部性原理,这些数据有可能在接下来又要被读取;inactive 内存顾名思义,就是那些被应用程序映射着,但是“长时间”不用的内存。

我们可以利用vmstat看到inactive的内存的数量:

Linux系统中MySQL优化技巧有哪些

[root@MySQL-01~]#vmstat-an15procs-----------memory-------------swap-------io------system-------cpu-----rbswpdfreeinactactivesisobiboincsussyidwast00489211949722342084924040053832830199000048921194964234208492420000024290010000004892119496423420849242000001221001000000489211949642342084924200000202400100000048921194964234208492420000013210010000[root@MySQL-01~]#

Linux系统中MySQL优化技巧有哪些

通过/proc/meminfo 你可以看到更详细的信息:

[root@MySQL-01~]#cat/proc/meminfo|grep-iinactInactive:234188kBInactive(anon):3228kBInactive(file):230960kB[root@MySQL-01~]#

Linux中,内存可能处于三种状态:free,active和inactive。众所周知,Linux Kernel在内部维护了很多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用来管理page caches页缓存。系统内核会根据内存页的访问情况,不定时的将活跃active内存被移到inactive列表中,这些inactive的内存可以被交换到swap中去。 一般来说,MySQL,特别是InnoDB管理内存缓存,它占用的内存比较多,不经常访问的内存也会不少,这些内存如果被Linux错误的交换出去了,将浪费很多CPU和IO资源。InnoDB自己管理缓存,cache的文件数据来说占用了内存,对InnoDB几乎没有任何好处。 所以,我们在MySQL的服务器上最好设置vm.swappiness=0。

我们可以通过在sysctl.conf中添加一行(如果你的内核版本是2.6.32-303.el6及以后,请设置vm.swappiness = 1):

[root@MySQL-01~]#echo"vm.swappiness=0">>/etc/sysctl.conf[root@MySQL-01~]#sysctl-p

另外一种做法是innodb启用大内存页,也和上述方法有相同的效果。具体请参考前面文章提到的InnoDB启用大内存页

5.CPU优化

检查CPU是否开启了节能选项

Linux系统中MySQL优化技巧有哪些

[root@localhost~]#grep-E'^modelname|^cpuMHz'/proc/cpuinfomodelname:Intel(R)Xeon(R)CPUL5520@2.27GHzcpuMHz:2266.602modelname:Intel(R)Xeon(R)CPUL5520@2.27GHzcpuMHz:2266.602modelname:Intel(R)Xeon(R)CPUL5520@2.27GHzcpuMHz:2266.602modelname:Intel(R)Xeon(R)CPUL5520@2.27GHzcpuMHz:2266.602modelname:Intel(R)Xeon(R)CPUL5520@2.27GHzcpuMHz:2266.602modelname:Intel(R)Xeon(R)CPUL5520@2.27GHzcpuMHz:2266.602modelname:Intel(R)Xeon(R)CPUL5520@2.27GHzcpuMHz:2266.602modelname:Intel(R)Xeon(R)CPUL5520@2.27GHzcpuMHz:2266.602[root@localhost~]#

Linux系统中MySQL优化技巧有哪些

如果发现CPU的频率跟它标称的频率不一样,那么就是开启了节能模式。

可以使用下面命令关闭:

forCPUFREQin/sys/devices/system/cpu/cpu*/cpufreq/scaling_governor;do[-f$CPUFREQ]||continue;echo-nperformance>$CPUFREQ;done

节能模式:操作系统和CPU硬件配合,系统不繁忙的时候,为了节约电能和降低温度,它会将CPU降频。对MySQL来说,可能是一个灾难。 为了保证MySQL能够充分利用CPU的资源,建议设置CPU为最大性能模式。这个设置可以在BIOS和操作系统中设置,当然,在BIOS中设置该选项更好。

 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:Linux系统中MySQL优化技巧有哪些的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:Linux系统怎么打开ISO文件下一篇:

7 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18