前言:大页内存(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之后,这一部分内存会直接从系统里面划走。文章来源:https://www.toymoban.com/news/detail-802747.html
Hugepagesize的值乘以HugePages_Total的值=2MB*100=200MB 相当于配置了200MB的透明页。文章来源地址https://www.toymoban.com/news/detail-802747.html
(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的内存
到了这里,关于银河麒麟服务器系统开启,关闭和设置透明大页(transparent_hugepage)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!