MySQL-02-性能优化

运行环境调优
  1. 调整 Linux 默认的 IO 调度算法。Linux 默认的 IO 调度算法为 cfq,如果是机械磁盘,需要修改为deadline,如果是 SSD 或者 PCIe-SSD 设备,需要修改为 noop(no-operation/先进先出/电梯调度) ,可以使用下面两种修改方式:
    • echo “deadline” > /sys/block/sda/queue/scheduler
    • 修改/etc/grub.conf配置文件,在kernel 那行增加一个配置,例如:elevator=deadline
  2. 禁用 NUMA 特性,新一代架构的 NUMA 不适合跑数据库,NUMA是为了内存利用率的提高,但反而可能导致一 CPU 的内存尚有剩余,另外一个却不够用了,发生swap的问题,修改方式:
    • 修改/etc/grub.conf关闭 NUMA,重启后生效 numa=off
    • 修改 /etc/init.d/mysql 或 mysqld_safe 脚本, numactl –interleave=all
  3. 修改 swappiness 设置,用来控制物理内存交换出去的策略,swappiness 设置为 0 表示尽量少使用swap,100表示尽量将inactive 的内存页(程序映射着,但是长时间不用的内存)交换到 swap 里或者释放 cache,操作如下:
    • 我们可以利用vmstat查看系统里面有多少inactive的内存,vmstat -a 1
    • 这个值推荐设置为 1, 设置方法是,在 /etc/sysctl.conf 文件中增加一行 vm.swappiness = 1
  4. 扩大文件描述符,这个是经常修改的参数,高并发的程序都会修改,修改方法:
    • 动态修改,重启失效,只能使用 root,并且当前 session 有效 ulimit -n 51200
    • 修改配置文件,永久生效。 在/etc/security/limits.conf配置文件中增加
hard nofile 51200 
soft nofile 51200
  1. 优化文件系统挂载参数。对于文件系统,如无特殊要求,最好采用ext4。
    • 文件系统挂载参数是在/etc/fstab文件中修改,重启时候生效。
    • noatime 表示不记录访问时间,nodiratime 不记录目录的访问时间。
    • barrier=0,表示关闭 barrier 功能.
    • barrier 的主要目的是为了保证磁盘写数据的安全性,但是会降低性能。如果有BBU之类的电池备份电源保证控制卡不瞬间掉电,那么这个功能就可以放心大胆的关闭。
配置参数调优

my.cnf 中的配置参数调优取决于业务、负载或硬件,在慢内存和快磁盘、高并发和写密集型负载情况下,都需要特殊的调整。

参数 作用
query_cache_size query cache是一个众所周知的瓶颈,甚至在并发并不多时也如此。 最 好是一开始就停用,设置query_cache_size = 0,并利用其他方法加速查询:优化索引、增加拷贝分散负载或者启用额外的缓存(比如memcache或redis)。如果已经启用了query cache并且还没有发现任何问题,query cache可能有用。如果想停用它,那就得小心了。
innodb_buffer_pool_size 缓冲池是数据和索引缓存的地方:这个值越大越好,这能保证你在大多数的读取操作时使用的是内存而不是硬盘。典型的值是5-6GB(8GB内存),20-25GB(32GB内存),100-120GB(128GB内存)。
innodb_log_file_size redo日志被用于确保写操作快速而可靠并且在崩溃时恢复。从MySQL 5.5之后,崩溃恢复的性能的到了很大提升,可以同时拥有较高的写入性能和崩溃恢复性能。在MySQL 5.6里可以被提高到4GB以上。如果应用程序需要频繁的写入数据,可以一开始就把它这是成4G。
max_connections max_connection值被设高了(例如1000或更高)之后一个主要缺陷是当服务器运行1000个或更高的活动事务时会变的没有响应。在应用程序里使用连接池或者在MySQL里使用进程池有助于解决这一问题。
back_log 要求 mysql 能有的连接数量。当主要mysql线程在一个很短时间内得到非常多的连接请求,这就起作用,然后主线程花些时间检查连接并且启动一个新线程。back_log指明在mysql暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。只有如果期望在一个短时间内有很多连接,需要增加它,换句话说,该值对到来的tcp/ip连接的侦听队列的大小。
innodb_file_per_table 这项设置告知InnoDB是否需要将所有表的数据和索引存放在共享表空间里(innodb_file_per_table = OFF)或者为每张表的数据单独放在一个.ibd文件(innodb_file_per_table = ON)。每张表一个文件允许你在drop、truncate或者rebuild表时回收磁盘空间。这对于一些高级特性也是有必要的,比如数据压缩。但是它不会带来任何性能收益。MySQL 5.6中,这个属性默认值是ON。
innodb_flush_log_at_trx_commit 默认值为1,表示InnoDB完全支持ACID特性。当关注点是数据安全的时候这个值是最合适的,比如在一个主节点上。但是对于磁盘(读写)速度较慢的系统,它会带来很巨大的开销,因为每次将改变flush到redo日志都需要额外的fsyncs。如果值为0速度就更快了,但在系统崩溃时可能丢失一些数据, 所以一遍只适用于备份节点。
innodb_flush_method 这项配置决定了数据和日志写入硬盘的方式。一般来说,如果你有硬件RAID控制器,并且其独立缓存采用write-back机制,并有着电池断电保护,那么应该设置配置为O_DIRECT;否则,大多数情况下应将其设为fdatasync(默认值)。sysbench是一个可以帮助你决定这个选项的好工具。
innodb_log_buffer_size 这项配置决定了为尚未执行的事务分配的缓存。但是如果事务中包含有二进制大对象或者大文本字段的话,看Innodb_log_waits状态变量,如果它不是0,增加innodb_log_buffer_size。
log_bin 如果数据库服务器充当主节点的备份节点,那么开启二进制日志是必须的。就算只有一个服务器,如果你想做基于时间点的数据恢复,这也是很有用的。二进制日志一旦创建就将永久保存。如果不想让磁盘空间耗尽,你可以用 PURGE BINARY LOGS 来清除旧文件,或者设置 expire_logs_days 来指定过多少天日志将被自动清除。记录二进制日志不是没有开销的,所以如果你在一个非主节点的复制节点上不需要它的话,那么建议关闭这个选项。
interactive_timeout 服务器在关闭它前在一个交互连接上等待行动的秒数。一个交互的客户被定义为对 mysql_real_connect()使用 client_interactive 选项的客户。 默认数值是28800,建议改为7200。
table_open_cache MySQL每打开一个表,都会读入一些数据到table_open_cache缓存中,当MySQL在这个缓存中找不到相应信息时,才会去磁盘上读取。假定系统有200个并发连接,则需将此参数设置为200*N(N为每个连接所需的文件描述符数目);当把table_open_cache设置为很大时,如果系统处理不了那么多文件描述符,那么就会出现客户端失效,连接不上。
max_allowed_packet 接受的数据包大小;增加该变量的值十分安全,这是因为仅当需要时才会分配额外内存。例如,仅当你发出长查询或MySQLd必须返回大的结果行时MySQLd才会分配更多内存。该变量之所以取较小默认值是一种预防措施,以捕获客户端和服务器之间的错误信息包,并确保不会因偶然使用大的信息包而导致内存溢出
skip_name_resolve 当客户端连接数据库服务器时,且当DNS很慢时,建立连接也会很慢。因此建议在启动服务器时关闭skip_name_resolve选项而不进行DNS查找。
参考文档

https://www.jianshu.com/p/c7f497f30d7a

发布了21 篇原创文章 · 获赞 1 · 访问量 2757

猜你喜欢

转载自blog.csdn.net/ManWZD/article/details/104094324