1、什么是hugepage?
Hugepage内存管理机制,也就是大页内存管理。与之相对应的是传统的4kb的普通页内存管理机制。 Hugepage打破了传统的小页面的内存管理方式,使用大页面2m,4m,16m等大小的页面大小管理内存。
2、linux的内存管理机制?
linux的内存管理采用受保护的虚拟地址模式,系统中同时存在物理地址和虚拟地址的概念,CPU必须把虚拟地址转换成物理地址才能真正访问内存。linux的分页存储机制是把较大的物理内存分为一个个固定大小(4KB)的内存页进行管理。每块内存页通过页表中的一个元组来维护虚拟地址与物理地址的映射关系。同时为了提高转换效率,CPU也会缓存两者的映射关系,并保存在由CPU维护的映射表中,即快表(TLB)中。cpu寻址就是一个通过分页机制将虚拟地址转化为物理地址的过程。
3、CPU寻址的过程?
首先cpu会去查cpu中缓存的TLB,如果命中了,就是TLB hit,直接取得物理地址。如果没命中,就是TLB miss,这时候cpu会继续去内存中的page table(页表/多级页表)中查找,如果命中了,就更新TLB的信息,并且获得物理地址。如果没命中,就是page fault(也即缺页中断)。
缺页中断后,这时cpu会将控制转向操作系统内核,然后它调用内核中的缺页异常处理程序,该程序会选择一个牺牲页,如果牺牲页已被修改过,内核会先将它复制回硬盘,然后再把该虚拟页覆盖到牺牲页的位置。当缺页异常处理程序返回时,它会重新启动导致缺页的指令,该指令会把导致缺页的虚拟地址重新发送给MMU。由于现在已经成功处理了缺页异常,所以最终结果是页命中,并得到物理地址。
4、传统4kb大小的页管理方式有什么问题?
通过我们上面的分析可以看出,linux的默认页大小是4k,也就意味着如果物理内存很大,则页表的条目会很多,因为页表是在内存中维护的,也就意味着占用的内存会比较大,同时也会影响CPU的检索效率。
5、Hugepage的优势? A. 页表的条目会减少,内存占用更少,提供访问速度。 B. cpu的TLB可以缓存的物理地址空间更大,提升了TLB的命中率,降低了CPU的负载。 以上两条可以通过我们前面的分析得出。 hugepage还有一个比较重要的优势就是它是No Swappable(不可交换的)的。也就是常驻内存,不会被交换出去的,这对于重度依赖内存的应用,比如数据库是十分重要的。 6、Hugepage in PostgreSQL?
1)查看Linux hugepage的页大小。 # grep Hugepage proc/meminfo
Hugepagesize: 2048 kB
2)估算PostgreSQL实例需要的Huge Page使用量。 vm.nr_hugepages=shared_buffers/Hugepagesize=128GB/2M
3)设置Linux huge page页数。 sysctl -w vm.nr_hugepages=67537
4) postgresql开启大页配置。 huge_pages = on # on, off, or try
# 设置为try的话,会先尝试huge page,如果启动时无法锁定给定数目的大页,则不会使用huge page
5)启动数据库。 pg_ctl start
6) 查看当前使用了多少huge page。 cat /proc/meminfo |grep -i huge
AnonHugePages: 6144 kB
HugePages_Total: 67537 ## 设置的HUGE PAGE
HugePages_Free: 66117 ## 这个是当前剩余的,但是实际上真正可用的并没有这么多,因为被PG锁定了65708个大页
HugePages_Rsvd: 65708 ## 启动PG时申请的HUGE PAGE
HugePages_Surp: 0
Hugepagesize: 2048 kB ## 当前大页2M
7、其他 linux下的大页分为:标准大页(huge pages)和透明大页(Transparent huge page)。两者的区别在于大页的分配机制。标准大页管理是预分配的方式,而透明大页管理则是动态分配的方式。 目前透明大页与传统HugePages联用会出现一些问题,导致性能问题和系统重启。Oracle 建议禁用透明大页(Transparent Huge Pages)。 注:上文我们讨论的都是标准大页。
|