《Linux硬件和系统调优.docx》由会员分享,可在线阅读,更多相关《Linux硬件和系统调优.docx(9页珍藏版)》请在第一文库网上搜索。
1、Linux硬件和系统调优本章汇总了之前硬件或者操作系统对MySQL性能影响的相关因素并分类列出了从底层优化数据库性能的相关方法。硬件和系统调优概览前面我们通过案例介绍了在硬件和系统层面优化数据库性能的方法,本章我们运用“独孤九剑,从I/O、CPU、网络、进程等方面汇总介绍如何破解硬件和系统层面的性能瓶颈,“料敌机先,攻其必救不仅仅是MySQL,所有的数据库系统对I/O都特别敏感,80%的系统性能瓶颈基本都在I/O上。存储设备的性能如表33”所示。表33”硬 件nsusms性能比较L I级缓存0.5L2级缓存714倍LI级缓存内存访问10020倍L2级缓存200 (2 PCIe 4KB 写Fla
2、sh/NVMe 访 M20 00020200倍内存访问SSD4KB随机写65 00065600倍内存访问机械磁盘寻道10 OCX) (XX)10 (MX)101。0()()借内存访问从CPU缓存到内存,从SSD到HDD, CPU访问数据的效率在逐步下降,这也是为什么数据库管理员需要着重优化和提升I/O性能,解决数据库瓶颈的原因。1 .存储设备(1)强烈建议使用Flash设备,优先使用NVMe和PCIe接口的Flash设备如果事务并发修改较多的话,底层存储设备的读写压力会非常大,若存储设备的性能无法支撑这么大量的I/O请求,MySQL将被堵塞,无法提升数据库并发处理能力。普通的SAS机械磁盘使用
3、盘片,通过机械手臂、磁头等访问和存储数据,由于转速限制,IOPS一般在150次/秒左右,I/O访问延迟在毫秒(ms)级别。而Flash存储是电子设 备,IOPS一般为410万次/秒,延迟一般在微秒(.)级别。对于数据库这种对I/O敏感的系统,能够大幅提高并发处理能力。随着Flash设备的逐渐普及,出现了不同接口类型的Flash设备,如SATA、PCIe、NVMeoSATA接口的SSD在外观上与普通的机械磁盘一样,以IntelS3700为例,4KB随机写的IOPS能达到3.6万次/秒(是普通磁盘的200倍),延迟降到65卬(是普通机械磁盘的1/10)。SSD的外观如图33-1所示。PCIe Fl
4、ash卡需要插在主板的专门接口上,不通过硬盘背板和RAID卡的转发,速率更高。以HGST的Ultrastar SN150为例,IOPS为14万次/秒,是普通SSD的3倍,延迟在202以下,是普通SSD的1/3。但是它的更换需要打开机箱,相比SATA接口的SSD不用开机箱,可以随时插拔磁盘,在运维方面会更麻烦一点。Flash卡的外观如图33-2所示。图33-1图33-2SATA接口的磁盘使用的是AHCI接口标准,无法充分发挥Flash介质的性能;PCIeFlash介质采用的都是各个厂商私有的接口标准,无法统一管理。2011年,Intel牵头发布了NVMe接口标准,以适配高速低延迟存储设备。支持N
5、VMe接口标准的固态硬盘和PCIeFlash卡同样可以达到10万次/秒以上的IOPS和20pis以下的I/O延迟。(2)把binlog、redo日志文件和数据文件分开为了保证数据库的数据不会丢失,一般会设置sync_binlog=l和innodb_flush_log_at_trx_commit=l0由于数据库是WAL日志先行而,对日志型的I/O访问最主要的要求是顺序写延迟低;而普通的数据由于是异步I/O方式的,对底层存储最主要的要求是随机读写IOPS高、并发I/O处理能力强。在I/O请求非常高的情况下,如果日志型的请求和数据文件型的请求都落在同一个存储系统上,会出现相互冲突的情况。由于RAID
6、卡的缓存速率跟内存的速率是同一个级别的,普通HDD和普通SSD的顺序I/O也能达到200MB/S以上,对绝大多数binlog和redo日志的顺序I/O都是满足的。将binlog和redo日志等对顺序读请求和延迟要求较高的请求放在带有RAID卡缓存的普通磁盘上,既能获得内存级别的响应延迟,也能获得快速的顺序I/O能力,并且成本较低。数据文件要求随机I/O并发处理能力强,只能通过PCIeFlash存储或者不带缓存(Write Through)的SSD提供1()万级别以上的高性能随机I/O读写能力。不使用RAID的缓存主要是为了避免抢占日志型存储的资源,避免竞争,而且SSD本身的IOPS能力已经足够
7、支撑大部分数据库的I/O并发,不需要在缓存中合并了。(3)如果使用SSD的话,请关闭RAID卡的自动一致性读和充放电配置关于RAID卡的一致性读和充放电配置在前面的章节中已经介绍过了,这里不再赘述。(4)考虑SSD批次问题SSD由于其电子设备的特性,有可能在同一个批次上具有相同的缺陷,如果用于同一台物理机或者主备库中,有可能出现整台物理机或者主备库的数据失效、无法提供服务的问题。有条件的话,建议在同一台物理机或者主备库中采用不同批次的SSD。2 .内存下面主要探讨在内存方面有哪些地方可以优化。(1)内存空间越大越好原则上,内存空间越大越好,如果业务需要访问的数据都可以放在内存中,那么访问的效率
8、一定是最高的。(2)建议关闭NUMA如果追求极致性能的话,则可以考虑每个NUMA节点一个MySQL实例,否则请关闭NUMAoNUMA (Non-Uniform Memory Access,非一致存储访问)是最新的内存管理技术,它和SMP (Symmetric Multi-Processor,对称多处理器)是对应的。SMP和NUMA架构的对比如图33-3诟示。SMP架构NUMA架构图33-3通过图33-3我们可以直观地看到,在SMP架构下,访问内存的代价都是一样的;但是在NUMA架构下,对本地内存的访问和对非本地内存的访问代价是不一样的。根据这个特性,在操作系统中可以设置进程的内存分配方式。目前
9、支持的方式包括: interleave=nodes,内存交互分配策略。内存会在nodes口上轮询(Round Robin)分配。 -membind=nodes,绑定内存在nodes上。如果该nodes上没有内存可供使用,则内存分配将会失败。 cpunodebind=nodes,绑定在nodes 的CPU上。 physcpubind=cpus,绑定在指定的cpus核上。 localalloc,只在当前node上分配。 -preferred=node,优先在node上分配内存,如果node内存不够,则可以到其他node上分配。简而言之,就是可以指定内存是在本地分配,还是在指定的几个CPU节点上分配
10、或者轮询分配的。对于-interleave=nodes轮询分配方式,只要物理内存还有剩余,数据库申请内存是可以在任意NUMA节点上分配的;否则,即使其他NUMA节点上还有内存剩余,Linux也不会把剩余的内存分配给这个进程,从而导致数据库内存被交换出去。有经验的系统管理员或者DBA都知道内存swap导致的数据库性能下降有多么大。所以,最简单的方法还是关闭这个特性。当然,如果你对NUMA非常熟悉,一台服务器上有多个MySQL实例,并且CPU本地内存足够,希望就在本地分配内存,也可以指定NUMA节点分配。这里介绍关闭NUMA的方法。如下三种方法简单、有效,能够避免NUMA导致的交换。 在BIOS中
11、直接关闭NUMA。由于各种BIOS类型的区别,如何关闭NUMA千差万别,如图33-4所示是在DELL的BIOS中设置内存NUMA关闭的截图。Systu neaorySize 12.6 GBSystem HeaoryType BCC DBR3Syste NeaorySpeed 186? mzSyste MeaoryVoltage 1.5UUideo Nenry 8 MBSystea MewryTesting EnabledNewry Operating Node Optisizer MeNode InterleavingEnabled图33-4在操作系统内核启动时关闭NUMA。在操作系统中关闭,
12、可以直接在/etc/grub.conf文件的kernel行的最后添加numa=off。并且在sysctl.conf文件中设置vrn.zone_reclaim_mode=0尽量回 收 内存。(rootlocalhost * cat /etc/grub.confkernel /vmlinuz-2.6.32-220.el6.x86_64 ro root/dev/mapper/VolGroup-root rd_NO_LUKSLANG=en_US.UTF-8 rd_LVM_LV=VolGroup/root rd_NO_MD quiet SYSFONT=latarcyrheb-sunl6 rhgbcras
13、hkernel=auto rd_LVM_LV=VolGroup/ swap rhgb crashkernel=auto quiet KEYBOARDTYPE=pcKEYTABLE-us rd NO DM numa=off在进程启动时关闭NUMA。在启动MySQL时关闭NUMA特性。root local host # numactl in ter leave=al 1 mysqld &(3)设置较小的vm.swappiness值vm.swappiness是操作系统控制物理内存交换的策略,它的值是一个百分比数,最小值为0,最美值为100,默认值为60。将vm.swappiness设置为0表示尽量少
14、交换,设置为100表示尽量将inactive内存交换出去。在MySQL所在的服务器中建议设置vm.swappiness= 10。当内存基本满时,系统会根据这个参数来判断是把内存中很少用到的inactive内存交换出去(顾名思义,inactive内存就是指那些被应用程序申请(mapped),但是“长时时不用的内存),还是释放老数据的缓存(缓存中存放的是从磁盘读出来的数据,根据程序的局部性原理,这些数据在接下来的程序访问中有可能会被用到)。我们可以使用vmstat (关于vmstat工具的具体介绍,请参考“工具篇”中的第40章和第41章)来查看inactive内存的大小:root local host ,vmstat -an 1procsmemoryswapiosystemcpurbswpdfree inact active si sobiboin ,cs ussy id wa st10027522384326928 17046440001531110 00100 0 000027523300326936 17041640007478459000 100 0000027523656326936 17046920088439168600 100 0000027524300326916 17034120045219826200