《Linux硬件和系统调优.docx》由会员分享,可在线阅读,更多相关《Linux硬件和系统调优.docx(9页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Linux硬件和系统调优本章汇总了之前硬件或者操作系统对MySQL性能影响的相关因素并分类列出了从底层优化数据库性能的 相关方法。硬件和系统调优概览前面我们通过案例介绍了在硬件和系统层面优化数据库性能的方法,本章我们运 用“独孤九剑,从I/O、CPU、网络、进程等方面汇总介绍如何破解硬件和系统层面的性 能瓶颈,“料敌机先,攻其必救”。不仅仅是MySQL,所有的数据库系统对I/O都特别敏感,80%的系统性能瓶颈基本都 在I/O上山。存储设备的性能如表33-1所示。表 33-1硬 件nsus *ms性能比拟L I级缓存0.5L2级线存714倍L1级缓存内存访问10020倍L2级缓存200 倍 PC
2、Ie 4KB 写Flash/NVMe 访问20 00020200倍内存访MSSD 4KB随机写65 00065600倍内存访问机械磁盘寻道1() ()(X) ()00K) (MX)1()100 0(10倍内存访问从CPU缓存到内存,从SSD到HDD, CPU访问数据的效率在逐步下降,这也是为什么 数据库管理员需要着重优化和提升I/O性能,解决数据库瓶颈的原因。1 .存储设备(1)强烈建议使用Flash设备,优先使用NVMe和PCIe接口的Flash设备如果事务并发修改较多的话,底层存储设备的读写压力会非常大,假设存储设备的性能 无法支撑这么大量的I/O请求,MySQL将被堵塞,无法提升数据库并
3、发处理能力。普通的SAS机械磁盘使用盘片,通过机械手臂、磁头等访问和存储数据,由于转速限 制,IOPS一般在150次/秒左右,I/O访问延迟在毫秒(ms)级别。而Flash存储是电子设 备, IOPS一般为410万次/秒,延迟一般在微秒(那)级别。对于数据库这种对I/O敏感的系统, 能够大幅提高并发处理能力。随着Flash设备的逐渐普及,出现了不同接口类型的Flash设备,如SATA、PCIe、 NVMeoSATA接口的SSD在外观上与普通的机械磁盘一样,以IntelS3700为例,4KB随机写的 IOPS能到达3.6万次/秒誉普通磁盘的200倍),延迟降到6511s(是普通机械磁盘的1/10
4、)。 SSD的外观如图33-1所示。PCIe Flash卡需要插在主板的专门接口上,不通过硬盘背板和RAID卡的转发,速率更 高。以HGST的Ultrastar SN150为例,IOPS为14万次/秒,是普通SSD的3倍,延迟在20g 以下,是普通SSD的1/3。但是它的更换需要翻开机箱,相比SATA接口的SSD不用开机 箱,可以随时插拔磁盘,在运维方面会更麻烦一点。Flash卡的外观如图33-2所示。图33-1图332SATA接口的磁盘使用的是AHCI接口标准,无法充分发挥Flash介质的性能;PCIe Flash介质采用的都是各个厂商私有的接口标准,无法统一管理。2011年,Intel牵头
5、发布了 NVMe接口标准,以适配高速低延迟存储设备。支持NVMe接口标准的固态硬盘和PCIe Flash卡同样可以到达10万次/秒以上的IOPS和20四以下的I/O延迟。(2)把binlog、redo日志文件和数据文件分开为了保证数据库的数据不会丧失,一般会设置sync_binlog=l和innodb_flush_ log_at_trx_commit= 1。由于数据库是WAL日志先行南,对日志型的I/O访问最主要的要求 是顺序写延迟低;而普通的数据由于是异步I/O方式的,对底层存储最主要的要求是随机 读写IOPS高、并发I/O处理能力强。在I/O请求非常高的情况下,如果日志型的请求和数据 文件
6、型的请求都落在同一个存储系统上,会出现相互冲突的情况。由于RAID卡的缓存速率跟内存的速率是同一个级别的,普通HDD和普通SSD的顺序 I/O也能到达200MB/S以上,对绝大多数binlog和redo日志的顺序I/O都是满足的。将binlog 和redo日志等对顺序读请求和延迟要求较高的请求放在带有RAID卡缓存的普通磁盘上, 既能获得内存级别的响应延迟,也能获得快速的顺序I/O能力,并且本钱较低。数据文件要求随机I/O并发处理能力强,只能通过PCIeFlash存储或者不带缓存(Write Through)的SSD提供10万级别以上的高性能随机I/O读写能力。不使用RAID的缓 存主要是为了
7、防止抢占口志型存储的资源,防止竞争,而且SSD本身的IOPS能力已经足够 支撑大局部数据库的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所示。CPU CPU MemoryCPU CPU MemorySMP架构NUMA架构图333通过图33-3我们可以直观地看到,在SMP架构下,访问内存的
9、代价都是一样的;但是 在NUMA架构下,对本地内存的访问和对非本地内存的访问代价是不一样的。根据这个 特性,在操作系统中可以设置进程的内存分配方式。目前支持的方式包括: interleave=nodes,内存交互分配策略。内存会在nodes上轮询(Round Robin) 分配。 -membind=nodes,绑定内存在nodes上。如果该nodes上没有内存可供使用,那么内 存分配将会失败。 cpunodebind=nodes,绑定在nodes 的 CPU上。 -physcpubind=cpus, 绑定在指定的cpus核上。 -localalloc,只在当前node上分配。 -preferr
10、ed=node,优先在node上分配内存,如果node内存不够,那么可以到其他 node上分配。简而言之,就是可以指定内存是在本地分配,还是在指定的几个CPU节点上分配或者 轮询分配的。对于-interleave=nodes轮询分配方式,只要物理内存还有剩余,数据库申请 内存是可以在任意NUMA节点上分配的;否那么,即使其他NUMA节点上还有内存剩余, Linux也不会把剩余的内存分配给这个进程,从而导致数据库内存被交换出去。有经验的 系统管理员或者DBA都知道内存sw叩导致的数据库性能下降有多么大。所以,最简单的方法还是关闭这个特性。当然,如果你对NUMA非常熟悉,一台服 务器上有多个MyS
11、QL实例,并且CPU本地内存足够,希望就在本地分配内存,也可以指 定NUMA节点分配。这里介绍关闭NUMA的方法。如下三种方法简单、有效,能够防止NUMA导致的交 换。 在BIOS中直接关闭NUMA。由于各种BIOS类型的区别,如何关闭NUMA千差万 别,如图33-4所示是在DELL的BIOS中设置内存NUMA关闭的截图。如tea NewrySize 12,e GBSystem NeaoryType KC DM3HeaorySpeed 1667 MzSystem MeaoryUoltage 1.5UUideo Heaory 8 MBSystea Nebo叫 Testing EnabledHew
12、ry OperatinQ Mode OptiaizcrttodcNode interleaving Enabled图334 在操作系统内核启动时关闭NUMA。在操作系统中关闭,可以直接在/etc/grub.conf 文件的kernel行的最后添加numa=offo并且在sysctLconf文件中设置 vm.zone_reclaim_mode=0 尽量 回收 内存。(root0localhost # cat /etc/grub.confkernel /vmlinuz-2.6.32-220.el6.x86_64 ro root/dev/mapper/VolGroup-root rd_NO_LUKS
13、 LANG=en_US.UTF-8 rd_LVM_LV=VolGroup/root rd_NO_MD quiet SYSFONT=latarcyrheb-sunl6 rhgb crashkernel=auto rd_LVM_LV=VolGroup/ swap rhgb crashkernel=auto quiet KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM numa=off 在进程启动时关闭NUMA。在启动MySQL时关闭NUMA特性。root local host numactl -interleave=all mysqld &(3)设置较小的vm.swappi
14、ness值vm.sw叩piness是操作系统控制物理内存交换的策略,它的值是一个百分比数,最小 值为0,最美彳直为10。,默认值为60。将vm.swappiness设置为0表示尽量少交换,设置为100表不尽量将inactive内存交换出去。在MySQL所在的服务器中建议设置 vm.swappiness=l 0。当内存基本满时,系统会根据这个参数来判断是把内存中很少用到的inactive内存交 换出去(顾名思义,inactive内存就是指那些被应用程序申请(mapped),但是“长时 间”不用的内存),还是释放老数据的缓存(缓存中存放的是从磁盘读出来的数据,根据 程序的局部性原理,这些数据在接下
15、来的程序访问中有可能会被用到)。我们可以使用vmstat (关于vmstat工具的具体介绍,请参考“工具篇”中的第40章和第 41章)来查看inactive内存的大小:root local hostvmstat -an 1procsmemoryswapio-system-一Wr bswpd free inact active siso bi boincs us sy ici wa st1 00 27522384 326928 170464400015311 10 00 100 0 00 00 27523300 326936 170416400074784 5900 0 100 0 00 00
16、27523656 326936 17046920088439 16860 0 100 0 00 00 27524300 326916 170341200452198 2620 0 100 0 0通过/proc/meminfo可以看到更详细的信息:root local hostcat /proc/meminfo | grep -i inactInactive:326972 kBInactive(anon):248 kBInactive(file): 326724 kBMySQL DBA对inactive内存到底是什么可能不太了解,这里详细介绍一下。在Linux 中内存可能处于三种状态:free、
17、active和inactive。众所周知,Linux内核在内部维护了很 多LRU歹U表用来管理内存,比方LRU_INACTIVE_ANON、LRU_ACTIVE_ANON LRU_ INACTIVE FILE、LRU ACTIVE FILE、LRU UNE VICTABLE o 其中 LRU_INACTIVE_ANON、LRU_ACTIVE_ANON 用来 管理匿 名页,LRUJNACTIVE_FILE LRU_ACTIVE_FILE用来管理页缓存,刚访问过的页面放进active list中,长时间未访问过的页面放进inactive list中。一般来说,MySQL特别是InnoDB管理内存缓
18、存,占用的内存比拟多,不经常访问的 内存也会不少,这些内存如果被Linux错误地交换出去,将浪费很多CPU和I/O资源。所以,在MySQL服务器上最好设置vm.swappiness=10。可以通过在sysctl.conf文件中 添加如下一行,并使用sysctl-p来使该设置生效。root local host # echo *vm. swappiness = 10 /etc/sysctl. conf(4)考虑开启大页Oracle DBA会告诉你,服务器上的大页一定要开启,这样每个内存页为2MB而不是 4KB,保证记录进程所映射的内存的页表(假设为w)足够小,防止很多进程(假设 为)各自都映射了
19、大容量的缓存空间,导致页表浪费大量的内存空间xw (页表占用内 存空间的大小)。大页确实能大幅降低页表的大小(降低为2MB/4KB)。大页的另一个 作用是防止内存交换。MySQL是单进程多线程的,页表再大,也只是一个进程的页表占用内存多一点,并 不会像Oracle的多进程一样,每个进程的页表都要浪费那么多的内存空间。虽然MySQL使用大页有一些好处,但是也给运维人员造成了一定的困扰。Linux并不 能把所有空间都分配为大页,当总大页内存分配缺乏时,MySQL只会使用非大页内存空 间启动。由于大页并不会自动释放,使得预分配的大页内存闲置,而MySQL内存只能在 非大页的剩余空间中分配,导致发生交
20、换等问题。(5)在BIOS中设置为最大性能模式。在BIOS中将Memory Speed等设置为最大性能。在“第30章查询MySQL偶尔比拟慢”中 有详细描述,这里不再赘述。3.文件系统(1)文件系统选择XFS或者Ext4不像Oracle经常利用ASM运行在裸设备上,MySQL一般运行在文件系统上,那么对 文件系统的选择就非常关键了。XFS和Ext4对大文件的读写更友好(使用drop table删除一 个文件非常快),也经过了大量线上环境的验证。(2)文件系统的mount参数加上noatime、nobarrier如果使用noatime mount的话,文件系统在程序访问对应的文件或者文件夹时,不
21、会 更新对应的Access时间。一般来说,Linux的文件记录了三个时间:Change时间、Modify 时间和Access时间。我们可以通过stat来查看文件的三个时间:root 0 local host * stat libnids-1.16. tar. gz10 Block: 4096 regular file Links: 1root) Gid: (0/ root)Size: 72309Blocks: 152Device: 302h/770d Inode: 4113144Access: (0644/-rw-rr) Uid: (0/Access: 2008-05-27 15:13:03.
22、000000000 +0800Modify: 2004-03-10 12:25:09.000000000 +0800Change: 2008-05-27 14:18:18.000000000 +0800其中Access时间指文件最后一次被读取的时间,Modify时间指文件的文本内容最后发 生变化的时间,Change时间指文件的inode (比方位置、用户属性、组属性等)最后发生变 化的时间。一般来说,文件都是读多写少的,而我们也很少关心某个文件最近什么时间被访问 了。所以建议采用noatime,这样文件系统就不会记录Access时间,防止浪费资源。现在很多文件系统都会在提交数据时强制底层设备刷
23、新缓存,称之为Write Barrier (写屏障)。但是数据库服务器底层存储设备要么采用RAID卡,要么采用Flash卡,它们都有自我保护机制,保证数据不会丧失,所以我们可以平安地使用nobarrier挂载 文件系统。设置方法如下:对于Ext3、Ext4和ReiserFS,可以在挂载时指定barrier=0;对于XFS,可以指定 nobarrier选项。(3)将调度策略设置为Deadline在文件系统上还有一个提高I/O性能的优化万能钥匙,那就是Deadline。在采用Flash技术之前,我们都是使用机械磁盘来存储数据的,机械磁盘的寻道时间 是影响其速度的最重要因素,直接导致它的IOPS非常
24、有限。为了尽量排序和合并多个请 求,以到达一次寻道能够满足屡次I/O请求的目的,Linux文件系统设计了多种I/O调度策 略,以适用各种场景和存储设备。Linux的I/O调度策略包括:Deadline Anticipatory CFQ( Completely Fair Queuing)和 NOOPo这里主要介绍CFQ和Deadline。CFQ是Linux内核之后的默认调度策略,它 声称对每一个I/O请求都是公平的,这种调度策略对大局部应用都适用。但是如果数据库 有两个请求,一个请求3次I/O, 一个请求10 000次I/O,由于绝对公平,3次I/O的这个请求 需要跟10 000次I/O的请求竞
25、争,可能要等待上千次I/O完成才能返回,导致它的响应时间 非常长。并且如果在处理的过程中,又有很多I/O请求陆续发送过来,局部I/O请求甚至可 能一直无法得到调度被“饿死”。而Deadline要求I/O在指定的时间内被调度到,防止一个请 求在队列中长时间得不到处理,导致“饿死这种调度策略对于数据库应用来说更加适 用。我们可以通过如下命令将SDA的调度策略设置为Deadline。rootlocalhost echo deadline /sys/block/sda/queue/scheduler332 CPU当底层存储节点I/O问题解决以后,CPU的瓶颈就凸显出来了。本节介绍底层CPU硬 件和系统
26、可以进行哪些调整优化。1 .选择频率较高、核数较多的CPUMySQL早期版本对多核CPU的支持较弱,至的.6版本以后,MySQL能使用48核以上的 CPUo但是由于MySQL不支持SQL语句并行执行,所以CPU的频率较高、核数较多会更 有优势。在硬件选型时,请尽量选择频率较高、核数较多的CPU。2 .关闭节能模式关于CPU的节能模式在前面的章节中已经介绍过了,这里不再赘述。网络防止域名反解析MySQL默认在内存中会维护Host缓存,保存IP地址和主机名的映射关系。如果客户 端连接使用的IP地址不在Host缓存中,MySQL需要反解析域名,导致客户端连接时间较 长。建议设置skip_name_r
27、esolve=on防止域名解析,客户端授权用localhost或者IP地址表 示,而不要使用DNS名称表示。关 闭 iptables 和 SELinux很多数据平安公司提供的检查项都建议在数据库服务器上开启iptables或者SELinux。 但是对于高并发和大压力情况下的MySQL数据库来说,开启了iptables会造成队列满,开 启了SELinux会导致MySQL访问文件权限出现问题,远远大于所谓的平安检查项带来的好 处。采用SSH登录端口修改,在网络交换机上设置平安策略比在数据库上开启iptables和 SELinux要好得多。3 .网卡多队列防止CPU的IRQ瓶颈网卡发送和接收数据包需
28、要通过IRQ中断请求CPU处理,但是在Linux系统上,局部 网卡上的所有中断请求只通过一个CPU处理,从而导致该CPU成为性能瓶颈。使用mpstat 查看信息如下:04:18:08 PM CPU%usr%nice%sys%iowait%irq%soft%steal%guest %idle04:18:09 PM all46.880.009.451.230.003.770.000.00 38.6604:18:09 PM 07.140.002.040.000.0090.820.000.000.0004:18:09 PM 164.950.0011.343.090.000.000.000.00 20.
29、6204:18:09 PM 260.820.0013.402.060.000.000.000.00 23.71在上述信息中,CPUO的soft IRQ占了90.82%, idle为0%,成为性能瓶颈。解决这个问题很简单,可以使用多队列的网卡(一般Intel的较新网卡都支持多队 列),或者在确定是IRQ中断的问题时,手动将网卡软中断均分到多个CPU上。4 .在短连接下降低TIME_WAIT Socket连接关于TIME_WAIT状态的Socket连接在前面的章节中已经介绍过了,这里不再赘述。5 .考虑调整sysctLconf中的参数net.core.rmem_default = 16777216
30、net. core. wmem_def aul t = 16777216net. core. rmem_max 16777216net.core.wmem_max = 16777216net, ipv4.ip_local_port_range = 1024 65535net, ipv4.ip_forward = 0net.ipv4.conf.default.rp_filter = 1net.ipv4.conf.default.accept_source_route = 0net ipv4 tcp_syncookies = 0net.ipv4.tcp_rmem = 4096 87380 1677
31、7216net.ipv4.tcp_wmem 4096 65536 16777216其他6 .进程资源限制在前面的章节中介绍了nofile进程资源限制导致MySQL连接数受限的问题,其实 在/etc/security/limits.conf文件中还有很多参数可以调整。下面是推荐的配置,建议读者根 据自己的MySQL业务系统的压力进行适当调整。soft nproc 16384 hard nproc 16384 soft nofile 65536 hard nofile 65536 hard memlock unlimited soft memlock unlimited soft stack 32768 hard stack 327687 .使用64位Linux系统不知道还有没有DBA在32位的Linux系统上使用MySQL,如果还有的话,请自己找一 个角落面壁思过吧。本章小结本章的内容涉及很多Linux本身的问题,有些问题可以请专业的网络工程师、系统管 理员解决,但是作为DBA,需要知道大概是什么问题,怎么排查,可以参考“金字塔”理 论,建立自己的系统思维和系统方法。川这里的I/O是指广义上的I/O系统,包括硬件上的内存和存储设备,以及系统上的I/O相关参数和文件系统。|2这里的nodes指的是interleave=nodes中的参数nodes。
限制150内