背景知识
x86架构中,如果对内存管理模型有一定了解,会知道内存页支持多种格式。
通常默认情况下是4K页
也支持Hugepage(大页),比如2M
使用Hugepage的好处:
1.提高TLB效能
2.减少页表占存,提高检索效率
3.非Swap内存,减少内存置换,提高效率
虚拟机开启大页步骤
1.主机设置
在linux中可以通过hugetlbfs使用hugepage
hugetlbfs是一个虚拟文件系统,它运行在内核层,不与磁盘空间相对应。
如果需要使用hugetlbfs,则需要在编译Linux内核的时候在file system这个配置栏中勾选CONFIG_HUGETLB_PAGE和CONFIG_HUGETLBFS选项(如果勾选了CONFIG_HUGETLB_PAGE则CONFIG_HUGETLBFS会自动勾选)。
内核编译完成并启动操作系统以后,将hugetlbfs文件系统挂载到特定的目录(不同的发行版目录可能不一样,Red Hat一般mount在/dev/hugepages)
输入需要使用的hugepages的数量 (注意:这里是指的大页的个数) sysctl vm.nr_hugepages=1024
2.创建虚拟机
这里使用virsh创建虚拟机
在xml中增加如下部分:
<memoryBacking>
<hugepages/>
</memoryBacking>
想详细设置具体可以参考官网:
如,可以设置guestos中特定numa节点的大页使用情况:
3.原理一探
通过下述方式
<memoryBacking> s
<hugepages/>
</memoryBacking>
使用大页,传给qemu的多了如下参数:
-mem-prealloc -mem-path /dev/hugepages/libvirt/qemu
通过下述方式
使用大页,传给qemu的多了如下参数:
(其实使用了qemu的object对象)
最终其实是调用的file_ram_alloc方法实现的大页分配
这里不详细分析代码流程了,附上调用栈
file_ram_alloc其实就是在mem-path下使用mkstemp申请了固定容量的空间
而我们知道mem-path下挂载的是hugelbfs这一虚拟机文件系统
也就是说在预占的大页中分配容量