硬件,系统,Mysql各层优化checklist

root
233
文章
0
评论
2021年6月17日18:07:01 评论 7524字阅读25分4秒

硬件,系统,Mysql各层优化checklist

 

硬件优化checklist

1.服务器关闭节能模式

https://www.cnblogs.com/larrypeng/p/11880631.html

2.关闭NUMA

方法一:通过bios关闭
BIOS:interleave = Disable / Enable

方法二:通过OS关闭
1、编辑 /etc/default/grub 文件,加上:numa=off
GRUB_CMDLINE_LINUX="crashkernel=auto numa=off rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet"
2、重新生成 /etc/grub2.cfg 配置文件:
# grub2-mkconfig -o /etc/grub2.cfg1
3,重启服务器
reboot
4.重启之后进行确认
 dmesg | grep -i numa
5.再次确认
cat /proc/cmdline

 

3.阵列卡选择FORCE WB策略

https://www.cnblogs.com/Sungeek/p/9894873.html

 

4.阵列卡挂载更多磁盘

 

5.阵列卡配置CACHE,BBU

 

6.选用更好的I/O设备

 

系统层优化

1.调整io scheduler(调度器)

选择noop或者deadline,获得更好的io性能

Linux I/O调度器(Linux I/O Scheduler)Linux内核中的一个组成部分,用户可以通过调整这个调度器来优化系统性能,
Linux I/O调度器(Linux I/O Scheduler)是LinuxI/O体系的一个组件,它介于通用块层和块设备驱动程序之间。

目前 Linux 上有如下几种 I/O 调度算法
1.noop(No Operation) - 通常用于内存存储的设备。
2.cfq(Completely Fair Scheduler ) – 完全公平调度器。进程平均使用IO带宽。
3.Deadline – 针对延迟的调度器,每一个 I/O,都有一个最晚执行时间。
4.Anticipatory – 启发式调度,类似 Deadline 算法,但是引入预测机制提高性能。

查看系统支持的I/O调度器

查看Linux系统的I/O调度器一般分成两个部分,一个是查看Linux系统整体使用的I/O调度器,另一个是查看某磁盘使用的I/O调度器。

[root@master01 ~]# dmesg | grep -i scheduler
[    0.533210] io scheduler noop registered
[    0.533213] io scheduler deadline registered (default)
[    0.533262] io scheduler cfq registered
[    0.533265] io scheduler mq-deadline registered
[    0.533268] io scheduler kyber registered

 

查看某块硬盘使用的I/O调度器

[root@master01 ~]# cat /sys/block/sda/queue/scheduler
noop [deadline] cfq 

 

零时修改磁盘的I/O调度器

Linux下更改的I/O调度器很简单,不需要更新内核,无需重启计算机,可以使用shell命令修改

echo noop > /sys/block/sdx/queue/scheduler

 

永久修改I/O调度器

grubby --grub --update-kernel=ALL --args="elevator=deadline"

 

 

2.调整文件系统

使用XSF文件系统

 

3.关闭透明大页

如何关闭 Transparent Huge pages ?

[root@master01 ~]#  grep Huge /proc/meminfo
AnonHugePages:    616448 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

检查当前的transparent_hugepage状态(以下为开启状态)

[root@master01 ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
[root@master01 ~]# cat /sys/kernel/mm/transparent_hugepage/defrag
[always] madvise never

透明大页关闭方法有两种,一种是通过命令关闭,一种通过修改grub开机引导文件关闭:

方法一:

  • 1)手动临时关闭
[root@master01 ~]# echo never > /sys/kernel/mm/transparent_hugepage/enabled
[root@master01 ~]# echo never > /sys/kernel/mm/transparent_hugepage/defragz
  • 再次查看
[root@master01 ~]# cat /sys/kernel/mm/transparent_hugepage/defrag
always madvise [never]
  • 2)开机自动关闭
[root@master01 ~]# vim /etc/rc.d/rc.local
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi
[root@master01 ~]# chmod +x /etc/rc.d/rc.local
  • 再次查看
[root@master01 ~]# cat /sys/kernel/mm/transparent_hugepage/defrag
always madvise [never]

方法二:

编辑/etc/sysconfig/grub 文件,在 GRUB_CMDLINE_LINUX 那一行后面追加 transparent_hugepage=never例如:

[root@localhost ~]# cat /etc/sysconfig/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto spectre_v2=retpoline rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rd.lvm.lv=centos/usr rhgb quiet transparent_hugepage=never"
GRUB_DISABLE_RECOVERY="true"

 

4.考虑关闭SWAP

##清空缓存
echo 3 >/proc/sys/vm/drop_caches
swapoff -a
/etc/fstab

 

 

5.修改脏页比例

脏页是Linux内核中的概念,因为硬盘的读写速度远赶不上内存的速度,系统就把读写比较频繁的数据事先放到内存中,以提高读写速度,这就叫高速缓存,linux是以页作为高速缓存的单位,当进程修改了高速缓存里的数据时,该页就被内核标记为脏页,内核将会在合适的时间把脏页的数据写到磁盘中去,以保持高速缓存中的数据和磁盘中的数据是一致的。

[root@master01 ~]# sysctl -a|grep -i dirty
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.ens33.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
vm.dirty_background_bytes = 0
//
vm.dirty_background_ratio = 10
vm.dirty_bytes = 0
vm.dirty_expire_centisecs = 3000
vm.dirty_ratio = 30
vm.dirty_writeback_centisecs = 500

以上参数的源文件位置为:

[root@master01 ~]# ls -l /proc/sys/vm/dirty_*
-rw-r--r-- 1 root root 0 6月  16 18:51 /proc/sys/vm/dirty_background_bytes
-rw-r--r-- 1 root root 0 6月  16 18:00 /proc/sys/vm/dirty_background_ratio
-rw-r--r-- 1 root root 0 6月  16 18:51 /proc/sys/vm/dirty_bytes
-rw-r--r-- 1 root root 0 6月  16 18:51 /proc/sys/vm/dirty_expire_centisecs
-rw-r--r-- 1 root root 0 6月  16 18:00 /proc/sys/vm/dirty_ratio
-rw-r--r-- 1 root root 0 6月  16 18:51 /proc/sys/vm/dirty_writeback_centisecs

参数解析:

1、vm.dirty_background_ratio 

内存可以填充脏数据的百分比。这些脏数据稍后会写入磁盘,pdflush/flush/kdmflush这些后台进程会稍后清理脏数据。比如,我有32G内存,那么有3.2G(10%的比例)的脏数据可以待着内存里,超过3.2G的话就会有后台进程来清理。

2、vm.dirty_ratio

可以用脏数据填充的绝对最大系统内存量,当系统到达此点时,必须将所有脏数据提交到磁盘,同时所有新的I/O块都会被阻塞,直到脏数据被写入磁盘。这通常是长I/O卡顿的原因,但这也是保证内存中不会存在过量脏数据的保护机制。

3、vm.dirty_background_bytes 和 vm.dirty_bytes

另一种指定这些参数的方法。如果设置 xxx_bytes版本,则 xxx_ratio版本将变为0,反之亦然。

4、vm.dirty_expire_centisecs 

指定脏数据能存活的时间。在这里它的值是30秒。当 pdflush/flush/kdmflush 在运行的时候,他们会检查是否有数据超过这个时限,如果有则会把它异步地写到磁盘中。毕竟数据在内存里待太久也会有丢失风险。

5、vm.dirty_writeback_centisecs 

指定多长时间 pdflush/flush/kdmflush 这些进程会唤醒一次,然后检查是否有缓存需要清理。

可以通过下面方式看内存中有多少脏数据:

[root@localhost ~]# cat /proc/vmstat | egrep "dirty|writeback"
nr_dirty 25
nr_writeback 0
nr_writeback_temp 0
nr_dirty_threshold 316783
nr_dirty_background_threshold 158391

说明:以上结果,显示一共有25页的脏数据

dirty_ratio 与 dirty_background_ratio 区别

文件系统缓存dirty_ratio与dirty_background_ratio两个参数区别

这两天在调优数据库性能的过程中,需要降低操作系统文件Cache对数据库性能的影响,故调研了一些降低文件系统缓存大小的方法,其中一种是通过修改 /proc/sys/vm/dirty_background_ratio 以及 /proc/sys/vm/dirty_ratio 两个参数的大小来实现。看了不少相关博文的介绍,不过一直弄不清楚这两个参数的区别在哪里,后来看了下面的一篇英文博客才大致了解了它们的不同。

vm.dirty_background_ratio:  这个参数指定了当文件系统缓存脏页数量达到系统内存百分之多少时(如5%)就会触发pdflush/flush/kdmflush等后台回写进程运行,将一定缓存的脏页异步地刷入外存磁盘上;

vm.dirty_ratio:  这个参数则指定了当文件系统缓存脏页数量达到系统内存百分之多少时(如10%),系统不得不开始处理缓存脏页(因为此时脏页数量已经比较多,为了避免数据丢失需要将一定脏页刷入外存磁盘上);在此过程中很多应用进程可能会因为系统转而处理文件IO而阻塞。

之前一直错误的以为dirty_ratio的触发条件不可能达到,因为每次肯定会先达到vm.dirty_background_ratio的条件,后来才知道自己理解错了。确实是先达到vm.dirty_background_ratio的条件后触发flush进程进行异步的回写操作,但是这一过程中应用进程仍然可以进行写操作,如果多个应用进程写入的量大于flush进程刷出的量那自然会达到vm.dirty_ratio这个参数所设定的阈值,此时操作系统会转入同步地处理脏页的过程,阻塞应用进程。

 

Linux 磁盘I/O优化

1、减少缓存

在很多情况下,有快速的磁盘子系统,它们有自己的大电池支持的NVRAM缓存,所以将东西保存在系统页面缓存中是有风险的。让我们尝试以更及时的方式向磁盘发送I/O,并减少本地操作系统(借用服务行业的话)“陷入困境”的机会。为了做到这一点,我们减小/etc/sysctl.confvm.dirty_background_ratiovm.dirty_ratio的数值,并执行 sysctl -p 命令:

vm.dirty_background_ratio = 5
vm.dirty_ratio = 10

这是基于Linux的虚拟机管理程序的典型方法。

不建议将这些参数设置为0,一些后台I/O可以很好地将应用程序性能与磁盘阵列在SAN(“峰值”)上的较短时间的较高延迟解耦。

2、增加缓存

在某些情况下,显著提高缓存对性能有积极的影响。在这些情况下,Linux客户机上包含的数据不是关键的,可能会丢失,而且应用程序通常会重复或以可重复的方式写入相同的文件。理论上,通过允许内存中存在更多脏页,你将在缓存中一遍又一遍地重写相同的块,只需要每隔一段时间向实际磁盘写一次。为此,我们提出了以下参数:

vm.dirty_background_ratio = 50
vm.dirty_ratio = 80

有时候还会提高vm.dirty_expire_centisecs 这个参数的值,来允许脏数据更长时间地停留。除了增加数据丢失的风险之外,如果缓存已满并需要同步,还会有长时间I/O卡顿的风险,因为在大型虚拟机缓存中有大量数据。

3、增减都用

有时候系统需要应对突如其来的高峰数据,它可能会拖慢磁盘。

比如说:每小时或者午夜进行批处理作业、在Raspberry Pi上写SD卡等等。

这种情况下,可以允许大量的写I/O存储在缓存中,这样后台刷新操作就可以慢慢异步处理它:

vm.dirty_background_ratio = 5
vm.dirty_ratio = 80

这个时候,系统后台进程在脏数据达到5%时就开始异步清理,但在80%之前系统不会强制同步写磁盘。在此基础上,你只需要调整RAMvm.dirty_ratio大小以便能缓存所有的写数据。当然,磁盘上的数据一致性也存在一定风险。

 

Mysql关键选项

大部分情况设置4M就足够了

read_buffer_size = 4M
read_rnd_buffer_size = 4M
sort_buffer_size = 4M
join_buffer_size = 4M

tmp/heap table=96M

tmp_table_size = 96M

binlog_format=row,保证主从的一致性

sync_binlog=1,保证主库的数据完整性

binlog_format = ROW
sync_binlog = 1

long_query_time慢查询时间

long_query_time = 2 #可以设置成0.5
log_throttle_queries_not_using_indexes = 10 #1分钟不走索引
的只记录10条

超时时间

interactive_timeout = 600
wait_timeout = 600

元数据锁等待超时时间

lock_wait_timeout = 600

锁的超时时间

innodb_lock_wait_timeout = 10  #锁超时

避免出现不带where条件的全表操作

sql_safe_updates = 1

 

Mysql变量对性能的影响

mysql> pager cat -|less -i -n -S
PAGER set to 'cat -|less -i -n -S'

mysql> show global status;
+-----------------------------------------------+---------
| Variable_name                                 | Value   
+-----------------------------------------------+---------
//这两个值比较高需要关注一下
| Aborted_clients                                  | 0    //表示正常用户断开了   
| Aborted_connects                              | 1     //表示还没有进来的用户

零时表相关
Created_tmp_*

//如果这两条值特别高,说明没有使用索引的sql特别多
| Handler_read_rnd                              | 0          //随机读一条
| Handler_read_rnd_next                         | 2165 //随机读下一条

//等待事件
值超过0就要关注了
| Innodb_buffer_pool_wait_free                  | 0 

//最大连接数发生的时间,对多发生的并发连接
| Max_used_connections                          | 1       
| Max_used_connections_time                     | 2021-06-


 

 

继续阅读
weinxin
我的微信
这是我的微信扫一扫
  • 文本由 发表于 2021年6月17日18:07:01
  • 除非特殊声明,本站文章均为原创,转载请务必保留本文链接
Mysql 创建表 MySQL

Mysql 创建表

Mysql 创建表   Mysql创建数据库 CREATE DATABASE db_name //字符集 CHARACTER SET charset_name //校验规则 COLLATE ...
Mysql数据类型 MySQL

Mysql数据类型

Mysql数据类型   INT整形类型---属性 unsigned/signed 无符号/有符号 unsigned无符号,创建一个无符号的列 mysql> create table z...
Mysql体系结构 MySQL

Mysql体系结构

Mysql体系结构 数据库: 物理操作系统文件或其他形式文件类型的集合   数据库实例: 由数据库后台进程/线程以及一个共享内存区域组成 共享内存可以被运行的后台 进程/线程所共享 数据库实...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: