作者:杨文

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: 0HugePages_Surp: 0
Hugepagesize: 2048 kB

2.6、HugePages配置:

1)设置 memlock(内存锁):

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

2)修改/etc/sysctl.conf:

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

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

id mysql

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

more /proc/sys/vm/hugetlb_shm_groupsysctl -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 。


avatar
100
  Subscribe  
提醒