Mysql关于OS级优化

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介:

1、硬件层相关优化
1.1、CPU相关
1、选择Performance Per Watt Optimized(DAPC)模式,发挥CPU最大性能,跑DB这种通常需要高运算量的服务就不要考虑节电了
2、关闭C1E和C States等选项,目的也是为了提升CPU效率;
3、Memory Frequency(内存频率)选择Maximum Performance(最佳性能);
4、内存设置菜单中,启用Node Interleaving,避免NUMA问题(采用交叉策略)

NUMA: 非一致性内存访问架构
内存跟cpu 有一个绑定
64g内存 2*8cpu 
两个cpu 每个分的32g 内存
oracle 系统,如果在linux 架构上,分配的内存大于32G的问题?
uma  的内存访问策略,默认的是local  ,也就是优先使用本地内存, 这里就存在一个问题,
数据库 pg oracle 是多进程的,如果分配的sga  接近或者超过32g ,新的进程在同一个物理cpu 启动的时候,发现内存不够了,就有可能会导致swap ,而实际上,另一个物理cpu 的内存还没有用完,还可以在另一个物理cpu上绑定的内存上,继续分配内存。 


怎么避免呢? 单机单实例的数据库,建议关闭numa 策略。
 numastat 
 numactl  --show 
 针对我们的数据库主机,我们应该采用什么策略呢? 

或在OS层面调整:
针对我们上面的提出的问题,我们建议采用 interleave  模式。  即 交叉分配,这样基本可以做到内存平均的分配到两个node 里,
每个进程, 访问本地与访问异地内存的比例是1:1 。 
/usr/bin/numactl --interleave all   service mysqld start

1.2、磁盘I/O相关
1、使用SSD或者PCIe SSD设备,至少获得数百倍甚至万倍的IOPS提升;
2、购置阵列卡同时配备CACHE及BBU模块,可明显提升IOPS(主要是指机械盘,SSD或PCIe SSD除外。同时需要定期检查CACHE及BBU模块的健康状况,确保意外时不至于丢失数据)
3、有阵列卡时,设置阵列写策略为WB(write back),甚至FORCE WB(若有双电保护,或对数据安全性要求不是特别高的话),严禁使用WT策略。并且闭阵列预读策略,基本上是鸡肋,用处不大

2、系统层相关优化
1、使用deadline/noop这两种I/O调度器,千万别用cfq(它不适合跑DB类服务);
IO调度,默认cfq
cat /sys/block/sda/queue/scheduler
noop anticipatory deadline [cfq]
修改调度策略
echo 'deadline' > /sys/block/sda/queue/scheduler
对于SSD盘建议采用最简单的noop


vi /etc/rc.local
echo 'deadline' > /sys/block/sda/queue/scheduler
echo '16' > /sys/block/sda/queue/read_ahead_kb
echo '512' > /sys/block/sda/queue/nr_requests


减少预读,默认128
echo '16' > /sys/block/sda/queue/read_ahead_kb
增大队列,默认128
echo '512' > /sys/block/sda/queue/nr_requests

2、使用xfs文件系统,千万别用ext3;ext4勉强可用,但业务量很大的话,则一定要用xfs;
3、文件系统mount参数中增加:noatime, nodiratime, nobarrier几个选项(nobarrier是xfs文件系统特有的
格式化时的参数:
mkfs.xfs -d agcount=256 -l size=128m,lazy-count=1,version=2 /dev/diska1
mount时的参数
defaults,noatime,nodiratime,nobarrier,discard,allocsize=256m,logbufs=8,attr2,logbsize=256k
xfs没必要刻意进行优化,默认的参数就足够了


2.2、其他内核参数优化
针对关键内核参数设定合适的值,目的是为了减少swap的倾向,并且让内存和磁盘I/O不会出现大幅波动,导致瞬间波峰负载
1、将vm.swappiness设置为5-10左右即可,甚至设置为0(RHEL 7以上则慎重设置为0,除非你允许OOM kill发生),以降低使用SWAP的机会;
cat /proc/sys/vm/swappiness
vi /etc/sysctl.conf
vm.swappiness = 0

echo '0' > /proc/sys/vm/swappiness


2、将vm.dirty_background_ratio设置为5-10,将vm.dirty_ratio设置为它的两倍左右,以确保能持续将脏数据刷新到磁盘,避免瞬间I/O写,产生严重等待(和MySQL中的innodb_max_dirty_pages_pct类似)
vm.dirty_background_ratio:这个参数指定了当文件系统缓存脏页数量达到系统内存百分之多少时(如5%)就会触发pdflush/flush/kdmflush等后台回写进程运行,将一定缓存的脏页异步地刷入外存;
vm.dirty_ratio:而这个参数则指定了当文件系统缓存脏页数量达到系统内存百分之多少时(如10%),系统不得不开始处理缓存脏页(因为此时脏页数量已经比较多,为了避免数据丢失需要将一定脏页刷入外存);在此过程中很多应用进程可能会因为系统转而处理文件IO而阻塞。


cat /proc/sys/vm/dirty_background_ratio 
10
修改:vi /etc/rc.local
echo '20' >/proc/sys/vm/dirty_background_ratio
这个值是一个阀值,说明如果内存中的脏数据达到系统总内存的10%时,那么pdflush进程就会启动,将内存中的脏数据写回硬盘.这个值可适当调高.可获得更快的写入速度.
cat /proc/sys/vm/dirty_ratio 
20
echo '10'>/proc/sys/vm/dirty_ratio 


dirty_ratio的值是数据写进内存的阀值,20%是指当系统内存已经缓存了40%的数据以后,就不再往内存中缓存数据了.
修改:
vi /etc/rc.local
echo '40'>/proc/sys/vm/dirty_ratio


vi /etc/sysctl.conf
vm.dirty_ratio = 20
vm.dirty_background_ratio = 10
sysctl -p


3、将net.ipv4.tcp_tw_recycle、net.ipv4.tcp_tw_reuse都设置为1,减少TIME_WAIT,提高TCP效率;
vi /etc/sysctl.conf
net.ipv4.tcp_tw_recycle=1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。 
net.ipv4.tcp_tw_reuse=1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
sysctl -p


4、网传的read_ahead_kb、nr_requests这两个参数,我经过测试后,发现对读写混合为主的OLTP环境影响并不大(应该是对读敏感的场景更有效果).





本文转自 vfast_chenxy 51CTO博客,原文链接:http://blog.51cto.com/chenxy/1862754,如需转载请自行联系原作者
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
12天前
|
关系型数据库 MySQL 测试技术
MySQL的`IN`的优化经验
限制IN列表的长度:IN子句中的元素数量较多时,会显著降低查询性能。尽量减少IN中的项数量。
|
16天前
|
关系型数据库 MySQL Unix
linux优化空间&完全卸载mysql——centos7.9
linux优化空间&完全卸载mysql——centos7.9
52 7
|
17天前
|
SQL 存储 关系型数据库
不允许你不知道的 MySQL 优化实战(三)
不允许你不知道的 MySQL 优化实战(三)
23 1
|
17天前
|
SQL 关系型数据库 MySQL
不允许你不知道的 MySQL 优化实战(二)
不允许你不知道的 MySQL 优化实战(二)
23 2
|
3天前
|
存储 算法 关系型数据库
MySQL连接的原理⭐️4种优化连接的手段性能提升240%🚀
MySQL连接的原理⭐️4种优化连接的手段性能提升240%🚀
|
3天前
|
SQL canal 运维
MySQL高可用架构探秘:主从复制剖析、切换策略、延迟优化与架构选型
MySQL高可用架构探秘:主从复制剖析、切换策略、延迟优化与架构选型
|
3天前
|
存储 算法 关系型数据库
MySQL怎样处理排序⭐️如何优化需要排序的查询?
MySQL怎样处理排序⭐️如何优化需要排序的查询?
|
3天前
|
SQL 存储 关系型数据库
5分钟搞懂MySQL半连接优化⭐️多种半连接的优化策略
5分钟搞懂MySQL半连接优化⭐️多种半连接的优化策略
|
3天前
|
SQL 存储 关系型数据库
MySQL的3种索引合并优化⭐️or到底能不能用索引?
MySQL的3种索引合并优化⭐️or到底能不能用索引?
|
3天前
|
存储 关系型数据库 MySQL
MySQL的优化利器⭐️Multi Range Read与Covering Index是如何优化回表的?
本文以小白的视角使用通俗易懂的流程图深入浅出分析Multi Range Read与Covering Index是如何优化回表