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

相关文章

linux hostname设置全过程

《linuxhostname设置全过程》:本文主要介绍linuxhostname设置全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录查询hostname设置步骤其它相关点hostid/etc/hostsEDChina编程A工具license破解注意事项总结以RHE

Python设置Cookie永不超时的详细指南

《Python设置Cookie永不超时的详细指南》Cookie是一种存储在用户浏览器中的小型数据片段,用于记录用户的登录状态、偏好设置等信息,下面小编就来和大家详细讲讲Python如何设置Cookie... 目录一、Cookie的作用与重要性二、Cookie过期的原因三、实现Cookie永不超时的方法(一)

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java内存分配与JVM参数详解(推荐)

《Java内存分配与JVM参数详解(推荐)》本文详解JVM内存结构与参数调整,涵盖堆分代、元空间、GC选择及优化策略,帮助开发者提升性能、避免内存泄漏,本文给大家介绍Java内存分配与JVM参数详解,... 目录引言JVM内存结构JVM参数概述堆内存分配年轻代与老年代调整堆内存大小调整年轻代与老年代比例元空

Qt 设置软件版本信息的实现

《Qt设置软件版本信息的实现》本文介绍了Qt项目中设置版本信息的三种常用方法,包括.pro文件和version.rc配置、CMakeLists.txt与version.h.in结合,具有一定的参考... 目录在运行程序期间设置版本信息可以参考VS在 QT 中设置软件版本信息的几种方法方法一:通过 .pro

PostgreSQL 默认隔离级别的设置

《PostgreSQL默认隔离级别的设置》PostgreSQL的默认事务隔离级别是读已提交,这是其事务处理系统的基础行为模式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一 默认隔离级别概述1.1 默认设置1.2 各版本一致性二 读已提交的特性2.1 行为特征2.2

一文详解MySQL如何设置自动备份任务

《一文详解MySQL如何设置自动备份任务》设置自动备份任务可以确保你的数据库定期备份,防止数据丢失,下面我们就来详细介绍一下如何使用Bash脚本和Cron任务在Linux系统上设置MySQL数据库的自... 目录1. 编写备份脚本1.1 创建并编辑备份脚本1.2 给予脚本执行权限2. 设置 Cron 任务2

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

mtu设置多少网速最快? 路由器MTU设置最佳网速的技巧

《mtu设置多少网速最快?路由器MTU设置最佳网速的技巧》mtu设置多少网速最快?想要通过设置路由器mtu获得最佳网速,该怎么设置呢?下面我们就来看看路由器MTU设置最佳网速的技巧... 答:1500 MTU值指的是在网络传输中数据包的最大值,合理的设置MTU 值可以让网络更快!mtu设置可以优化不同的网

MySQL 设置AUTO_INCREMENT 无效的问题解决

《MySQL设置AUTO_INCREMENT无效的问题解决》本文主要介绍了MySQL设置AUTO_INCREMENT无效的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录快速设置mysql的auto_increment参数一、修改 AUTO_INCREMENT 的值。