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

相关文章

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.

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

小白也能轻松上手! 路由器设置优化指南

《小白也能轻松上手!路由器设置优化指南》在日常生活中,我们常常会遇到WiFi网速慢的问题,这主要受到三个方面的影响,首要原因是WiFi产品的配置优化不合理,其次是硬件性能的不足,以及宽带线路本身的质... 在数字化时代,网络已成为生活必需品,追剧、游戏、办公、学习都离不开稳定高速的网络。但很多人面对新路由器

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参数概述堆内存分配年轻代与老年代调整堆内存大小调整年轻代与老年代比例元空