MySQL-第十三章-系统优化
1. 优化哲学
1.1 为什么优化?
为了获得成就感?
为了证实比系统设计者更懂数据库?
为了从优化成果来证实优化者更有价值?
- - - - - - - - - - - - - - - -
但通常事实证实的结果往往会和您期待相反!
优化有风险,涉足需谨慎!
1.2 优化风险
优化不总是对一个单纯的环境进行!还很可能是一个复杂的已投产的系统。
优化手段本来就有很大的风险,只不过你没能力意识到和预见到!
任何的技术可以解决一个问题,但必然存在带来一个问题的风险!
对于优化来说解决问题而带来的问题控制在可接受的范围内才是有成果。
保持现状或出现更差的情况都是失败!
稳定性和业务可持续性通常比性能更重要!
优化不可避免涉及到变更,变更就有风险!
优化使性能变好,维持和变差是等概率事件!
优化不能只是数据库管理员担当风险,但会所有的人分享优化成果!
所以优化工作是由业务需要驱使的!!!
1.3 谁参与优化
数据库管理员
业务部门代表
应用程序架构师
应用程序设计人员
应用程序开发人员
硬件及系统管理员
存储管理员
1.4 优化方向
安全优化(业务持续性)
性能优化(业务高效性)
1.5 优化的范围及思路
优化范围:
存储、主机和操作系统:
主机架构稳定性
I/O规划及配置
Swap
OS内核参数
网络问题
应用程序:(Index,lock,session)
应用程序稳定性和性能
SQL语句性能
串行访问资源
性能欠佳会话管理
数据库优化:(内存、数据库设计、参数)
内存
数据库结构(物理&逻辑)
实例配置
1.6 优化效果和成本的评估
2. 优化工具的使用
2.1 系统层面的
2.1.1 CPU
top
cpu使用情况的平均值:
CPU每个核心的分别使用的情况(按1):
程序是如何使用CPU的?
系统给每个程序分配CPU的时候,以时间来划分表的。
CPU有效工作时间?
计算: 程序运行,数据处理
控制: 少量的关于申请资源和释放资源等
CPU无效工作时间
等待 IO
CPU各项指标说明
0.0 us
用户程序,在运行过程中,使用的CPU时间的占比。
我们希望的是越高越好,尽量控制在90%
0.0 sy
控制: 资源管理,内核的工作(系统调用)
sys高的原因:
1. bug ,中病毒了
2. 锁的问题
99.9 id
CPU空间的时间占比
0.0 wa
CPU花在等待上的时间
wa高的原因:
1. 锁
2. IO (raid,过度条带化)
3. 索引
多cpu使用情况监控:
主要判断我们cpu多核心有没有被充分利用。
现象:单颗很忙,其他很闲,对于MySQL来讲,有可能是并发参数设定不合理导致的。
2.1.2 MEM
KiB Mem : 4028432 total, 3774464 free, 116240 used, 137728 buff/cache
### 1.2.1 名称介绍
total :总内存大小
free :空闲的
used :在使用的
buff/cache :缓冲区 和 缓存
2.1.3 内存管理子系统
slab Allocator
buddy system
程序=指令+数据
对于page cache来讲(OS buffer)
1. 内存的可用空间的计算 free +buffer cache
2. 内存回收(buffer)的方式:
(1) 写入磁盘
(2) swap
对于数据库来讲:需要将swap屏蔽掉
2.1.4 swap
KiB Swap: 2097148 total, 2097148 free, 0 used. 3701464 avail Mem
Linux 6操作系统,默认回收策略(buffer cache),不立即回收策略
内存使用达到100%-60%时候,40% 会使用swap
Linux 7操作系统
内存使用达到100%-30%(70%)时候,才会时候swap
cat /proc/sys/vm/swappiness
30
echo 0 >/proc/sys/vm/swappiness 的内容改成0(临时)
vim /etc/sysctl.conf
添加:
vm.swappiness=0
sysctl -p
2.2 iostat 命令
dd if=/dev/zero of=/tmp/bigfile bs=1M count=4096
iostat -dm 1
现象说明
1. IO 高 cpu us 也高,属于正常现象
2. CPU us高 IO很低 ,MySQL 不在做增删改查,有可能是存储过程,函数,排序,分组,多表连接
3. Wait,SYS 高 , IO低:IO出问题了,锁等待过多的几率比较大.
IOPS:每秒磁盘最多能够发生的IO次数,这是个定值
频繁小事务,IOPS很高,达到阈值,可能IO吞吐量没超过IO最大吞吐量.无法新的IO了
存储规划有问题.
2.3 数据库优化工具
show status
show variables
show index
show processlist
show slave status
show engine innodb status
desc/explain
slowlog
扩展类深度优化:
pt系列
mysqlslap
sysbench
information_schema
performance_schema
sys
3. 优化思路分解
3.1 硬件优化
3.1.1 主机
真实的硬件(PC Server): DELL R系列 ,华为,浪潮,HP,联想
云产品:ECS、数据库RDS、DRDS
IBM 小型机 P6 570 595 P7 720 750 780 P8
3.1.2 CPU根据数据库类型
OLTP
OLAP
IO密集型:线上系统,OLTP主要是IO密集型的业务,高并发
CPU密集型:数据分析数据处理,OLAP,cpu密集型的,需要CPU高计算能力(i系列,IBM power系列)
CPU密集型: I 系列的,主频很高,核心少
IO密集型: E系列(至强),主频相对低,核心数量多
3.1.3 内存
建议2-3倍cpu核心数量 (ECC)
3.1.4 磁盘选择
SATA-III SAS Fc SSD(sata) pci-e ssd Flash
主机 RAID卡的BBU(Battery Backup Unit)关闭
3.1.5 存储
根据存储数据种类的不同,选择不同的存储设备
配置合理的RAID级别(raid5、raid10、热备盘)
r0 :条带化 ,性能高
r1 :镜像,安全
r5 :校验+条带化,安全较高+性能较高(读),写性能较低 (适合于读多写少)
r10:安全+性能都很高,最少四块盘,浪费一半的空间(高IO要求)
3.1.6 网络
1、硬件买好的(单卡单口)
2、网卡绑定(bonding),交换机堆叠
以上问题,提前规避掉。
3.2 操作系统优化
3.2.1 Swap调整
echo 0 >/proc/sys/vm/swappiness的内容改成0(临时),
/etc/sysctl.conf
上添加vm.swappiness=0(永久)
sysctl -p
这个参数决定了Linux是倾向于使用swap,还是倾向于释放文件系统cache。在内存紧张的情况下,数值越低越倾向于释放文件系统cache。
当然,这个参数只能减少使用swap的概率,并不能避免Linux使用swap。
修改MySQL的配置参数innodb_flush_method,开启O_DIRECT模式
这种情况下,InnoDB的buffer pool会直接绕过文件系统cache来访问磁盘,但是redo log依旧会使用文件系统cache。值得注意的是,Redo log是覆写模式的,即使使用了文件系统的cache,也不会占用太多
3.2.2 IO调度策略
centos 7 默认是deadline
cat /sys/block/sda/queue/scheduler
#临时修改为deadline(centos6)
echo deadline >/sys/block/sda/queue/scheduler
vi /boot/grub/grub.conf
更改到如下内容:
kernel /boot/vmlinuz-2.6.18-8.el5 ro root=LABEL=/ elevator=deadline rhgb quiet
IO :
raid
no lvm
ext4或xfs
ssd
IO调度策略
提前规划好以上所有问题,减轻MySQL优化的难度。
3.3 应用端
1. 开发过程规范,标准
2. 减少烂SQL:不走索引,复杂逻辑,切割大事务.
3. 避免业务逻辑错误,避免锁争用.
这个阶段,需要我们DBA深入业务,或者要和开发人员\业务人员配合实现
4. MySQL参数优化测试
虚拟机vm12.5,OS centos 6.9(系统已优化),cpu*4(I5 4440 3.1GHZ),MEM*4GB ,HardDisk:SSD模拟数据库数据
drop database if exists oldboy;
create database oldboy charset utf8mb4 collate utf8mb4_bin;
use oldboy;
create table t_100w (id int,num int,k1 char(2),k2 char(4),dt timestamp);
delimiter //
create procedure rand_data(in num int)
begin
declare str char(62) default 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
declare str2 char(2);
declare str4 char(4);
declare i int default 0;
while i<num do
set str2=concat(substring(str,1+floor(rand()*61),1),substring(str,1+floor(rand()*61),1));
set str4=concat(substring(str,1+floor(rand()*61),2),substring(str,1+floor(rand()*61),2));
set i=i+1;
insert into t_100w values (i,floor(rand()*num),str2,str4,now());
end while;
end;
//
delimiter ;
插入100w条数据:
call rand_data(10000000);
commit;mysqlslap --defaults-file=/etc/my.cnf \
--concurrency=100 --iterations=1 --create-schema='oldboy' \
--query="select * from oldboy.t1000w where k2='FGCD'" engine=innodb \
--number-of-queries=200 -uroot -p123 -verbose
5. 硬件层面优化
5.1 硬件选配
DELL、HP、IBM、华为、浪潮。
CPU:I、E
内存:ECC
IO : SAS 、 pci-e SSD 、 Nvme flash
raid卡:Raid10
网卡: 单卡单口 bonding + 交换机堆叠
云服务器: ECS 、RDS 、TDSQL、PolarxDB
5.2 关闭NUMA
SMP NUMA
a. bios级别:
在bios层面numa关闭时,无论os层面的numa是否打开,都不会影响性能。
# numactl --hardware
available: 1 nodes (0) #如果是2或多个nodes就说明numa没关掉
b. OS grub级别:
vi /boot/grub2/grub.cfg
#/* Copyright 2010, Oracle. All rights reserved. */
default=0
timeout=5
hiddenmenu
foreground=000000
background=ffffff
splashimage=(hd0,0)/boot/grub/oracle.xpm.gz
title Trying_C0D0_as_HD0
root (hd0,0)
kernel /boot/vmlinuz-2.6.18-128.1.16.0.1.el5 root=LABEL=DBSYS ro bootarea=dbsys rhgb quiet console=ttyS0,115200n8 console=tty1 crashkernel=128M@16M numa=off
initrd /boot/initrd-2.6.18-128.1.16.0.1.el5.img
在os层numa关闭时,打开bios层的numa会影响性能,QPS会下降15-30%;
c. 数据库级别:
mysql> show variables like '%numa%';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| innodb_numa_interleave | OFF |
+------------------------+-------+
或者:
vi /etc/init.d/mysqld
找到如下行
# Give extra arguments to mysqld with the my.cnf file. This script
# may be overwritten at next upgrade.
$bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null &
wait_for_pid created "$!" "$mysqld_pid_file_path"; return_value=$?
将$bindir/mysqld_safe --datadir="$datadir"这一行修改为:
/usr/bin/numactl --interleave all $bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null &
wait_for_pid created "$!" "$mysqld_pid_file_path"; return_value=$?
5.3 阵列卡配置
raid10(推荐)
SSD或者PCI-E或者Flash
强制回写(Force WriteBack)
BBU 电池:如果没电会有较大性能影响、定期充放电,如果UPS、多路电源、发电机。可以关闭。
关闭预读
有可能的话开启Cache(如果UPS、多路电源、发电机。)
5.4 关闭THP
vi /etc/rc.local
在文件末尾添加如下指令:if test -f /sys/kernel/mm/transparent_hugepage/enabled; thenecho never > /sys/kernel/mm/transparent_hugepage/enabledfiif test -f /sys/kernel/mm/transparent_hugepage/defrag; thenecho never > /sys/kernel/mm/transparent_hugepage/defragfi[root@master ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
[root@master ~]# cat /sys/kernel/mm/transparent_hugepage/defrag
always madvise [never]
5.5 网卡绑定
bonding技术,业务数据库服务器都要配置bonding继续。建议是主备模式。
交换机一定要堆叠。
### 1.6 存储多路径
使用独立存储设备的话,需要配置多路径。
linux 自带 : multipath
厂商提供
6. 系统层面优化
6.1 更改文件句柄和进程数
内核优化 /etc/sysctl.conf
vm.swappiness = 5
vm.dirty_ratio = 20
vm.dirty_background_ratio = 10
net.ipv4.tcp_max_syn_backlog = 819200
net.core.netdev_max_backlog = 400000
net.core.somaxconn = 4096
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_tw_recycle=0
limits.conf
nofile 63000
6.2 防火墙
禁用selinux : /etc/sysconfig/selinux 更改SELINUX=disabled.
iptables如果不使用可以关闭。可是需要打开MySQL需要的端口号
6.3 文件系统优化
推荐使用XFS文件系统
MySQL数据分区独立 ,例如挂载点为: /data
mount参数 defaults, noatime, nodiratime, nobarrier 如/etc/fstab:
/dev/sdb /data xfs defaults,noatime,nodiratime,nobarrier 1 2
6.4 不使用LVM
6.5 IO调度
SAS : deadline
SSD&PCI-E: noopcentos 7 默认是deadline
cat /sys/block/sda/queue/scheduler#临时修改为deadline(centos6)
echo deadline >/sys/block/sda/queue/scheduler
vi /boot/grub/grub.conf
更改到如下内容:
kernel /boot/vmlinuz-2.6.18-8.el5 ro root=LABEL=/ elevator=deadline rhgb quiet
7. 数据库版本选择
1、稳定版:选择开源的社区版的稳定版GA版本。
2、选择mysql数据库GA版本发布后6个月-12个月的GA双数版本,大约在15-20个小版本左右。
3、要选择前后几个月没有大的BUG修复的版本,而不是大量修复BUG的集中版本。
4、要考虑开发人员开发程序使用的版本是否兼容你选的版本。
5、作为内部开发测试数据库环境,跑大概3-6个月的时间。
6、优先企业非核心业务采用新版本的数据库GA版本软件。
7、向DBA高手请教,或者在技术氛围好的群里和大家一起交流,使用真正的高手们用过的好用的GA版本产品。
最终建议: 8.0.20是一个不错的版本选择。向后可以选择双数版。
MySQL-第十三章-系统优化相关推荐
- 第二十三章 MySQL数据库 手册2 SQL语句
第二十三章 MySQL数据库 手册2 SQL语句 实验二:用SQL语句,管理数据库 `危险命令,delete 后不加 where 条件代表删除所有数据 delete.` `更加危险的删除命令trunc ...
- 《深入理解 Spring Cloud 与微服务构建》第十三章 配置中心 Spring Cloud Config
<深入理解 Spring Cloud 与微服务构建>第十三章 配置中心 Spring Cloud Config 文章目录 <深入理解 Spring Cloud 与微服务构建>第 ...
- 高级shell编程笔记(第十三章 系统与管理命令)
第十三章 系统与管理命令 在/etc/rc.d 目录中的启动和关机脚本中包含了好多有用的(和没用的)这些系统管理命令.这些命令通常总是被 root 用户使用,用与系统维护或者是紧急文件系统修复.一定要 ...
- 4.10 第十三章:Linux系统管理技巧
第十三章:Linux系统管理技巧 13.1监控系统的状态 13.1.1使用w命令查看当前系统的负载 13.1.2用vmstat命令监控系统的状态 13.1.3用top命令显示进程所占的系统资源 13. ...
- 第十三章 使用动态SQL(七)
文章目录 第十三章 使用动态SQL(七) SQL元数据 语句类型元数据 选择项目Select-item元数据 Query参数元数据 Query结果集元数据 %SQL.StatementResult属性 ...
- 谭浩强《C++程序设计》书后习题 第十三章-第十四章
2019独角兽企业重金招聘Python工程师标准>>> 最近要复习一下C和C++的基础知识,于是计划把之前学过的谭浩强的<C程序设计>和<C++程序设计>习题 ...
- python 教程 第十三章、 特殊的方法
第十三章. 特殊的方法 1) 特殊的方法 __init__(self,...) 这个方法在新建对象恰好要被返回使用之前被调用. __del__(self) 恰好在对象要被删除之前调用. __st ...
- 《Java编程思想》读书笔记 第十三章 字符串
<Java编程思想>读书笔记 第十三章 字符串 不可变String String对象是不可变的,每一个看起来会修改String值的方法,实际上都是创建一个全新的String对象,以及包含修 ...
- 第十三章、facl及用户及Linux终端
第十三章.facl及用户及Linux终端 08_01_facl及用户及Linux终端 文件系统访问列表: 如何让tom的文件被jerry读写? 用户名:tom, 基本组:tom 1. 添加jerry访 ...
最新文章
- 具有Python&OpenCV的本地二进制模式
- BZOJ1452 [JSOI2009]Count 树状数组
- 如何提高英文的科研写作能力--施一公教授
- Android Studio Linking an external C++ project 时候 报Invalid file name. Expected: CMakeLists.txt
- Docker系列之AspNetCore Runtime VS .NetCore Runtime VS SDK(四)
- java bytearrayoutputstream 文件_Java ByteArrayInputStream和ByteArrayOutputStream示例
- 计算机网络第4版潘爱民_王道考研 计算机网络(2)学习笔记
- servlet中文数据存入数据库为乱码的解决办法
- ie不支持replaceall_继IE之后,微软又要彻底放弃这些office了
- Dism++ 一款传说中的系统工具,使用简介
- JavaWeb笔记(一)Java网络编程
- 使用typescript开发集成阿里云短信接口
- 百度地图api自定义marker图片不显示问题
- tf SavedModel 保存模型的新方式
- 詹姆斯高斯林_詹姆斯·高斯林(James Gosling)关于Java的立场:我几乎不在乎
- WordPress .htaccess 安全配置15个
- H盘显示数据错误循环冗余检查要怎样办啊
- 山下英子(日)《断舍离》读书笔记
- 如何在今日头条做推广?今日头条推广怎么样?
- 佳能eosr控制环能否计算机控制,EOS R有哪些隐藏功能