内存设置+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

相关文章

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

Python内存优化的实战技巧分享

《Python内存优化的实战技巧分享》Python作为一门解释型语言,虽然在开发效率上有着显著优势,但在执行效率方面往往被诟病,然而,通过合理的内存优化策略,我们可以让Python程序的运行速度提升3... 目录前言python内存管理机制引用计数机制垃圾回收机制内存泄漏的常见原因1. 循环引用2. 全局变

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

MySQL设置密码复杂度策略的完整步骤(附代码示例)

《MySQL设置密码复杂度策略的完整步骤(附代码示例)》MySQL密码策略还可能包括密码复杂度的检查,如是否要求密码包含大写字母、小写字母、数字和特殊字符等,:本文主要介绍MySQL设置密码复杂度... 目录前言1. 使用 validate_password 插件1.1 启用 validate_passwo

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

MySQL 内存使用率常用分析语句

《MySQL内存使用率常用分析语句》用户整理了MySQL内存占用过高的分析方法,涵盖操作系统层确认及数据库层bufferpool、内存模块差值、线程状态、performance_schema性能数据... 目录一、 OS层二、 DB层1. 全局情况2. 内存占js用详情最近连续遇到mysql内存占用过高导致

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

最新Spring Security的基于内存用户认证方式

《最新SpringSecurity的基于内存用户认证方式》本文讲解SpringSecurity内存认证配置,适用于开发、测试等场景,通过代码创建用户及权限管理,支持密码加密,虽简单但不持久化,生产环... 目录1. 前言2. 因何选择内存认证?3. 基础配置实战❶ 创建Spring Security配置文件

java内存泄漏排查过程及解决

《java内存泄漏排查过程及解决》公司某服务内存持续增长,疑似内存泄漏,未触发OOM,排查方法包括检查JVM配置、分析GC执行状态、导出堆内存快照并用IDEAProfiler工具定位大对象及代码... 目录内存泄漏内存问题排查1.查看JVM内存配置2.分析gc是否正常执行3.导出 dump 各种工具分析4.