HugePage简介和KVM中使用HugePage
现在,有许多的处理器架构都支持多种的内存页大小,其中就包括比一般的page size大很多的huge page。就目前来说,尽管在个人电脑中基本都实现了对huge page的支持,然而,huge page的使用主要还是在一些大型服务器和计算机集群中使用。
1,一般的内存页查询:
# getconf PAGE_SIZE
说明:一般是4096Byte
2,hugepagesize查询
# cat /pro/meminfo | grep Huge
Hugepagesize=2048
说明:不同的处理器架构,可能不一样,通常情况下,是2048KB即2M.
C程序调用接口:sysconf(_SC_PAGESIZE)); /* _SC_PAGE_SIZE is OK too. */ 涉及头文件:unistd.h
3, 查看hugepage相关信息
cat /proc/meminfo | grep Huge
2.huge page的相关信息:cat /proc/meminfo | grep Huge
HugePages_Total: 1024
HugePages_Free: 1024
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
说明:
HugePages_Total: Hugepage的页面数量
HugePages_Free: 剩余的页面数量
HugePages_Rsvd: 被分配预留但是还没有使用的page数目
HugePages_Surp:HugePages_Total减去/proc/sys/vm/nr_hugepages中的值(我对这个理解也不很清楚)。
Hugepagesize: 每单位数量大小
又摘:
HugePages_Total: 所分配的页面数目,
和Hugepagesize相乘后得到所分配的内存大小。43000*2/1024大约为84GB
HugePages_Free: 从来没有被使用过的Hugepages数目。
即使oracle sga已经分配了这部分内存,但是如果没有实际写入,那么看到的还是Free的。这是很容易误解的地方
HugePages_Rsvd: 已经被分配预留但是还没有使用的page数目。
在Oracle刚刚启动时,大部分内存应该都是Reserved并且Free的,随着oracle SGA的使用,Reserved和Free都会不断的降低
HugePages_Total为设定的值大小,HugePages_Free应该和HugePages_Total一样大,HugePages_Rsvd为0.
HugePages_Free – HugePages_Rsvd 这部分是没有被使用到的内存,如果没有其他的oracle instance,这部分内存也许永远都不会被使用到,也就是被浪费了。在该系统上有11.5GB的内存被浪费了。
4设置huge pages
首先mount一个hugetlbfs文件系统: mount -t hugetlbfs hugetlbfs /dev/hugepages
然后为huge pages保留一定数量的内存:sysctl vm.nr_hugepages=1024
(或者在/etc/sysctl.conf加入一行:vm.nr_hugepages=1024)
设置完后用命令sysctl -p 使得设置生效
(或者,改动linux启动的grub参数也是可以的,加上 hugepages=1024 这样的参数)
其它:
1.设置了多少的huge page,free内存就会被使用多少。
比如:我使用sysctl vm.nr_hugepages=1024 之后,free命令可以看到free的内存会减少nr_hugepages*Hugepagesize大小,这里是2048M。
2,使用Hugepages的内存页是不会被交换出去到磁盘的,永远常驻在内存中,所以也减少了内存页交换的额外开销。使用hurgepage的内存不能被其他的进程使用,所以,一定要合理设置这个值,避免造成浪费。使用超过8G物理内存的系统,有人推荐使用HugePage。
HugePages_Free - HugePages_Rsvd部分的内存是浪费的,且不能被其他程序使用。在实际应用中,尽可能让HugePages_Free - HugePages_Rsvd=0
3,HugePage的好处:
大大提高了CPU cache中存放的page table所覆盖的内存大小,从而提高了TLB命中率。进程的虚拟内存地址段先连接到page tables然后再连接到物理内存。所以在访问内存时需要先访问page tables得到虚拟内存和物理内存的映射关系,然后再访问物理内存。CPU cache中有一部分TLB(Translation Lookaside Buffer)用来存放部分page table以提高这种装换的速度。因为page size变大了,所以同样大小的TLB,所覆盖的内存大小也变大了。提高了TBL命中率,也就是提高了地址转换的速度。
系统进程是通过虚拟地址访问内存,但是CPU必须把它转换程物理内存地址才能真正访问内存。为了提高这个转换效率,CPU会缓存最近的虚拟内存地址和物理 内存地址的映射关系,并保存在一个由CPU维护的映射表中。为了尽量提高内存的访问速度,需要在映射表中保存尽量多的映射关系。
4,Linux kernel 2.6.X 通过hugetlbfs文件系统对Huge pages进行了支持。当然Windows也有相应的支持,此处暂不详述。
5,KVM如何让guest使用huge pages ?
首先,让host开启huge pages(像上面那样设置)
在qemu启动时加上参数,示例:qemu-system-x86_64 -m 2048 -hda /mnt/rhel6.img -mem-path /dev/hugepages
如果是用libvirt来启动KVM的,那么需要在启动guest的XML配置文件中添加如下的参数:
(启动guest后,可以发现,在host中的cat /pro/meminfo看到的HugePages_Free数量有所减少)
HugePage简介和KVM中使用HugePage的更多相关文章
- KVM虚拟化(KVM简介和KVM安装)
KVM 虚拟化架构分类 寄居虚拟化架构:指在宿主操作系统之上安装和运行虚拟化程序,依赖于宿主操作系统对设备的支持和物理资源的管理. 裸金属虚拟化架构:指直接在硬件上面安装虚拟化软件,再在其上安装操作系 ...
- 烂泥:KVM中安装Windows Server 2008 R2系统
本文由秀依林枫提供友情赞助,首发于烂泥行天下. 在前一篇文章中,我介绍了有关在KVM中的安装Centos系统.接下来,就来介绍如何在KVM中安装Windows系统. 注意:在此我安装的是windows ...
- ARC简介以及工程中ARC与非ARC的混合
Piosa 博客园 博问 闪存 首页 新随笔 联系 管理 订阅 随笔- 79 文章- 0 评论- 13 ARC简介以及工程中ARC与非ARC的混合 ARC与非ARC在一个项目中同时使用, ...
- pyenv简介——Debian/Ubuntu中管理多版本Python
pyenv简介——Debian/Ubuntu中管理多版本Python MAY 21ST, 2016 12:00 AM | COMMENTS pyenv是管理Python版本的工具,它支持在多个Pyth ...
- kvm中重命名虚拟机
kvm中重命名虚拟机 1.查看虚拟机 [root@linux ~]# virsh list --all Id Name State ---------------------------------- ...
- KVm中EPT逆向映射机制分析
2017-05-30 前几天简要分析了linux remap机制,虽然还有些许瑕疵,但总算大致分析的比较清楚.今天分析下EPT下的逆向映射机制.EPT具体的工作流程可参考前面博文,本文对于EPT以及其 ...
- kvm中内存过载使用
与CPU过载使用类似,在KVM中内存也是允许过载使用(over commit)的,KVM能够让分配给客户机的内存总数大于实际可用的物理内存总数. 由于客户机操作系统及其上的应用程序并非一直100%地利 ...
- 简介Python设计模式中的代理模式与模板方法模式编程
简介Python设计模式中的代理模式与模板方法模式编程 这篇文章主要介绍了Python设计模式中的代理模式与模板方法模式编程,文中举了两个简单的代码片段来说明,需要的朋友可以参考下 代理模式 Prox ...
- Python单元测试简介及Django中的单元测试
Python单元测试简介及Django中的单元测试 单元测试负责对最小的软件设计单元(模块)进行验证,unittest是Python自带的单元测试框架. 单元测试与功能测试都是日常开发中必不可少的部分 ...
随机推荐
- CASS 7.1 和 AutoCAD 2006的安装使用
CAD 2006由于是一个古老的版本,所以在WIN7,WIN10上直接安装的话,一般无法成功.此外,AutoCAD 2006是不分32位64位的,之后的版本都是区分的. 但是,对于我这种几年不用一次C ...
- asp.net HttpModule和HttpHandler
ASP.Net处理Http Request时,使用Pipeline(管道)方式,由各个HttpModule对请求进行处理,然后到达 HttpHandler,HttpHandler处理完之后,仍经过Pi ...
- fastjson用法&Gson
<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson&l ...
- android加密解密完美教程
经常使用加密算法:DES.3DES.RC4.AES,RSA等; 对称加密:des,3des,aes 非对称加密:rsa 不可逆加密:md5 加密模式:ECB.CBC.CFB.OFB等; 填充模式:No ...
- extjs4权限管理,actioncolumn列显示隐藏或禁用
//隐藏getClass: function(v, meta, rec) { if ( someCondition ) { return 'x-hidden' } }//加入其他样式getClass: ...
- 通过案例对SparkStreaming透彻理解三板斧之三
本课将从二方面阐述: 一.解密SparkStreaming Job架构和运行机制 二.解密SparkStreaming容错架构和运行机制 一切不能进行实时流处理的数据都将是无效的数据.在流处理时代,S ...
- 报错:numRecords must not be negative
报错的原因:删除已经使用过的kafka topic,然后新建同名topic 解决方法:把topic名字换一下 (有其他更好的解决方法,可以不修改topic名)
- poj 3468 A Simple Problem with Integers 线段树区间更新
id=3468">点击打开链接题目链接 A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072 ...
- PHPer 应聘见闻
关于我自己 我,很普通的一个开发,88年出生在皖南山区.从小学到高中毕业都没想过自己会从事软件开发,高考的误打误撞,被某普通二本院校收编.大学浑浑噩噩,对软件开发也没多大的兴趣,11年毕业后来杭,面试 ...
- Java ActiveMQ队列模式案例
创建Eclipse项目并运行 创建java project:ActiveMQ-5.14,新建lib文件夹 打开apache-activemq-5.14.0-bin\apache-activemq-5. ...