Linux学习分享之标准大页和透明大页

赵云
• 阅读 199

Huge pages ( 标准大页 ) 和 Transparent Huge pages( 透明大页 )

在 Linux 中大页分为两种:Huge pages ( 标准大页 ) 和 Transparent Huge pages( 透明大页 ) 。

内存是以块即页的方式进行管理的,当前大大数据培训部分系统默认的页大小为 4096 bytes 即 4K。1MB 内存等于 256 页;1GB 内存等于 256000 页。

CPU 拥有内置的内存管理单元,包含这些页面的列表,每个页面通过页表条目引用。当内存越来越大的时候, CPU 需要管理这些内存页的成本也就越高,这样会对操作系统的性能产生影响。

Linux学习分享之标准大页和透明大页 

Huge Pages
Huge pages 是从 Linux Kernel 2.6 后被引入的,目的是通过使用大页内存来取代传统的 4kb 内存页面, 以适应越来越大的系统内存,让操作系统可以支持现代硬件架构的大页面容量功能。

Huge pages 有两种格式大小:2MB 和1GB ,2MB 页块大小适合用于 GB 大小的内存, 1GB 页块大小适合用于 TB 级别的内存;2MB 是默认的页大小。

Transparent Huge Pages
Transparent Huge Pages 缩写 THP ,这个是 RHEL 6 开始引入的一个功能,在 Linux6 上透明大页是默认启用的。

由于 Huge pages 很难手动管理,而且通常需要对代码进行重大的更改才能有效的使用,因此 RHEL 6 开始引入了 Transparent Huge Pages ,THP 是一个抽象层,能够自动创建、管理和使用传统大页。

THP 为系统管理员和开发人员减少了很多使用传统大页的复杂性 , 因为 THP 的目标是改进性能,因此其它开发人员 ( 来自社区和红帽 ) 已在各种系统、配置、应用程序和负载中对 THP 进行了测试和优化。这样可让 THP 的默认设置改进大多数系统配置性能。但是,不建议对数据库工作负载使用 THP 。

这两者最大的区别在于: 标准大页管理是预分配的方式,而透明大页管理则是动态分配的方式。

标准大页的页面大小
[root@localhost ~]# grep Hugepagesize /proc/meminfo
Hugepagesize: 2048 kB

注:THP 目前只能映射异步内存区域,比如堆和栈空间

使用Huge pages优点
Oracle 官方是推荐我们使用 Huge pages 的,它拥有以下的好处:

Larger Page Size and Less # ofPages: Default page size is 4K whereas the HugeTLB size is 2048K. That meansthe system would need to handle 512 times less pages.

Reduced Page Table Walking:Since a HugePage covers greater contiguous virtual address range than a regularsized page, a probability of getting a TLB hit per TLB entry with HugePages arehigher than with regular pages. This reduces the number of times page tablesare walked to obtain physical address from a virtual address.

Less Overhead for MemoryOperations: On virtual memory systems (any modern OS) each memory operation isactually two abstract memory operations. With HugePages, since there are lessnumber of pages to work on, the possible bottleneck on page table access isclearly avoided.

Less Memory Usage: From theOracle Database perspective, with HugePages, the Linux kernel will use lessmemory to create pagetables to maintain virtual to physical mappings for SGAaddress range, in comparison to regular size pages. This makes more memory tobe available for process-private computations or PGA usage.

No Swapping: We must avoidswapping to happen on Linux OS at all Document 1295478.1. HugePages are notswappable (whereas regular pages are). Therefore there is no page replacementmechanism overhead. HugePages are universally regarded as pinned.

No 'kswapd' Operations: kswapdwill get very busy if there is a very large area to be paged (i.e. 13 millionpage table entries for 50GB memory) and will use an incredible amount of CPUresource. When HugePages are used, kswapd is not involved in managing them. Seealso Document 361670.1

使用 Huge pages缺点
当然使用 Huge pages 也会存在某些缺点:

首先,开启该功能需要进行额外设置,

第二, Huge pages 和 Oracle 11g新 特性 AMM ( Automatic Memory Management )是相互冲突的,但是 ASMM ( Automatic Shared Memory Management )仍然可以继续使用。

Transparent Huge pages存在的问题
Oracle 官方虽然推荐我们使用 Huge pages ,但是却建议我们关闭 Transparent Huge pages ,因为透明大页存在一些问题:

在 RAC 环境下 透明大页( TransparentHugePages )会导致异常节点重启,和性能问题;
在单机环境中,透明大页( TransparentHugePages ) 也会导致一些异常的性能问题;
注:Transparent Huge Pages在32位的RHEL 6中是不支持的。

如何关闭 Transparent Huge pages ?#
环境:CentOS Linux release 7.8.2003 (Core)

[root@localhost ~]# grep Huge /proc/meminfo
AnonHugePages: 7956480 kB ----->>返回值不为0,表示开启了THP
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
检查当前的transparent_hugepage状态(以下为开启状态)

cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
cat /sys/kernel/mm/transparent_hugepage/defrag
[always] madvise never

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

方法一
手动临时关闭
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

参数说明
never 关闭,不使用透明内存 alway 尽量使用透明内存,扫描内存,有512个 4k页面可以整合,就整合成一个2M的页面 madvise 避免改变内存占用

开机自动关闭
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

授予执行权限

chmod +x /etc/rc.d/rc.local

方法二
备份配置文件

cp /etc/default/grub /etc/default/grub.date +%F.bak

备份grub配置文件

cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg.date +%F.bak

编辑/etc/default/grub 文件,在GRUB_CMDLINE_LINUX 后面加上

transparent_hugepage=never

或者编辑/etc/sysconfig/grub,其实/etc/sysconfig/grub是/etc/default/grub的软链接。但我遇到过不是软链接的关系情况,这样编辑/etc/sysconfig/grub是没有用户的;执行grub2-mkconfig不会把关闭THP的选项写入到gurb.cfg。

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"

再使用 grub2-mkconfig 生成grub.cfg配置文件。

grub2-mkconfig -o /boot/grub2/grub.cfg
init 6 -------->>>>重启生效
重启后效果

cat /proc/cmdline
BOOT_IMAGE=/vmlinuz-3.10.0-1127.el7.x86_64 root=/dev/mapper/rhel-root ro crashkernel=auto rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rd.lvm.lv=rhel/usr rhgb quiet transparent_hugepage=never

cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never] ---->>>[never]表示成功禁用THP
cat /sys/kernel/mm/transparent_hugepage/defrag ------>>> 这个应该是内存碎片整理
[always] madvise never

grep Hug /proc/meminfo
AnonHugePages: 0 kB ---------->>>返回值若是零,代表成功禁用THP
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB

扩展内容
使用情况监控 可以查看/sys/kernel/mm/transparent_hugepage/khugepaged下信息

一个扫描周期被扫描的内存页数 pages_to_scan (默认 4096 = 16MB)

多长时间扫描一次 scan_sleep_millisecs (默认 10000 = 10sec)

多长时间整理一次碎片

alloc_sleep_millisecs (默认 60000 = 60sec)

原创作者:Guo·Rulai

点赞
收藏
评论区
推荐文章
李异 李异
3年前
浏览器自带起始页的完美替代者:Wetab新标签页
不知道现在大家是使用浏览器自带的起始页,还是都安装了各种各样的新标签页插件?为什么要使用新标签页插件?众所周知,浏览器自带的起始页功能比较单一。就拿谷歌浏览器举例,虽然界面简洁,但是只有快捷方式和搜索框。只有少量图标还好,一旦添加过多,整个
顺心 顺心
5年前
Flutter 玩转微信——闪屏页妙用
概述众所周知,一个健全的App,通常都会有一个SplashPage页面,且该页面一般用于应用(APP)启动时,当然其存在的主要目的是承载:启动页、引导页、广告页、等待页等业务场景。笔者认为,与其说是闪屏页,倒不如叫中转页,怎么个中转法,还请听笔者一一到来...这里笔者借助以Flutter实现微信App登录的逻辑,以点带面来讲讲Sp
Stella981 Stella981
4年前
Discuz x2.5 单页制作的教程
_首先,单页包括该单页的php文件和该单页的模板(.htm)文件,比如:host.php、host.htm___单页的php文件内容如下:__<?phprequire'./source/class/class_core.php';//引入系统核心文件$discuz&discuz_core::instan
Stella981 Stella981
4年前
Linux 内核 VS 内存碎片 (上)
(外部)内存碎片是一个历史悠久的Linux内核编程问题,随着系统的运行,页面被分配给各种任务,随着时间的推移内存会逐步碎片化,最终正常运行时间较长的繁忙系统可能只有很少的物理页面是连续的。由于Linux内核支持虚拟内存管理,物理内存碎片通常不是问题,因为在页表的帮助下,物理上分散的内存在虚拟地址空间仍然是连续的(除非使用大页),但对于需要从内核线性
Stella981 Stella981
4年前
Mac快捷键以及谷歌浏览器快捷键
分为通用快捷键和谷歌浏览器下快捷键,常用的已做加粗。1\.标签页和窗口快捷键⌘N打开新窗口。⌘T打开新标签页。⌘ShiftN在隐身模式下打开新窗口。按 ⌘O,然后选择文件。在Chrome浏览器中打开计算机中的文件。按住 ⌘ 的同时点击链接。或用鼠标中键(或鼠标滚轮)点击链接。从后台在新标签页
Stella981 Stella981
4年前
InnoDB脏页刷新机制Checkpoint
我们知道InnoDB采用WriteAheadLog策略来防止宕机数据丢失,即事务提交时,先写重做日志,再修改内存数据页,这样就产生了脏页。既然有重做日志保证数据持久性,查询时也可以直接从缓冲池页中取数据,那为什么还要刷新脏页到磁盘呢?如果重做日志可以无限增大,同时缓冲池足够大,能够缓存所有数据,那么是不需要将缓冲池中的脏页刷新到磁盘。但是,通常会有以下几
Stella981 Stella981
4年前
Innodb页合并和页分裂
作者:MarcoTusa、SriSakthivel译者:孟维克,知数堂优秀校友原文链接:https://www.percona.com/blog/2017/04/10/innodbpagemergingandpagesplitting/h
Wesley13 Wesley13
4年前
LEADTOOLS如何检测,读取和写入条形码
工作场所中存在许多多页的文件。能够加载、拆分和提取是许多应用程序的重要需求。一些最常见的多页文件类型是:PDF,TIFF和MicrosoftOffice格式,例如Docx,Doc,Xls和Xlsx。LEADTOOLS支持所有这些格式以及30多种其他多页格式。由于存在多种不同类型的多页格式,因此尝试支持常见的格式可能会让人头疼,而试图支持所有这些格式的也像一
Wesley13 Wesley13
4年前
TAG页和站内搜索页要注意的问题
百度网页搜索反作弊团队近期发现一部分网站遍历热门关键词生成大量的站内搜索结果页来获取搜索引擎流量,其中存在大量的不相关内容严重损害了搜索引擎的用户体验并且侵占了相应领域的优质网站收益,对于此类网站我们将做出严厉的处理,希望存在此问题的站长及时进行整改调整。这个问题已经存在很长时间了,其实和百度一直打击的垃圾TAG页面是一样的,TAG只是站内搜索的另一
Wesley13 Wesley13
4年前
extjs4 的一些bug 及解决办法
Ext.ux.form.SearchField,在输入查找关键字后,执行load的时候,如果当前共有3页,并在第3页,而过滤后的查询结果没有3页,则会有问题onTrigger2Click:function(){varmethis,storeme.store,
少湖说 少湖说
1年前
鸿蒙原生开发手记:04-一个完整元服务案例
影院热映分享一个完整的元服务案例,这个案例高仿了豆瓣的小程序。简介整个元服务分为45个页面,首页为列表页,展示了当前影院热门的电影,点开是一个详情介绍页,里面有影片详情,演职表,相关影片推荐等,热门海报。打开海报是一个完整的海报展示页,点开可以产看大图。另