内存设置+hugepage 学习

2023-10-12 06:20
文章标签 设置 学习 内存 hugepage

本文主要是介绍内存设置+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 学习的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/193884

相关文章

Feign Client超时时间设置不生效的解决方法

《FeignClient超时时间设置不生效的解决方法》这篇文章主要为大家详细介绍了FeignClient超时时间设置不生效的原因与解决方法,具有一定的的参考价值,希望对大家有一定的帮助... 在使用Feign Client时,可以通过两种方式来设置超时时间:1.针对整个Feign Client设置超时时间

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

PyCharm如何设置新建文件默认为LF换行符

《PyCharm如何设置新建文件默认为LF换行符》:本文主要介绍PyCharm如何设置新建文件默认为LF换行符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录PyCharm设置新建文件默认为LF换行符设置换行符修改换行符总结PyCharm设置新建文件默认为LF

Linux上设置Ollama服务配置(常用环境变量)

《Linux上设置Ollama服务配置(常用环境变量)》本文主要介绍了Linux上设置Ollama服务配置(常用环境变量),Ollama提供了多种环境变量供配置,如调试模式、模型目录等,下面就来介绍一... 目录在 linux 上设置环境变量配置 OllamPOgxSRJfa手动安装安装特定版本查看日志在

Ubuntu中Nginx虚拟主机设置的项目实践

《Ubuntu中Nginx虚拟主机设置的项目实践》通过配置虚拟主机,可以在同一台服务器上运行多个独立的网站,本文主要介绍了Ubuntu中Nginx虚拟主机设置的项目实践,具有一定的参考价值,感兴趣的可... 目录简介安装 Nginx创建虚拟主机1. 创建网站目录2. 创建默认索引文件3. 配置 Nginx4

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

如何关闭 Mac 触发角功能或设置修饰键? mac电脑防止误触设置技巧

《如何关闭Mac触发角功能或设置修饰键?mac电脑防止误触设置技巧》从Windows换到iOS大半年来,触发角是我觉得值得吹爆的MacBook效率神器,成为一大说服理由,下面我们就来看看mac电... MAC 的「触发角」功能虽然提高了效率,但过于灵敏也让不少用户感到头疼。特别是在关键时刻,一不小心就可能触

Redis 内存淘汰策略深度解析(最新推荐)

《Redis内存淘汰策略深度解析(最新推荐)》本文详细探讨了Redis的内存淘汰策略、实现原理、适用场景及最佳实践,介绍了八种内存淘汰策略,包括noeviction、LRU、LFU、TTL、Rand... 目录一、 内存淘汰策略概述二、内存淘汰策略详解2.1 ​noeviction(不淘汰)​2.2 ​LR

Nginx配置系统服务&设置环境变量方式

《Nginx配置系统服务&设置环境变量方式》本文介绍了如何将Nginx配置为系统服务并设置环境变量,以便更方便地对Nginx进行操作,通过配置系统服务,可以使用系统命令来启动、停止或重新加载Nginx... 目录1.Nginx操作问题2.配置系统服android务3.设置环境变量总结1.Nginx操作问题

Golang基于内存的键值存储缓存库go-cache

《Golang基于内存的键值存储缓存库go-cache》go-cache是一个内存中的key:valuestore/cache库,适用于单机应用程序,本文主要介绍了Golang基于内存的键值存储缓存库... 目录文档安装方法示例1示例2使用注意点优点缺点go-cache 和 Redis 缓存对比1)功能特性