Mysql性能优化实践搜狐畅游mysqldba王洪权mydbalife@gmail.comsummarry•Numa架构对Mysql使用swap产生的影响•硬件优化•操作系统优化•网络优化•重要性能参数调整为什么会产生swap程序运行需要大量内存,内存在系统中是一个非常重要的资源,为了满足程序的需求,在面临内存空间紧张的时候,系统就虚拟了一步分内存,这部分内存被映射到swap上。SWAP问题在系统中产生swap的场景1.Cp大文件2.Mysqldump等3磁盘临时表的创建,排序调整方法•如何降低mysql对swap的使用1./proc/sys/vm/swappiness(将该值设置为0)--临时/etc/sysctl.conf上添加vm.swappiness=0(永久)2.innodb_flush_method参数设置为O_DIRECT操作系统采用xfs时候,/etc/fstab设置noatime,nodiratime,nobarrier3.Mysql中使用Memlock参数(ulimit–lunlimited)需要以root身份启动mysql,不推荐这么做4./usr/bin/numactl--interleaveall$cmd或者直接关闭numa=off5echo3/proc/sys/vm/drop_caches(会释放操作系统的cache,但是不是最终办法)NUMA的内存分配策略•NUMA的内存分配策略有四种:•1.缺省(default):总是在本地节点分配(分配在当前进程运行的节点上);•2.绑定(bind):强制分配到指定节点上;•3.交叉(interleave):在所有节点或者指定的节点上交织分配;•4.优先(preferred):在指定节点上分配,失败则在其他节点上分配。针对numa架构的内存分配策略我们做的改进1.BIOS中关闭对numa的支持2.OS内核,启动时设置numa=off3.可以用numactl命令将内存分配策略修改为interleave(交叉),SMPVSMUMA在内存分配上的区别Numastat查看内存使用情况•[root@~]#numastat•node0node1•numa_hit317326395418309015•numa_miss1004175020604904•numa_foreign2060490410041750•interleave_hit184644184008•local_node316614387417251784•other_node1075375821662135通过numactl查看分配内存的物理CPU查看numa开启时候内存分配情况Numa上的扩展•MySQL对大内存的管理效率不佳,所以对多处理机大内存的主机应该采用MySQL多实例,单实例无法充分发挥性能,并不随着硬件的提升性能线性增加,甚至可能下降。•参考Percona的白皮书,讲的比较详细。•硬件优化1.开启BBWCRaid卡强制使用writeback方式2.RAID卡关闭读cache:RAID卡上的cache容量有限,我们选择direct方式读取数据,从而忽略读cache。关闭预读:由于预读效果不佳,直接读取磁盘关闭磁盘Cache:RAID卡缓存已经缓冲了写操作,所以关闭磁盘cache条带:默认512K目前线上64K3.LinuxIO调度:/sys/block/sdb/queue/scheduler,默认cfq,调整为deadline(也可以在grub.conf中添加elevator=deadline)减少预读:/sys/block/sdb/queue/read_ahead_kb,默认128,调整为16增大队列:/sys/block/sdb/queue/nr_requests,默认128,调整为512NUMA策略:numactl--interleave=all或--cpunodebind=0--localalloc或者直接关闭numa=off操作系统优化采用64位redhat操作系统,因为32位操作系统在寻址内存大小上有限制。选择xfs文件系统挂载的时候设置LABEL=/home/homexfsdefaults,noatime,nodiratime,nobarrier12注意这里设置nobarrier直接在磁盘上操作,避免操作系统的cache,网络优化增加本地端口,以应对大量连接echo'102465000'/proc/sys/net/ipv4/ip_local_port_range增加队列的连接数echo'8192'/proc/sys/net/ipv4/tcp_max_syn_backlog设置mysql连接请求队列中允许存放的最大请求数back_log=150设置连接超时时间echo‘60'/proc/sys/net/ipv4/tcp_fin_timeoutMysql编译优化采用自行编译的mysql性能上更加稳定,这部分由大牛金荣介绍一下他的经验•innodbinnodb_flush_method设置为O_DIRECT•脏数据页的刷新•Innodb_max_dirty_pages_pct(根据业务的场景设置不同,根据脏页产生量)•innodb_io_capacity(根据磁盘的IO)•Innodb_adptive_flushing(ON)•Innodb_adaptive_flushing_method(设置为2采用estimate方式刷新,)•innodb_adaptive_checkpoint(设置为2采用estimate方式刷新XTRDB)•innodb_flush_neighbor_pages(设置为1默认,如果采用SSDfusion对于随机IO支持足够,可以设置成0)性能参数调整innodb_read_io_threads=1(因为innodb对于预读支持不是很好所以在这里设置为1)innodb_write_io_threads=16(脏页写的线程数,加大该参数的值,可以加大脏页写入的效率,提升写入的性能)innodb_flush_log_at_trx_commit(设置为2参数有012因为我们开启了bbwc)0每次提交的时候不写日志文件,每秒会写入到文件,并刷新到磁盘1每次提交的时候写日志文件,并刷新到磁盘2每次提交的时候写日志文件,但是不刷新到磁盘,每秒会刷新到磁盘。多实例混跑,DNS自动摘除Mysql架构分享Q&A