银河麒麟服务器系统开启,关闭和设置透明大页(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的内存
  • 23
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值