计算机 · 2021年12月14日 0

Linux Huge Page

给机器配了64GB内存,那么除了组成双通道以外还可以怎么利用这么多的内存来提升系统的整体性能呢?这时就可以考虑下使用hugepages了。

swappiness

调整swappiness

vm.swappiness = 10

Hugepages

linux作虚拟内存到物理内存的映射以页为单位,一般一页4KB。那么映射1GB的虚拟内存就需要262144页。假设tlb可以缓存n项,那么以4KB为一页时,tlb就只能缓存这262144项中的n项。在将这1GB范围内的虚拟地址翻译成物理地址时,遇到tlb miss的概率就会比较大。linux提供了hugepage功能,可以将一些物理内存按照2MB、或者1GB的页大小组织起来,这样tlb就只需要换存这512或者1项中的n项,遇到tlb miss的概率就大大减小了,提高了虚拟地址翻译为物理地址的速度。
Huge page的另外一个好处是不会被交换出内存。

网上找的一篇对比使用hugepage和不使用的效果的benchmarking博客

关于hugepages的讨论。hugepages的一个明显缺点是只能被能感知hugepages的程序使用,典型的如数据库、虚拟机、dpdk相关应用程序,其他程序如果没有尝试使用hugepage的逻辑,那么你提前分配好的这些hugepages可能就浪费掉了。对于这种缺点一个解决方案是Transparent Huge Pages,让不专门使用Hugepages的程序在申请大片内存时给它分配Huge page。

确认系统是否支持Huge pages

cat /proc/cpuinfo,如果有pse这个标志,那么就支持2MB的巨页,如果有pdpe1gb这个标志,那么支持1GB的巨页。

设置启用Huge pages

由于设置这个对日常使用没什么明显的帮助,这里就懒得写了,参见本文贴的各种链接中叙述的方法就行。

Transparent Huge Pages

由于使用巨页有着诸多限制,所以后面又发展出了Transparent Hugepages(THP)。THP不再需要系统管理员显示分配内存用作巨页,应用程序也不用操心如何去使用THP。

设置启用THP

将*/sys/kernel/mm/transparent_hugepage设置为always。系统默认是madvise,而这个madvise是需要应用程序显示调用madvise,内核才会在分配内存时考虑为其使用巨页。内存充足的话,干脆就直接设置为always吧。除了通过echo*命令去改写这个设置,也可以通过改写boot选项的方式进行更改,即在linux kernel command line arguments里面加上transparent_hugepage=always,这样每次系统启动后,transparent_hugepage一项的值就都是always了。

检查正在使用中的Transparent Hugepages:

grep AnonHugePages /proc/meminfo

或者:

egrep 'trans|thp' /proc/vmstat

检查每个进程所使用的Transparent Hugepages:

grep -e AnonHugePages  /proc/*/smaps | awk  '{ if($2>4) print $0} ' |  awk -F "/"  '{print $0; system("ps -fp " $3)} '

redhat关于使用THP的文档,其中所讲的Explicit HugePages就是前面讲的Hugepages,就是需要应用程序去显式使用的那种。

Hugepages与NUMA

最后附上一个讲Hugepages的pdf,忘记是在哪里找到的,讲的比较清楚。