与CPU过载使用类似,在KVM中内存也是允许过载使用(over commit)的,KVM能够让分配给客户机的内存总数大于实际可用的物理内存总数

由于客户机操作系统及其上的应用程序并非一直100%地利用其分配到的内存,

并且宿主机上的多个客户机一般也不会同时达到100%的内存使用率,所以内存过载分配是可行的。

一般来说,有如下三种方式来实现内存的过载使用:

1) 内存交换(swapping): 用交换空间(swap space )来弥补内存的不足。

2) 气球(ballooning ): 通过virio_balloon驱动来实现宿主机Hypervisor和客户机之间的协作

3) 页共享(page sharing ): 通过KSM(Kernel Samepage Merging)合并多个客户机的进程使用的相同内存页

其中,第一种内存交换的方式是最成熟的(Linux中很早就开始应用),也是目前广泛使用的,不过,相比KSM和ballooning的方式效率较低一些。

KVM中客户机是一个QEMU进程,宿主机系统没有特殊对待它而分配特定的内存给QEMU,只是把它当做一个普通Linux进程。Linux内核在进程请求更多内存时才会给它们分配更多的内存,所以也是但客户机操作系统请求更多内存时,KVM才向其分配更多的内存

用swapping方式来让内存过载使用,要求有足够的交换空间(swap space)来满足所有的客户机进程和宿主机中其他进程所需内存。可用的物理内存空间和交换空间的大小之和应该等于或大于配置给所有客户机的内存总和,否则,在各个客户机内存使用同时达到较高比率时可能会有客户机(因内存不足)被强制关闭

下面通过一个实际的例子来说明如何计算应该分配的交换空间大小以满足内存的过载使用。某个服务器有32GB的物理内存,想在其上运行64个内存配置为1GB的客户机。在宿主机中,大约需要4GB大小的内存来满足系统进程、驱动、磁盘缓存及其他应用程序所需内存(不包括客户机进程所需内存)。

计算过程如下:

客户机所需交换分区(swap)为:64*1GB + 4GB - 32GB = 36GB。

根据Redhat 的建议, 对于32GB物理内存的RHEL系统,推荐使用8GB的交换分区

所以,在宿主机中总共需要建立44GB(36GB+8GB)的交换分区来满足安全实现客户机内存的过载使用。

下面是在一台Ivy Bridge桌面级的硬件平台上进行的简单实验,可以看出客户机并非一开始就在宿主机中占用其启动时配置的内存。

宿主机中,在启动客户机之前和之后查看到的系统内存情况如下:

客户机中,查看内存使用情况如下:

从理论上来说,供客户机过载使用的内存可以达到实际物理内存的几倍甚至几十倍,不过除非特殊情况,一般不建议过多地过载使用内存

一方面,交换空间通常是由磁盘分区来实现的,其读写速度比物理内存读写速度慢得多,性能并不好;

另一方面,过多的内存过载使用也可能导致系统稳定性降低。所以,KVM允许内存过载使用,但在生产环境中配置内存的过载使用之前,仍然应该根据实际应用进行充分的测试

kvm中内存过载使用的更多相关文章

  1. CentOS7中KVM虚拟机内存、CPU调整

    CentOS7中KVM虚拟机内存.CPU调整 1. 调小虚拟机内存 调小虚拟机内存可以动态实现,不用关机 1.1 查看当前内存大小 [root@kvm01 ~]# virsh dominfo vm1- ...

  2. CentOS7.6中 KVM虚拟机内存、CPU调整

    CentOS7.6中 KVM虚拟机内存.CPU调整 一.调小虚拟机内存 调小虚拟机内存可以动态实现,不用关机 1.查看当前内存大小 [root@heyong kvm]# virsh dominfo t ...

  3. 烂泥:KVM中安装Windows Server 2008 R2系统

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 在前一篇文章中,我介绍了有关在KVM中的安装Centos系统.接下来,就来介绍如何在KVM中安装Windows系统. 注意:在此我安装的是windows ...

  4. Qemu创建KVM虚拟机内存初始化流程

    转载请注明:[转载自博客xelatex KVM],并附本文链接.谢谢. [注]文章中采用的版本: Linux-3.11,https://www.kernel.org/pub/linux/kernel/ ...

  5. KVm中EPT逆向映射机制分析

    2017-05-30 前几天简要分析了linux remap机制,虽然还有些许瑕疵,但总算大致分析的比较清楚.今天分析下EPT下的逆向映射机制.EPT具体的工作流程可参考前面博文,本文对于EPT以及其 ...

  6. 查找Linux中内存和CPU使用率最高的进程

    下面的命令会查看到按照RAM和CPU降序方式的前最高几名进程的列表: [root@iZ25pvjcsyhZ ~]# ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem ...

  7. java中内存分配策略及堆和栈的比较

    Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间 ...

  8. DLL函数中内存分配及释放的问题

    DLL函数中内存分配及释放的问题 最近一直在写DLL,遇到了一些比较难缠的问题,不过目前基本都解决了.主要是一些内存分配引起问题,既有大家经常遇到的现象也有特殊的 情况,这里总结一下,做为资料. 错误 ...

  9. 深入理解Linux中内存管理

    前一段时间看了<深入理解Linux内核>对其中的内存管理部分花了不少时间,但是还是有很多问题不是很清楚,最近又花了一些时间复习了一下,在这里记录下自己的理解和对Linux中内存管理的一些看 ...

随机推荐

  1. spoj NSUBSTR - Substrings【SAM】

    先求个SAM,然后再每个后缀的对应点上标记si[nw]=1,造好SAM之后用吧parent树建出来把si传上去,然后用si[u]更新f[max(u)],最后用j>i的[j]更新f[i] 因为每个 ...

  2. Vue 基础指令学习

    学习Vue的一些总结,第一次写博客,文笔实在是很差 不过我会不断写的. <template> <!--只能有一个根节点 --> <div> <pre> ...

  3. 为什么wait,notify和notifyAll要与synchronized一起使用?

    https://blog.csdn.net/qq_39907763/article/details/79301813 Object.wait(),Object.notify(),Object.noti ...

  4. AtCoder Regular Contest 083 E - Bichrome Tree

    题目传送门:https://arc083.contest.atcoder.jp/tasks/arc083_c 题目大意: 给定一棵树,你可以给这些点任意黑白染色,并且赋上权值,现给定一个序列\(X_i ...

  5. find missing conjunction, why?

    find . -name *.c find: missing conjunction, why? SHELL会把*.c直接扩展成当前工作目录的多个.c文件,所以必须用单引号'*.c'或者/*.c进行转 ...

  6. 517 Super Washing Machines 超级洗衣机

    详见:https://leetcode.com/problems/super-washing-machines/description/ C++: class Solution { public: i ...

  7. (025)[系统故障]XP下禁止将串口设备识别成鼠标(转)

    很多人都遇到过这种问题:Windows XP启动时将一台连续发送数据的串口设备识别成串口鼠标,自动安装了串口鼠标驱动,而设备因此无法正常工作,而光标则无规律地到处跑.对此问题,Internet上的方法 ...

  8. [已读]JavaScript面向对象编程指南

    又是一个忽悠人的书名,其实这本书的花了大量内容阐述JS的基础语法,BOM,DOM,事件,ajax(这个和很多js书一样).最后一章则是编程模式与设计模式. 我觉得与面向对象没多大关系,要算的话,pro ...

  9. js删除最后一个字符

    在最近做一个系统,使用socket来完成后台操作,C#来完成前端操作.但是在定的协议里面,一定要用某个符号来表示传的数据结束.后台进行交互时,获取到的数据必须进行删除最后一个字符的操作. 比如我们协议 ...

  10. vue_resource 使用说明

    前几天用vue-resource调用接口,用post方式给后端,发现后端php接受不到数据,这好奇怪,最后发现提交给后端的时候 需要加一个参数 就是:emulateJSON : true 这句话的意思 ...