在Linux操作系统上运行内存需求量较大的应用程序时,由于其采用的默认页面大小为4KB,因而将会产生较多TLB Miss和缺页中断,从而大大影响应用程序的性能。当操作系统使用大页内存时,将会大大减少TLB Miss和缺页中断的数量,显著提高应用程序的性能。大页内存分为两种,一种是标准大页,标准大页适合那些需要高性能和细粒度控制的应用程序,适用于对内存管理和性能有严格要求的场景。另一种是透明大页,透明大页适合那些希望简化配置并自动优化内存使用的应用程序,尤其适用于大多数通用场景,可根据需要来选择开启哪种大页。
以下为各优化手段对大页内存支持的情况,各优化手段可搭配使用:
优化手段 |
支持透明大页 |
支持标准大页 |
是否需要重启物理机 |
---|---|---|---|
malloc使用大页 |
支持,(glibc低版本不支持,高版本支持,参考malloc使用大页) |
支持 |
否 |
tmpfs使用大页 |
支持 |
不支持 |
否 |
glibc动态库大页 |
不支持 |
支持 |
否 |
标准大页(HugePage)技术于Linux Kernel 2.6版本被引入到内核,可通过uname -r确认当前内核版本是否大于2.6。
vm.nr_hugepages的值即为2M标准大页的数量,申请标准大页会导致OS内存相应减少,建议按需设置对应大小
ls /sys/devices/system/node/ | grep node
echo 512 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages echo 512 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages
cat /proc/meminfo | grep Huge
修改启动项配置属于危险操作,请谨慎修改启动项配置,建议采用临时分配大页的方式申请大页内存池 。
grubby --info=ALL | grep `uname -r`
kernel对应的值就是当前系统启动项内核名称,也就是我们需要设置大页内存的内核。
grubby --update-kernel=/boot/vmlinuz-4.18.0-193.el8.aarch64 --args="default_hugepagesz=2M hugepagesz=2M hugepages=5000"
reboot
grubby --update-kernel=/boot/vmlinuz-4.18.0-193.el8.aarch64 --remove-args="hugepages hugepagesz default_hugepagesz"
删除启动项之后同样需要重启系统才能生效 。
重启系统之后,可以通过命令cat /proc/cmdline确认当前系统启动时是否带有大页相关参数。也可使用cat /proc/meminfo | grep Huge来查看当前系统可用的大页内存大小。其中HugePages_Total表示总共可用大页数量,HugePages_Free表示当前系统可用大页数量。若HugePages_Total为你所设置的数量,则表明大页内存启用成功;若这个数量为0,则表明未启用大页内存。