找回密码
 立即注册
Qt开源社区 门户 查看内容

linux核心知识之HugePage

2019-8-22 07:10| 发布者: admin| 查看: 951| 评论: 0

摘要: 什么是HugePages直接从物理内存读写数据,要比从磁盘读写要快很多,但是物理内存是有限的,这才有了虚拟内存的概念。虚拟内存是为了满足物理内存的不足而提出的策略,它是利用磁盘空间虚拟出的一块逻辑内存(也就是 ...

什么是HugePages


直接从物理内存读写数据,要比从磁盘读写要快很多,但是物理内存是有限的,这才有了虚拟内存的概念。虚拟内存是为了满足物理内存的不足而提出的策略,它是利用磁盘空间虚拟出的一块逻辑内存(也就是我们用top命令看到的SwapSpace)。
对于这个大内存的管理,大多数操作系统采用了分段或分页的方式进行管理。分段是粗粒度的管理方式,而分页则是细粒度管理方式,可以避免内存空间的浪费。无论是采用分段还是分页的方式进行管理, CPU都必须要把虚拟地址转换程物理内存地址才能真正访问内存。为了提高这个转换效率,CPU会缓存最近的虚拟内存地址和物理内存地址的映射关系,并保存在一个由CPU维护的映射表中。为了尽量提高内存的访问速度,需要在映射表中保存尽量多的映射关系。
Linux系统采取的是分页存取机制,为了保证物理内存能得到充分的利用,内核会按照LRU算法在适当的时候将物理内存中不经常使用的内存页自动交换到虚拟内存中,而将经常使用的信息保留到物理内存。
通常情况下页表大小为4KB,这也意味了如果物理内存很大,映射表的条目将会非常多,而这会严重影响CPU的检索效率。因为内存大小是固定的,为了减少映射表的条目,可采取的办法只能通过增加页表大小,减少映射条目,而这也就是我们所知的HugePages技术

HugePages相关术语


1)Page Table:一种用于内存管理的实现方式,用于虚拟地址与物理地址之间的映射。对于内存的访问,先访问Page Table,然后根据Table中的映射关系,转移到物理内存进行访问。
2)TLB:CPU中的一块固定的cache,包含了部分Page Table的映射关系,用于快速实现虚拟地址与物理地址的转换
3)hugetlb:TLB中指向大页的一个entry,HugePages是通过hugetlb entries实现的,可以将大页当作是hugetlb page entry的一个句柄。
4)hugetlbfs:一个类似于tmpfsin-memoryfilesystem,在Linux 2.6内核提出。

HugePages的优缺点


在本章节,我们将对引入HugePages技术后带来的优缺点进行一次简单的归纳总结。

优点


按照以往习惯,凡事要往好的方面看,所以我们先对优点进行归纳总结。
1)不可交换HugePages是不可交换的,因此也没有所谓的页面换入/换出的开销,我们普遍认为HugePages是固定在RAM中的
2)减轻TLB的压力引入HugePages技术后,可以用更少的页面覆盖物理地址空间,意味着TLB将覆盖更大的地址空间,即TLB未命中的概率将大大降低,CPU的寻址能力也得到相应的增强。
说明:* TLB是CPU中一块固定大小的cache,包含了部分pagetable的映射关系,用于快速实现虚拟地址到物理地址的转换,TLB通常只存放16~ 256个条目
* 如果出现大量TLB miss,将对系统性能带来很大负面的影响
3)减少页表管理开销按照默认的page大小(4KB),每个entry需要花费64bytes内存进行管理,对于50GB的内存,管理这些entry,需要800MB的内存(50* 1024 * 1024 / 4 * 64 / 1024 /1024 = 800MB)。如果95%的内存由hugepages管理,剩余内存管理资源仅需40MB内存(2.5* 1024 * 1024 / 4 * 64 / 1024 /1024 = 40MB)。
4)减少页表查询开销如果发生TLB miss,需要额外执行3次内存读取操作才能将虚拟地址翻译为物理地址。引入HugePages技术后,物理地址空间可以用极少的页面覆盖,也就意味着以前很多页表的查询就不需要了。
5)提升内存访问整体性能对虚拟内存进行一次操作等同于两次的抽象内存操作。由于页表数量的减少,避免了对页表访问可能造成的瓶颈

缺点


凡事都有两面性,既然HugePages技术有优点,那肯定存在缺点,接下来将详细对HugePages技术的缺点进行介绍。
1)需预先分配开启该功能需要进行额外配置(该缺点可以直接忽略的)。
2)不够灵活,甚至需要重启主机大页内存类似专有内存,会从系统中抠出一块大内存,如果想要使用这块内存,通常需要对代码进行重大更改才能有效使用。为此红帽企业Linux6引入了透明大页面,为系统管理员和开发人员解决了HugePages技术带来的复杂性。
3)如果分配过多,会造成浪费如果程序需要访问的内存空间很小,建议就不用开启HugePages功能了。而且我们需要根据实际情况进行决策,否则分配过多,会造成内存浪费,分配过少,性能优化根本不明显

HugePages实操



1)查看宿主机默认页表大小(从执行结果可以得出,默认页表大小为4KB)

root@LTY:/opt # getconf PAGESIZE

4096

2)查看宿主机的huge page大小(从执行结果可以得出,hugepage大小为2MB)

root@LTY:/opt # grep Huge /proc/meminfo

AnonHugePages:   1290240 kB

ShmemHugePages:        0 kB

HugePages_Total:       0

HugePages_Free:        0

HugePages_Rsvd:        0

HugePages_Surp:        0

Hugepagesize:       2048 kB

Hugetlb:               0 kB

3)挂载hugetlbfs文件系统并查询执行结果

root@LTY:/opt # mount -t hugetlbfs hugetlbfs /dev/hugepagesroot@LTY:/opt # mount | grep hugecgroup on /sys/fs/cgroup/hugetlb type cgroup(rw,nosuid,nodev,noexec,relatime,hugetlb)hugetlbfs on /dev/hugepages type hugetlbfs(rw,relatime,pagesize=2M)

4)设置hugepage个数(设置为1024个)

root@LTY:/opt # sysctl vm.nr_hugepages=1024vm.nr_hugepages = 1024root@LTY:/opt # grep Huge /proc/meminfoAnonHugePages:   1277952 kBShmemHugePages:        0 kBHugePages_Total:       1024HugePages_Free:        1024HugePages_Rsvd:        0HugePages_Surp:        0Hugepagesize:       2048 kBHugetlb:               0 kB

推荐阅读:

linux核心知识之内存分页管理

【linux从放弃到入门】col、tr、join命令

【linux从放弃到入门】Linux sort命令

【linux从放弃到入门】linux find命令

看完本文有收获?请分享给更多的人

在技术成长的路上,让我们一起进步吧




----------------------------------------------------------------------------------------------------------------------
我们尊重原创,也注重分享,文章来源于微信公众号:码农之屋,建议关注公众号查看原文。如若侵权请联系qter@qter.org。
----------------------------------------------------------------------------------------------------------------------

鲜花

握手

雷人

路过

鸡蛋

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了