Centos7
安装启动脚本时,提示netData安装的详细目录,按下Enter键执行。
安装完成后,脚本输出一段信息,包括:KSM、端口、启动命令
如果有下列信息,说明你的系统有 KSM,但是未启用,可以按照说明执行两句echo命令,节省 40-60% 的储存空间。
默认的web访问端口为19999。
至此,NetData安装启动完毕,可以通过 http://host_ip:port 进行访问,无需账号密码。
下面将结合Nginx设置账号密码。
由于netdata没有帐号密码体系,为保护服务器隐私,我们要使用nginx反向代理配置域名访问,并使用账号密码授权。
在 ...nginx/conf.d 中创建 netdata.conf 文件,写入如下内容, 适当修改端口号、域名、auth_basic_user_file 。
重启Nginx后,可以直接通过域名 netdata.example.com 访问,并且需要输入账号和密码。但是依然可以通过 http://IP:Port 的方式访问,接下来禁用IP访问。
kvm性能优化,主要集中在cpu、内存、磁盘、网络,4个方面,当然对于这里面的优化,也是要分场景的,不同的场景其优化方向也是不同的,下面具体聊聊这4个方面的优化细节。1. CPU
cpu优化需要搞清楚node、socket、core、logic processor的关系,知道内存、l3-cache、l2-cache、l1-cache和cpu的关系。
针对kvm的优化,一般情况,都是通过pin,将vm上的cpu绑定到某一个node上,让其共享l3-cache,优先选择node上的内存,bind方法可以通过virt-manage processor里面的pinning动态绑定。这个绑定是实时生效的。
由于没有下载到speccpu2005,所以写了个大量消费cpu和内存的程序,来检验绑定cpu所带来的性能提升,程序如下:
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#define BUF_SIZE 512*1024*1024
#define MAX 512*1024
#define COUNT 16*1024*1024
char * buf_1 = NULL
char * buf_2 = NULL
void *pth_1(void *data)
{
char * p1 = NULL
char * p2 = NULL
int value1 = 0
int value2 = 0
int value_total = 0
int i = 0
int j = 0
for (i = 0i <=COUNTi++) {
value1 = rand() % (MAX + 1)
value2 = rand() % (MAX + 1)
p1 = buf_1 + value1*1024
p2 = buf_2 + value2*1024
for (j = 0j <1024j++) {
value_total += p1[j]
value_total += p2[j]
}
}
return NULL
}
void *pth_2(void *data)
{
char * p1 = NULL
char * p2 = NULL
int value1 = 0
int value2 = 0
int value_total = 0
int i = 0
int j = 0
for (i = 0i <=COUNTi++) {
value1 = rand() % (MAX + 1)
value2 = rand() % (MAX + 1)
p1 = buf_1 + value1*1024
p2 = buf_2 + value2*1024
for (j = 0j <1024j++) {
value_total += p1[j]
value_total += p2[j]
}
}
return NULL
}
int main(void)
{
buf_1 = (char *)calloc(1, BUF_SIZE)
buf_2 = (char *)calloc(1, BUF_SIZE)
memset(buf_1, 0, BUF_SIZE)
memset(buf_2, 0, BUF_SIZE)
pthread_t th_a, th_b
void *retval
pthread_create(&th_a, NULL, pth_1, 0)
pthread_create(&th_b, NULL, pth_2, 0)
pthread_join(th_a, &retval)
pthread_join(th_b, &retval)
return 0
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
偶数cpu在node 0 上,奇数cpu在node 1上,vm有2个cpu,程序有2个线程,分别将vm绑定到8,9和10,12,通过time命令运行程序,time ./test,测试结果如下
8,9
real 1m53.999s
user 3m34.377s
sys 0m3.020s
10,12
real 1m25.706s
user 2m49.497s
sys 0m0.699s
可以看出,绑定到同一个node上,比绑到不同node上其消耗时间小不少。测试过程中,也发现如果提供8、9、10、11的cpu,系统会在大部分时间选择8、10和9、11,所以猜测,kvm在cpu bind上,可能已经做了优化,会尽可能的往同一个node上绑定。
这里需要注意的一点是,通过virt-manage pin cpu,仅仅进行cpu bind,会共享l3-cache,并没有限制一定用某一个node上的内存,所以仍然会出现跨node使用内存的情况
2. 内存
优化项包括EPT、透明大页、内存碎片整理、ksm,下面一个一个来介绍
2.1 EPT
针对内存的使用,存在逻辑地址和物理地址的转换,这个转换时通过page table来进行的,并且转换过程由cpu vmm硬件加速,速度是很块的。
但是引入vm之后,vm vaddr----->vm padddr--------->host paddr,首先vm需要进行逻辑地址和物理地址的转换,但是vm的物理地址还是host机的逻辑地址,需要再进行一次逻辑地址到物理地址的转换,所以这个过程有2次地址转换,效率非常低。
幸亏intel提供了EPT技术,将两次地址转换变成了一次。这个EPT技术是在bios中,随着VT技术开启一起开启的。
2.2 透明大页
逻辑地址向物理地址的转换,在做转换时,cpu保持一个翻译后备缓冲器TLB,用来缓存转换结果,而TLB容量很小,所以如果page很小,TLB很容易就充满,这样就很容易导致cache miss,相反page变大,TLB需要保存的缓存项就变少,减少cache miss。
透明大页的开启:echo always >/sys/kernel/mm/transparent_hugepage/enabled
内存碎片整理的开启:echo always>/sys/kernel/mm/transparent_hugepage/defrag
2.3 KSM
简单理解就是可以将host机内容相同的内存合并,节省内存的使用,特别是当vm *** 作系统都一样的情况,肯定会有很多内容相同的内存,开启了KSM,则会将这些内存合并为一个,当然这个过程会有性能损耗,所以开启与否,需要考虑使用场景,如果不注重vm性能,而注重host内存使用率,可以考虑开启,反之则关闭,在/etc/init.d/下,会有两个服务,服务名称为ksm和ksmtuned,都需要关闭
3. 磁盘
磁盘的优化包括:virtio-blk、缓存模式、aio、块设备io调度器
3.1 virtio
半虚拟化io设备,针对cpu和内存,kvm全是全虚拟化设备,而针对磁盘和网络,则出现了半虚拟化io设备,目的是标准化guest和host之间数据交换接口,减少交互流程和内存拷贝,提升vm io效率,可以在libvirt xml中设置,disk中加入<target dev='vda' bus='virtio'/>
3.2 缓存模式
从vm写磁盘,有3个缓冲区,guest fs page cache、Brk Driver writeback cache(qemu的cache)、Host FS page cache,在host上的设置,无法改变guest fs page cache,但是可以改变后面2个cache,缓存模式有如下5种,当采用Host FS page cache,会有一个写同步,会实时将host cache中的数据flush到磁盘上,当然这样做比较安全,不会丢失数据,但写性能会受到影响。
writeback mode在mail server这种小文件 高io的服务器上,其性能是很差的,none模式大部分情况要比writethrough性能稍好一点,所以选择none。
启用方式在libvirt xml disk中加入<driver name='qemu' type='qcow2' cache='none'/>
3.3 aio
异步读写,分别包括Native aio: kernel AIO 和 threaded aio: user space AIO emulated by posix thread workers,内核方式要比用户态的方式性能稍好一点,所以一般情况都选择native,开启方式<driver name='qemu' type='qcow2' cache='none' aio='native'/>
3.4 块设备调度器
cfq:perprocess IO queue,较好公平性,较低aggregate throughput
deadline:per-device IO queue,较好实时性,较好aggregate throughput,不够公平,当某些vm有大量io *** 作,占用了大量io资源时,其它后加入的vm很有可能抢占不到io资源。
这个目前笔者还没有做过测试,但是查看网易和美团云的方案,都将其设置为cfq。
开启方式:echo cfq >/sys/block/sdb/queue/scheduler
4. 网络
优化项包括virtio、vhost、macvtap、vepa、SRIOV 网卡,下面有几篇文章写的非常好
http://www.ibm.com/developerworks/cn/linux/1312_xiawc_linuxvirtnet/
http://xiaoli110.blog.51cto.com/1724/1558984
4.1 virtio
更改虚拟网卡的类型,由全虚拟化网卡e1000、rtl8139,转变成半虚拟化网卡virtio,virtio需要qemu和vm内核virtio驱动的支持,这个原理和磁盘virtio原理一样,不再赘述。
4.2 vhost_net
vhost_net将virtiobackend处理程序由user space转入kernel space,将减少两个空间内存拷贝和cpu的切换,降低延时和提高cpu使用率
4.3 macvtap
代替传统的tap+bridge,有4中模式,bridge、vepa、private、passthrough
1 Bridge
完成与 Bridge 设备类似功能,数据可以在属于同一个母设备的子设备间交换转发. 当前的Linux实现有一个缺陷,此模式下MACVTAP子设备无法和Linux Host通讯,即虚拟机无法和Host通讯,而使用传统的Bridge设备,通过给Bridge设置IP可以完成。但使用VEPA模式可以去除这一限制. macvtap的这种bridge模式等同于传统的tap+bridge的模式.
2 VEPA
是对802.1Qbg标准中的VEPA机制的部分软件实现,工作在此模式下的MACVTAP设备简单的将数据转发到母设备中,完成数据汇聚功能,通常需要外部交换机支持Hairpin模式才能正常工作。
3 Private
Private模式和VEPA模式类似,区别是子 MACVTAP之间相互隔离。
4 Passthrough
可以配合直接使用SRIOV网卡, 内核的macvtap数据处理逻辑被跳过,硬件决定数据如何处理,从而释放了Host CPU资源。MACVTAP Passthrough 概念与PCI Passthrough概念不同,PCI Passthrough针对的是任意PCI设备,不一定是网络设备,目的是让Guest OS直接使用Host上的 PCI 硬件以提高效率。MACVTAP Passthrough仅仅针对 MACVTAP网络设备,目的是饶过内核里MACVTAP的部分软件处理过程,转而交给硬件处理。综上所述,对于一个 SRIOV 网络设备,可以用两种模式使用它:MACVTAP Passthrough 与 PCI Passthrough
4.4 PCI pass-through
直通,设备独享。
4.5 SO-IOV
优点是虚拟网卡的工作由host cpu交给了物理网卡来实现,降低了host cpu的使用率,缺点是,需要网卡、主板、hypervisor的支持。
测试结果,在实验室2台host,分别起1台vm(vm1、vm2),用iperf测试vm1和vm2之间的吞吐量,用ping测试2者之间的响应时间,host机为百兆网卡,结果如下表所示,可以看出随着优化的深入,其吞吐量和响应时间都有所改善,由于暂时没有硬件的支持,macvtap vepa和SR-IOV没有得到测试。
测试工具 Iperf(ping)
rtl8139
87Mb/s(1.239ms)
virtio
89Mb/s(1.140ms)
Virtio + host_net
92Mb/s(1.014ms)
Macvtap(bridge) + virtio + host_net
94Mb/s(0.989ms)
host
95Mb/s(0.698ms)
总结来看网络虚拟化具有三个层次:
1, 0成本,通过纯软件virtio、vhost、macvtap提升网络性能
2, 也可以用非常低的成本按照802.1Qbg中的VEPA模型创建升级版的虚拟网络,引出虚拟机网络流量,减少Host cpu负载,但需要物理交换机的配合
3, 如果网络性能还是达不到要求,可以尝试SR-IOV技术,不过需要SR-IOV网卡的支持。
总结:文章总共阐述了cpu、内存、磁盘、网络的性能优化方案,大部分都是通过kvm参数和系统内核参数的修改来实现。
内核及虚拟化漫谈
微信公众号
分享linux开发技术及新闻热点
点击阅读全文
打开CSDN APP,看更多技术内容
【实 *** 干货】KVM命令管理虚拟机与性能优化_weixin_34059951的博客-CSDN...
简要介绍KVM中经常使用的基本功能管理命令(CentOS7.4是宿主机中安装的虚拟机)1)、virsh -h #查看命令帮助 2)、ls /etc/libvirt/qemu #查看KVM的配置文件存放目录(虚拟机系统实例配置文件的文件名为.xml) 3)、virsh list #查看...
继续访问
python虚拟机优化_KVM虚拟机管理及性能优化_weixin_39559804的博客-CSDN...
KVM采用全虚拟化技术,全虚拟化要由一个软件来模拟硬件层,故有一定的损耗,特别是I/O,因此需要优化。 1:CPU优化 所有guestcpu 不要超过物理机的CPU总数,建议复制主机CPU配置。 2:内存优化 1) :KSM(相同页合并)开启KSM会将相同的内...
继续访问
kvm虚拟机性能优化方案
kvm性能优化方案
KVM总结-KVM性能优化之CPU优化
任何平台根据场景的不同,都有相应的优化。不一样的硬件环境、网络环境,同样的一个平台,它跑出的效果也肯定不一样。就好比一辆法拉利,在高速公路里跑跟乡村街道跑,速度和激情肯定不同…
继续访问
KVM虚拟机的优化历程---按需优化_weixin_33778544的博客
一、KVM为什么要调优 性能的损耗是矛盾的根源,KVM采用全虚拟化技术,全虚拟化要由一个软件来模拟硬件层,故有一定的损耗,特别是I/O输入输出。 KVM性能优化主要在CPU、内存、I/O这几方面,当然在这几方面也是要分场景的,不同场景优化...
继续访问
qemu-kvm虚拟机性能优化_li_Jiejun的博客_qemu虚拟机...
在KVM虚拟机中运行mysql,发现与ESX虚拟机中比较,性能有些差。用sysbench测试KVM虚拟机中的mysql,TPS刚刚到1500级别。性能如图:使用perf命令跟踪KVM虚拟机对应的进程,情况如下:从图中可以看出,这台虚拟机的page_fault占比较高,其次是__...
继续访问
最新发布 KVM 虚拟化详解
服务器虚拟化是云计算最核心的技术,而KVM是当前最主流的开源的服务器虚拟化技术。从Linux2.6.20起,KVM作为内核的一个模块 集成到Linux主要发行版本中。从技术架构(代码量、功能特性、调度管理、性能等)、社区活跃度,以及应用广泛度来看,KVM显现出明显优势,已逐渐替换另一开源虚拟化技术Xen。在公有云领域,2017年之后AWS、阿里云、华为云等厂商都逐渐从Xen转向KVM,而Google、腾讯云、百度云等也使用KVM。在私有云领域,目前VMware ESXi是领导者,微软Hyper-V不少应用,
继续访问
恒天云技术分享系列3 – KVM性能调优
恒天云技术分享:http://www.hengtianyun.com/download-show-id-11.html KVM是什么 KVM 是 kernel-based Virtual Machine 的简称,是一个开源的系统虚拟化模块,自Linux 2.6.20之后集成在Linux的各个主要发行版本中。它使用Linux自身的调度器进行管理,所以相对于Xen,其核心源码很少...
继续访问
KVM优化_笛香幽谷(欧锐)的博客
KVM优化 第1章 KVM 1.1 架构 图表1 1 KVM基本架构图 1. kvm 驱动:主要负责虚拟机创建,虚拟内存分配,VCPU寄存器读写以及VCPU运行2. Qemu:用于模拟虚拟机的用户空间组件,提供I/O设备模型,访问外设的途径。
继续访问
KVM虚拟化性能优化_weixin_34133829的博客
KVM虚拟化性能优化 可从以下几个方面优化KVM虚拟机,提高虚拟机的性能。 1、全虚拟化使用半虚拟化驱动(virtio) virtio是KVM的半虚拟化机制,可提高IO性能,使用virtio可心显著提高KVM性能。virtio包括磁盘驱动和网卡驱动,下面是在XML文件中...
继续访问
KVM 性能优化之内存优化
二、KVM 内存性能调优 我们说完CPU方面的优化,接着我们继续第二块内容,也就是内存方面的优化。内存方面有以下四个方向去着手: 1. EPT 技术 2. 大页和透明大页 3. KSM 技术 4. 内存限制 2.1. EPT技术 EPT也就是扩展页表,这是intel开创的硬件辅...
继续访问
KVM学习(二十一)性能监视与优化
为什么要监视性能? 第一、了解服务器的工作负荷以及对服务器资源的影响 第二、了解性能的改变和性能趋势以便及采取措施 第三、诊断系统问题并确认优化措施 建立性能基线 性能基线是在一段时间中在典型的工作负荷和用户连接数量的情况下收集的服务器性能数据。 在确定性能基线时,应当了解服务器所执行的任务,以及执行任务的时间和日期。 在部署阶段建立性能基线,然后和实际性能进行比较。 及早建立性能基线有助于快速发...
继续访问
kvm 虚拟机的性能调优_weixin_30512785的博客
2、kvm 自带优化。大多数的优化都是默认配置的,只是通过了解这些优化项来进一步了解linux 及kvm虚拟化 CPU优化 场景1: 上下文切换: 宿主机 ring 0 ring 3 虚拟机 ring 0 ring 3 解决:vmware虚拟机编辑处理器--虚拟化引擎--勾选 ...
继续访问
KVM性能优化--CPU篇_Shawn.Hu的博客_kvm cpu toplogy
可以使用以下命令来设置将虚拟机绑定到指定node。 virsh numatune domain --nodeset 'string' 复制代码 举个列子:将上面的虚拟机test(6核),限定在Node0和1中,使用物理机六个CPU1,2,3,4,6,7。 (注:本例中由于一个socket...
继续访问
Neutron中的网络I/O虚拟化(by quqi99)
作者:张华 发表于:2014-04-03 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 (http://blog.csdn.net/quqi99 ) 为了提升网络I/O性能,虚拟化的网络I/O模型也在不断的演化: 1,全虚拟化网卡(emulation),如VMware中的E1000用来仿真intel 82545千兆网卡,
继续访问
热门推荐 kvm性能优化方案---cpu/内存/磁盘/网络
kvm性能优化 kvm性能优化,主要集中在cpu、内存、磁盘、网络,4个方面,当然对于这里面的优化,也是要分场景的,不同的场景其优化方向也是不同的,下面具体聊聊这4个方面的优化细节。 cpu 在介绍cpu之前,必须要讲清楚numa的概念,建议先参考如下两篇文章 CPU Topology 玩转cpu-topology 查看cpu信息脚本: #!/bin/bash # Simple p
继续访问
KVM性能优化
一、KVM为什么要调优 性能的损耗是关键。KVM采用全虚拟化技术,全虚拟化要由一个软件来模拟硬件,故有一定的损耗,特别是I/O,因此需要优化。KVM性能优化主要在CPU、内存、I/O这几方面。当然对于这几方面的优化,也是要分场景的,不同的场景其优化方向也是不同的。 二、KVM优化思路及步骤 KVM的性能已经很不错了,但还有一些微调措施可以进一步提高KVM的性能1、CPU的优化要考虑CPU的数量问题...
继续访问
KVM 虚拟化的功能特性
虚拟化指创建某事物的虚拟(而非实际)版本,包括虚拟的计算机硬件平台、存储设备,以及计算机网络资源),虚拟化是一种资源管理技术,它将计算机的各种实体资源(CPU、内存、存储、网络等)予以抽象和转化出来,并提供分割、重新组合,以达到最大化利用物理资源的目的。 KVM 全称是 Kernel-based Virtual Machine,即基于内核的虚拟机,是采用硬件虚拟化技术的全虚拟化解决方案。KVM 从诞生开始就定位于基于硬件虚拟化支持的全虚拟化实现。它以内核模块的形式加载之后,就将 Linux 内核变成了一个
继续访问
KVM虚拟机管理及性能优化
KVM虚拟机管理及性能优化 上一章给大家介绍了KVM虚拟化的部署安装本章接上一篇文章继续为大家讲解,如何使用KVM的 *** 作命令,对虚拟机进行管理(虚拟机开启关闭、挂起恢复、删除虚拟机、通过备份配置文件重新恢复删除的虚拟机)、KVM文件管理(磁盘格式转换、对磁盘文件查看、修改等)、虚拟机的克隆、虚拟机快照。以及最后给大家介绍 KVM性能优化的三个调优思路、和系统调优工具 使用KVM命令集管理虚拟机...
继续访问
KVM 性能调优与限制
kvm内存优化: 调高内存回收水位值echo 10 >/proc/sys/vm/swappinessecho 1024000 >/proc/sys/vm/min_free_kbytes 在文件/etc/sysctl.conf中加入 vm.dirty_ratio=10原理:linux会设置40%的可用内存用来做系统cache,当flus...
继续访问
KVM latency优化点分析
kvm latency tunning 注:参考tencent-cloud的wangpengli的报告 报告的目标是优化kvm hypervisor的latency性能,主要有以下几点。 TLB Shootdown TLB:Translation Lookaside Buffer,转译后备缓冲区(页表缓存),存放虚拟地址映射物理地址。 TLB shootdown一般通过IPI方式实现。 问题 TBL shootdown preemption问题。 在裸金属架构(bare-metal)上,远程TLB刷新导致发
继续访问
高性能kvm服务器,KVM进阶之(一)KVM性能监视与优化
为什么要性能监视通过性能监视,你可以1:了解服务器的工作负荷以及对服务器资源的影响2:了解性能的改变和性能趋势以便及采取措施3:测试调整结果4:诊断系统问题并确定优化措施分析性能数据确定系统瓶颈建立性能基线服务器性能监视的最佳策略建立性能日志尽量减少性能监视本身对服务器所造成的影响分析监视结果,建立性能基线创建警报调整系统scale Upscale Out分析性能趋势,提前采取措施监视工具你熟悉的...
继续访问
KVM虚拟化(一)
一、KVM虚拟化架构 1、主流虚拟机架构 图中对比了几种主流虚拟化技术架构:ESXi、Xen与KVM,其主要差别在与各组件(CPU、内存、磁盘与网络IO)的虚拟化与调度管理实现组件有所不同。在ESXi中,所有虚拟化功能都在内核实现。Xen内核仅实现CPU与内存虚拟化, IO虚拟化与调度管理由Domain0(主机上启动的第一个管理VM)实现。KVM内核实现CPU与内存虚拟化,QEMU实现IO虚拟化...
继续访问
KVM虚拟化的优化
KVM调优 思路 性能的损耗是矛盾的根源,KVM采用全虚拟化技术,全虚拟化要由一个软件来模拟硬件层,故有一定的损耗,特别是I/O输入输出。KVM性能优化主要在CPU、内存、I/O这几方面,当然在这几方面也是要分场景的,不同场景优化方向也是不同的。 CPU优化 要考虑CPU的数量问题,所有guestCPU的总数目不要超过物理机CPU的总数目。如果超过,则将对性能带来严重影响,建议选择复制主机CPU配...
继续访问
windows虚拟机qemu进程cpu占有率很高问题解决
1.1 现象 在公有云平台,openstack计算节点上,如图Figure-1所示,一台windows虚拟机的qemu-kvm进程116%的占用cpu资源,如图Figure-2所示,该虚拟机仅有一个vcpu。 Figure-1: Figure-2: 1.2 分析步骤 通过下面步骤的分析,了解qemu-kvm进程在忙什么,为什么这么忙? 1.2.1 查看进程、线程的状态 通过top -d 3 -Hp 5180查看进程,以及该进程的相关线程的状态,分析出哪个线程在忙。如图Figure-3所示: 线程51
继续访问
启用 SR-IOV 解决 Neutron 网络 I/O 性能瓶颈
目录: 目录 目录: 前文列表 前言 Neutron 的网络实现模型 基于虚拟网络设备的虚拟机流量走向 基于虚拟网络设备的性能瓶颈 在 Neutron 中引入 SR-IOV 技术 基于 SR-IOV 技术的虚拟机流量走向编辑 Neutron 配置启用 SR-IOV SR-IOV 与 NUMA 亲和 SR-IOV 与 VLAN tag SR-IOV 与安全组 前文列表 《SR-IOV 网卡虚拟化技术》 前言 该文章是基于「计算机系统应用」月刊文章《SR-I...
继续访问
KVM总结-KVM性能优化之磁盘IO优化
介绍KVM磁盘性能方面的调优。磁盘IO我们可以从以下四个方面去着手优化: 1)磁盘类型选择2)缓存模式选择3)AIO 异步读写方式选择4)磁盘IO调度器选择。
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的方式效率较为低一些。ballooning和KSM将在第5章中详细介绍,本章主要介绍swapping这种方式实现内存过载使用。
KVM中客户机是一个QEMU进程,而宿主机系统没有特殊对待它而分配特定的内存给QEMU,只是把它当做一个普通Linux进程。Linux内核在进程请求更多内存时才分配给它们更多的内存,所以也是在客户机 *** 作系统请求更多内存时,KVM才给其分配更多的内存。
用swapping的方式来让内存过载使用,要求有足够的交换空间(swap space)来满足所有的客户机进程和宿主机中其他进程所需内存。可用的物理内存空间和交换空间的大小之和应该等于或大于配置给所有客户机的内存之总和,否则,在各个客户机内存使用同时达到较高比率时可能会有客户机(因内存不足)被强制关闭。
下面通过一个实际的例子来说明如何计算应该分配的交换空间大小以满足内存的过载使用。
某个服务器有32GB的物理内存,想在其上运行64个内存配置为1GB的客户机。在宿主机中,大约需要4GB大小的内存用于满足系统进程、驱动、磁盘缓存及其他应用程序所需(不包括客户机进程所需内存)。计算过程如下:
客户机所需交换分区为:64 x 1GB + 4GB – 32GB = 36GB。
而根据Redhat的建议[7],对于32GB物理内存的RHEL系统推荐使用8GB的交换分区。
所以,在宿主机中总共就需要建立44GB(36GB+8GB)的交换分区来满足安全地实现客户机内存的过载使用。
下面是在一台Ivy Bridge桌面级的硬件平台上进行的简单实验,可以看出客户机并非开始就在宿主机中占用其启动时配置的内存。
宿主机中,启动客户机之前和之后,查看系统内存情况如下。
[root@jay-linux ~]# free -m
total used free shared buffers cached
Mem: 3851 1006 2845 0 172 444
-/+ buffers/cache: 388 3462
Swap: 4095 0 4095
[root@jay-linux ~]# qemu-system-x86_64 –m 2048 –smp 4 -hda /root/kvm_demo/rhel6u3.img –daemonize
[root@jay-linux ~]# free -m
total used free shared buffers cached
Mem: 3851 1454 2397 0 172 531
-/+ buffers/cache: 749 3101
Swap: 4095 0 4095
在客户机中,查看内存使用情况如下。
[root@kvm-guest ~]# free -m
total used free shared buffers cached
Mem: 1877 246 1630 0 25 130
-/+ buffers/cache: 90 1786
Swap: 510 0 510
从理论上来说,给客户机的内存过载使用可以达到实际物理内存的几倍甚至几十倍,不过除非特殊情况下,一般不建议过多地过载使用内存。一方面,交换空间通常是磁盘分区来做的,其读写速度比物理内存读写速度慢得多,性能并不好;另一方面,过多的内存过载使用也可能导致系统稳定性降低。所以,KVM允许内存过载使用,但在生产环境中配置内存的过载使用之前,仍然应该根据实际应用的进行充分的测试。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)