银河麒麟高级服务器操作系统V10SP2(X86)开启,关闭和设置透明大页(transparent_hugepage)

avatar
作者
筋斗云
阅读量:0

银河麒麟高级服务器操作系统V10SP2(X86)开启,关闭和设置透明大页(transparent_hugepage)


​ 前言:大页内存(HugePages),有时也叫“大内存页”、“内存大页”、“标准大页”。操作系统以内存页为单位管理内存,内存页的大小对系统性能有影响。内存页设得太小,内存页会很多,管理内存页的数组会比较大,耗内存,同时TLB(Translation Lookaside Buffer,页表寄存缓冲器,可理解为页表缓冲)大小是固定的,导致TLB MISS增加。在不同的应用场合,内存页的大小的最优值是不同的。所以一般的系统都支持多种内存页的取值。

一 基础环境信息

1.1 系统版本
nkvers ############## Kylin Linux Version ################# Release: Kylin Linux Advanced Server release V10 (Sword)  Kernel: 4.19.90-24.4.v2101.ky10.x86_64  Build: Kylin Linux Advanced Server release V10 (SP2) /(Sword)-x86_64-Build09/20210524 ################################################# 
1.2 always,madvise,never参数解释
always: 表示透明大页启用(一直处于启用状态并动态分配内存) madvise:表示透明大页启用(需要时动态分配内存) never:  表示透明大页禁用  always和madvise参数的区别: 	madvise表示在MADV_HUGEPAGE标志的VMA中使用THP。当应用程序需要大页时,它可以设置MADV_HUGEPAGE标志,然后内核将根据这个标志动态地分配和管理内存。这种分配方式可以提高应用程序的性能,并且可以避免一些内存管理问题。 	always表示透明大页一直处于启用状态,也就是说,内核将一直使用透明大页进行内存分配。这种方式与标准的内存分配方式不同,标准大页管理是预分配的方式,而透明大页管理则是动态分配的方式。 		 	madvise和always的主要区别在于内存分配方式上。madvise是当需要时动态分配内存,而always则是一直处于启用状态并动态分配内存。 
1.3 meminfo中涉及透明页的参数解释
AnonHugePages: AnonHugePages的统计值并不包含所有的匿名页,只包含已经分配的透明大页。其他的匿名页统计在AnonPages中。 ShmemHugePages:用于共享内存或tmpfs的透明大页。 ShmemPmdMapped:用户态共享内存映射的透明大页。 FileHugePages: 与AnonHugePages对应,用户态透明大页中的文件页。 FilePmdMapped: 用户态文件页映射的透明大页。  HugePages_Total:系统中总的页数量。 HugePages_Free:当前可用的页数量。 HugePages_Rsvd:当前被保留(但未被使用)的页数量。 HugePages_Surp:系统中超出实际内存需求配置的页数量,通过nr_overcommit_hugepages设置。 Hugepagesize:单个页的大小(以字节为单位)。 
1.4 额外说明

(1)配置了透明大页vm.nr_hugepages之后,这一部分内存会直接从系统里面划走。计算方法:Hugepagesize的值乘以HugePages_Total的值。
(2)在多NUMA环境下,vm.nr_hugepages设置的是每个NUMA节点可以使用的最大透明页数量。因此,每个NUMA结点都会分配这个数量的内存页。这些内存页会在处理器的内存中连续存放,形成一个大的内存页帧。
(3)银河麒麟V10-SP2系统中不同架构默认的页大小不一样,在配置的时候大家要注意下:X86架构默认的单个页大小为2MB,ARM默认的单个页大小为512MB,如果需要查询确认的话执行命令:cat /proc/meminfo | grep Hugepagesize

二 关闭透明大页

2.1 查看透明大页设置
cat /sys/kernel/mm/transparent_hugepage/enabled [always] madvise never  #默认是已启用透明大页  
2.2 修改/etc/default/grub文件

编辑/etc/default/grub文件,GRUB_CMDLINE_LINUX配置参数"transparent_hugepage=never",下面是编辑完之后的文件内容:

cat /etc/default/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="resume=/dev/mapper/klas-swap rd.lvm.lv=klas/root rd.lvm.lv=klas/swap rhgb quiet crashkernel=1024M,high transparent_hugepage=never" GRUB_DISABLE_RECOVERY="true" 
2.3 重新生成grub.cfg

(1)UEFI传统的Legacy BIOS启动 grub引导文件路径不一致,先需要查看系统是UEFI启动还是传统的Legacy BIOS启动

[ -d /sys/firmware/efi ] && echo UEFI || echo BIOS BIOS #如果输出是UEFI则表示是UEFI启动 #如果输出是BIOS则表示是传统的Legacy BIOS启动  传统的Legacy BIOS启动文件路径: /boot/grub2/grub.cfg  UEFI启动文件路径: /boot/efi/EFI/kylin/grub.cfg 

(2)根据查到的实际情况更新grub引导文件

grub2-mkconfig -o /boot/grub2/grub.cfg 
2.4 重启服务器使其生效
reboot 
2.5 验证
cat /sys/kernel/mm/transparent_hugepage/enabled always madvise [never] 上述输出中,如果中括号的值为never,说明已禁用透明大页 

三 开启透明大页

将transparent_hugepage=never改为transparent_hugepage=always,按照2.2-2.5的步骤执行即可。

四 配置透明大页

3.1 临时配置
sysctl -w vm.nr_hugepages=100  #临时改变,重启失效 
3.2 永久生效

编辑/etc/sysctl.conf文件,添加vm.nr_hugepages参数

vim /etc/sysctl.conf 添加如下参数: vm.nr_hugepages=100 #设置页个数为100个,默认单个大小为2M  执行sysctl -p生效 
3.3 查看配置情况
[root@localhost ~]# cat /proc/meminfo  | grep Huge AnonHugePages:     20480 kB ShmemHugePages:        0 kB HugePages_Total:     100 HugePages_Free:      100 HugePages_Rsvd:        0 HugePages_Surp:        0 Hugepagesize:       2048 kB Hugetlb:          204800 kB 

可以看到配置已经成功了,页配置了100个,剩余100,单个页大小2MB。

配置了vm.nr_hugepages之后,这一部分内存会直接从系统里面划走。

Hugepagesize的值乘以HugePages_Total的值=2MB*100=200MB 相当于配置了200MB的透明页。

(1)没添加之前的内存使用
[root@localhost ~]# free -hg               total        used        free      shared  buff/cache   available Mem:          1.9Gi       324Mi       1.3Gi        17Mi       339Mi       1.4Gi Swap:         2.0Gi          0B       2.0Gi 
(2)修改完毕之后的内存使用
[root@localhost ~]# vim /etc/sysctl.conf  [root@localhost ~]# sysctl -p kernel.sysrq = 0 net.ipv4.ip_forward = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 net.ipv4.conf.all.accept_source_route = 0 net.ipv4.conf.default.accept_source_route = 0 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.all.secure_redirects = 0 net.ipv4.conf.default.secure_redirects = 0 net.ipv4.icmp_echo_ignore_broadcasts = 1 net.ipv4.icmp_ignore_bogus_error_responses = 1 net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 net.ipv4.tcp_syncookies = 1 kernel.dmesg_restrict = 1 net.ipv6.conf.all.accept_redirects = 0 net.ipv6.conf.default.accept_redirects = 0 vm.nr_hugepages = 100 [root@localhost ~]# free -hg               total        used        free      shared  buff/cache   available Mem:          1.9Gi       526Mi       1.1Gi        17Mi       343Mi       1.2Gi Swap:         2.0Gi          0B       2.0Gi  ##可以发现剩余内存里面直接少了200MB的内存 

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!