本文主要是介绍内存设置+hugepage 学习,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
今天学习了内存设置和hugepage,记录一下练习
内存设置
例1:不加内存参数,模拟一个默认大小内存的客户机系统。
root@ubuntu:/home/img# qemu-system-x86_64 ubuntu14.04.img
在客户机中常用的两种查看内存信息的方式
1、使用free -m
查看内存信息
free
命令通常用来查看内存的使用情况,“-m”参数是指内存大小以MB为单位来显示。
在上面示例中,我们使用了默认大小的内存,值为128M,而根据上面输出可知总的内存为113MB,这个值比128MB小,这是因为free命令显示的内存是实际能够使用的内存,已经除去了内核执行文件占用内存和一些系统保留的内存。
2、通过cat命令 查看/proc/meminfo
文件来查看内存信息
#root@ubuntu-14:~# cat /proc/meminfo
使用cat命令来查看/proc/meminfo看到的“MemTotal”大小是116412 kB,这个值比128M*1024=131071kB小,其原因也是因为此处显示的内存是实际能够使用的内存。
例2:模拟一个内存大小为2048M的客户机系统。
root@ubuntu:/home/img# qemu-system-x86_64 -m 2048M ubuntu14.04.img
HugePage
HugePage是通过使用大页内存来取代传统的4KB内存页面,使得管理虚拟地址数变少,加快了从虚拟地址到物理地址的映射,通过摒弃内存页面的换入换出以提高内存的整体性能。
为了能以最小的代价实现大页面支持,Linux 操作系统采用了基于 hugetlbfs 特殊文件系统支持 的2M 字节大页面。
可以在宿主机中,通过以下操作让客户机使用HugePage
(1)查看宿主机中内存页的大小
root@ubuntu:/home/img# getconf PAGESIZE
4096
(2)查看宿主机中透明大页是否开启 , [never]表示未开启
root@ubuntu:/home/img# cat /sys/kernel/mm/transparent_hugepage/enabled
always [madvise] never
(3)开启透明大页(已开启,略过该步骤)
root@ubuntu:/home/img# echo always>/sys/kernel/mm/transparent_hugepage/enabled
root@ubuntu:/home/img# cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
(4)查看宿主机中HugePage的大小
通常情况下,宿主机中HugePage的大小是2048KB,即2MB
root@ubuntu:/home/img# cat /proc/meminfo | grep Hugepagesize
Hugepagesize: 2048 kB
root@ubuntu:/home/img# cat /proc/meminfo | grep HugePage
AnonHugePages: 0 kB
ShmemHugePages: 0 kB
HugePages_Total: 0 # HugePage的页面数量
HugePages_Free: 0 # 剩余的页面数量
HugePages_Rsvd: 0 # 被分配预留但是还没有使用page数目
HugePages_Surp: 0 # HugePages_Total减去/proc/sys/vm/nr_hugepages中的值
默认大页的数目为0
root@ubuntu:/home/img# cat /proc/sys/vm/nr_hugepages
0
(5)创建挂载点目录
root@ubuntu:/home/img# mkdir /dev/hugepages/
(6)挂载
大页内存只有被挂载了之后,才能被应用程序使用。
root@ubuntu:/dev/hugepages# mount -t hugetlbfs hugetlbfs /dev/hugepages
root@ubuntu:/dev/hugepages# mount | tail -1
hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime,pagesize=2M)
(7)设置HugePage的数量,具体如下:
使用sysctl命令设置系统变量vm.nr_hugepages
,将大页个数设置为200(200*2M=400M,需要确保宿主机有足够可以分配的内存):
root@ubuntu:/dev/hugepages# sysctl vm.nr_hugepages=200
vm.nr_hugepages = 200
(上面的方式是临时修改,永久修改可以使用另一个操作方法,在/etc/sysctl.conf
添加如下配置:vm.nr_hugepages=200
修改后,用命令sysctl -p
使得设置生效)
设置完毕后查看大页数量(命令cat /proc/sys/vm/nr_hugepages
也可以):
root@ubuntu:/dev/hugepages# cat /proc/meminfo | grep HugePages
AnonHugePages: 2048 kB
ShmemHugePages: 0 kB
HugePages_Total: 200
HugePages_Free: 200
HugePages_Rsvd: 0
HugePages_Surp: 0
(8)启动客户机,并让其使用HugePage内存,具体如下:
root@ubuntu:/home/img# qemu-system-x86_64 -m 200 cirros-0.3.5-x86_64-disk.img -mem-path /dev/hugepages/
注意:开启客户机时,客户机的内存大小要小于宿主机设置的大页hugepage的大小(本例中,宿主机大页设置了200*2M=400M,客户机的内存为200M)。如果客户机设置的内存大小超出了宿主机的 hugepage,则会报以下错误:
qemu-system-x86_64: unable to map backing store for guest RAM: Cannot allocate memory
(9)再次查看宿主机中HugePage的使用情况
xyc@ubuntu:~$ cat /proc/meminfo | grep HugePages
AnonHugePages: 16384 kB
ShmemHugePages: 0 kB
HugePages_Total: 200
HugePages_Free: 168
HugePages_Rsvd: 68
HugePages_Surp: 0
说明:通过上述结果,可以看到HugePages_Free数量减少了,因为客户机使用了一定数量的HugePage。但是HugePages_Free的数量没有减少100个(100*2MB=200MB),这是因为刚启动客户机时并没有分配200MB内存
(10)使用“mem-prealloc”参数
使用-mem-prealloc
参数,会让meminfo文件中HugePages_Free数量的减少和分配给客户机的内存保持一致。
xyc@ubuntu:/home/img$ qemu-system-x86_64 -m 160 cirros-0.3.5-x86_64-disk.img -mem-path /dev/hugepages/ -mem-prealloc
说明:HugePages_Free的值为120,说明使用了200-120=80个大页,一共80*2=160M,这个值正好是分配给虚拟机的内存大小。
查看宿主机中HugePage的使用情况:
root@ubuntu:~# cat /proc/meminfo |grep Huge
AnonHugePages: 43008 kB
ShmemHugePages: 0 kB
HugePages_Total: 200
HugePages_Free: 120
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
说明:HugePages_Free的值为120,说明使用了200-120=80个大页,一共80*2=160M,这个值正好是分配给虚拟机的内存大小。
(11)总结:
在linux环境中开启HugePage有很多好处,具体如下:
(1) 非Swap内存:当开启HugePage的时候,HugePage是不会Swap的;
(2) 减少TLB(Translation Look aside Buffer)负担:TLB是在CPU里面的一块缓冲区域,其中包括了部分PageTable内容。使用HugePage可以减少TLB工作负载;
(3) 减少Page Table空间负载:在PageTable管理中,每条Page记录是要占据64byte的空间。也就是说,如果一块50G的RAM,4k大小的PageTable要有80MB左右;
(4) 减少PageTable检索负载:更小的PageTable意味着更快的检索定位能力;
(5) 内存性能提升:Page数量减少和大小的增加,减少了管理过程的复杂性,进一步减少了瓶颈出现的概率。
这篇关于内存设置+hugepage 学习的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!