LInux 标准大页和透明大页
Huge pages ( 标准大页 ) 和 Transparent Huge pages( 透明大页 )
在 Linux 中大页分为两种: Huge pages ( 标准大页 ) 和 Transparent Huge pages( 透明大页 ) 。
内存是以块即页的方式进行管理的,当前大部分系统默认的页大小为 4096 bytes 即 4K 。 1MB 内存等于 256 页; 1GB 内存等于 256000 页。
CPU 拥有内置的内存管理单元,包含这些页面的列表,每个页面通过页表条目引用。当内存越来越大的时候, CPU 需要管理这些内存页的成本也就越高,这样会对操作系统的性能产生影响。
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 的默认设置改进大多数系统配置性能。但是 , 不建议对数据库工作负载使用 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缺点[#](https://www.cnblogs.com/my-show-time/p/14237757.html# 使用 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 ,因为透明大页存在一些问题:
\1. 在 RAC 环境下 透明大页( TransparentHugePages )会导致异常节点重启,和性能问题;
\2. 在单机环境中,透明大页( TransparentHugePages ) 也会导致一些异常的性能问题;
注:Transparent Huge Pages在32位的RHEL 6中是不支持的。
如何关闭 Transparent Huge pages ?[#](https://www.cnblogs.com/my-show-time/p/14237757.html#如何关闭 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开机引导文件关闭:
方法一#
1)手动临时关闭
# echo never > /sys/kernel/mm/transparent_hugepage/enabled
# echo never > /sys/kernel/mm/transparent_hugepage/defrag
参数说明
never 关闭,不使用透明内存
alway 尽量使用透明内存,扫描内存,有512个 4k页面可以整合,就整合成一个2M的页面
madvise 避免改变内存占用
2)开机自动关闭
# vim /etc/rc.d/rc.localif 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 ------->>>>备份grub文件
编辑*/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/grubGRUB_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)
多长时间整理一次碎片