乐趣区

关于mysql:技术分享-浅谈一下大页

作者:杨文

DBA,负责客户我的项目的需要与保护,会点数据库,不限于 MySQL、Redis、Cassandra、GreenPlum、ClickHouse、Elastic、TDSQL 等等。

本文起源:原创投稿

* 爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。


1、Linux 大内存页个性

Linux 下的大页分为两种类型:规范大页(Huge Pages)和通明大页(Transparent Huge Pages)。

大页的产生:大多数操作系统采纳了分段或分页的形式进行治理。分段是粗粒度的治理形式,而分页则是细粒度治理形式,分页形式能够防止内存空间的节约。相应地,也就存在内存的物理地址与虚拟地址的概念。通过后面这两种形式,CPU 必须把虚拟地址转换程物理内存地址能力真正拜访内存。为了进步这个转换效率,CPU 会缓存最近的虚拟内存地址和物理内存地址的映射关系,并保留在一个由 CPU 保护的映射表中。为了尽量进步内存的访问速度,须要在映射表中保留尽量多的映射关系。Linux 的内存治理采取的是分页存取机制,为了保障物理内存能失去充沛的利用,内核会依照 LRU 算法在适当的时候将物理内存中不常常应用的内存页主动替换到虚拟内存中,而将常常应用的信息保留到物理内存。通常状况下,Linux 默认状况下每页是 4K,这就意味着如果物理内存很大,则映射表的条目将会十分多,会影响 CPU 的检索效率。因为内存大小是固定的,为了缩小映射表的条目,可采取的方法只有减少页的尺寸。因而 Hugepage 便因而而来。也就是突破传统的小页面的内存治理形式,应用大页面 2M,4M 等。如此一来映射条目则显著缩小。TLB 缓存命中率将大大提高。

2、HugePages:

2.1、概念介绍:

1)HugePages 是从 Linux Kernel 2.6 后被引入的。目标是应用更大的内存页面(memory page size)以适应越来越大的零碎内存,让操作系统能够反对古代硬件架构的大页面容量性能。在 Linux 下,page size 默认是 4K,如果应用 HugePages,默认是 2M;

2)page table 和 TLB:

page table 映射表:物理内存和 swap 的对应关系、拜访内存是先读 page table、依据表里的映射关系操作;

TLB:cpu cache 组件、缓存局部 page table 以进步转换速度;

2.2、配置 HugePages 优缺点:

1)长处:

  • 不须要内存页替换;
  • 加重快表压力;
  • 加重换页表的负载;
  • 进步内存的性能,升高 CPU 负载;

2)毛病:传统大页很难手动治理, 而且通常须要对代码进行重大更改能力无效地应用。

2.3、HugePages 应用倡议:

1)如果您的零碎常常碰到因为 swap 引发的性能问题,零碎毫无疑问须要启用 HugePage。

2)OS 内存十分大的零碎也须要启用 HugePage。

2.4、应用 HugePages 注意事项:

如果未调整 HugePages,可能会引发上面的问题:

  • 数据库性能低下;
  • 呈现内存不足或者适度应用替换空间;
  • 数据库实例不能被启动;
  • 关键性零碎服务故障;

2.5、应用状况与配置查看:

1)确认 HuagePage 是否配置:

cat /proc/sys/vm/nr_hugepages

2)查看大页的应用状况:

$ grep Huge /proc/meminfo
HugePages_Total: 150
HugePages_Free: 150
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB

2.6、HugePages 配置:

1)设置 memlock(内存锁):

vim /etc/security/limits.conf
在文件最初增加信息:mysql soft memlock unlimited
mysql hard memlock unlimited

2)批改 /etc/sysctl.conf:

vi /etc/sysctl.conf
增加 / 批改信息:kernel.shmmax = 17179869184
kernel.shmall = 4194304

3)查看 mysql 用户的组信息:

id mysql

4)配置应用大页内存的用户组:

more /proc/sys/vm/hugetlb_shm_group
sysctl -w vm.hugetlb_shm_group=27

5)批改参数进行实例并重启失效:

vi /mysql/data/3306/my.cnf
[mysqld]
large-pages

6)验证 HugePages 配置:

cat /proc/meminfo

3、Transparent Huge Pages:

3.1、介绍:

通明大页(Transparent Huge Pages)缩写为 THP,从 RedHat 6,OEL 6,SLES 11 and UEK2 kernels 开始,零碎缺省会启用 Transparent HugePages,用来进步内存治理的性能。

3.2、Transparent Huge Pages 的应用倡议:

ORACLE 官网不倡议应用 RedHat 6、OEL 6、SLES 11 and UEK2 kernels 时开启通明大页。在 Oracle Linux 6.5、RHEL Linux 6.5+ 版中,已删除 Transparent HugePages。

3.3、Transparent Huge Pages 的长处:

  • 能够应用 swap,内存页默认是 2M 大小,须要应用 swap 的时候,内存被宰割为 4k 大小;
  • 对用户通明,不须要用户做非凡配置;
  • 不须要依某种库文件;

3.4、应用状况与配置查看:

1)查看通明大页是否启用了:

# cat /sys/kernel/mm/transparent_hugepage/enabled

2)应用状况监控:

# cd /sys/kernel/mm/transparent_hugepage/khugepaged
阐明:alloc_sleep_millisecs:多长时间整顿一次碎片;pages_collapsed 一个扫描周期被扫描的内存页数;scan_sleep_millisecs:多长时间扫描一次。

3.5、敞开通明大页性能:

1)长期敞开:

# echo never >> /sys/kernel/mm/transparent_hugepage/enabled
# echo never >> /sys/kernel/mm/transparent_hugepage/defrag

2)永恒敞开:

在 /etc/rc.local 文件中退出如下内容:

#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
touch /var/lock/subsys/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

4、Huge Pages 和 Transparent Huge Pages 区别:

这两者的区别在于大页的分配机制,规范大页治理是在系统启动时事后调配的,而通明大页治理则是动态分配的形式(在运行时由 khugepaged 过程动静的调配),能够实时配置,不须要重启就能失效配置。

阐明:通明大页与传统 HugePages 联用会呈现一些问题,导致性能问题和零碎重启;ORACLE 强烈建议开启 HugePages 须要敞开 Transparent HugePages。

退出移动版