再论KVM超量使用

转载自:http://www.sohu.com/a/111248295_251444

KVM超量使用一直是热门话题,前段时间发的文章:

群讨论:虚拟机能否使用32个CPU

又引去了群友的激烈讨论,本文为群友根据自己的经验总结投稿,感谢这位热心的群友!

欢迎更多的朋友投稿,将自己的经验发给大家,我们一起进步。

KVM hypervisor支持超量使用CPUs和超量使用内存,超量使用意思是分配多于系统上物理资源的虚拟CPUs和内存。当CPU超量使用,利用率较低的虚拟服务器或桌面可以运行在更少的服务器上,从而节省系统资源的数量,从而节省电力、散热在服务器硬件上的投资。

超量使用内存

大多数操作系统和应用程序不会总是使用有效RAM的100%,这个行为可以被KVM利用。KVM可以分配更多于主机有效物理的内存给来宾。超量使用需要足够的swap空间给所有来宾和所有主机的进程。

在KVM下,虚拟机当作是Linux的进程。在KVM hypervisor上的来宾没有专门的物理RAM块分配给它们,而来宾作为Linux进程活动。Linux内核当进程请求更多的内存时分配给每个进程内存。KVM的来宾当来宾操作系统请求时被分配内存。

警告:确保总的swap和内存空间大于或等于所有运行中来宾的内存配置。如果少于这个总数会导致一个来宾被强制关机。

为超量使用内存配置swap

swap分区用来交换未充分利用的内存到硬盘来提高内存性能。默认的swap分区大小是从主机的物理RAM计算而来的。

swap分区必须足够大来提供所有来宾的虚拟内存和主机系统。

重要:下面的例子只是提供一个配置swap的指导。列出的设置可能在你的环境里是不合适的。

Example 内存超量使用例子

ExampleServer1有32GB的RAM。系统要配置来运行56台有1GB虚拟内存的来宾。主机系统为系统进程,驱动和存储缓存很少使用超过4GB内存。

32GB减去主机4GB剩下28GB物理RAM给来宾。每个来宾使用1GB的RAM,所有来宾总共需要56GB的虚拟RAM。

Red Hat官方知识库建议一个32GB RAM的系统需要8GB的swap。为了安全超量使用内存,需要有足够的给所有来宾作虚拟内存以及主机。主机剩下28GB的RAM给所有来宾(来宾需要56GB的RAM)。因此,系统需要至少28GB的swap给所有来宾。

ExampleServer1需要至少36GB(8GB给主机以及28GB给来宾)的swap来安全超量使用来支持56台来宾。

超量使用内存10倍于系统的物理RAM是有可能。这只适用于某些类型的来宾,例如,小密集使用的桌面虚拟化或几个有KSM的相同运行中的来宾。配置swap和内存超量使用不是一个标准,每一个环境和安装是不一样的。你的环境必须测试和自定义来确保稳定性和性能。

超量使用虚拟CPUs

KVM允许客户机过载使用(over-commit)物理资源,即给客户机分配的CPU和内存数量多于物理上实际存在的资源。

物理资源的过载使用能带来一些资源充分利用方面的好处。试想在一台强大的硬件服务器中运行着Web服务器、图片存储服务器、后台数据统计服务器等作为虚拟客户机,但是它们并非在同一时刻都会负载很高,如Web服务器和图片服务器在白天工作时间负载较重,而后台数据统计服务器则主要在晚上工作,所以如果对物理资源进行合理的过载使用,给这几个客户机分配的系统资源总数多余实际拥有的物理资源,就可能在白天和夜晚都充分利用物理硬件资源,而且由于几个客户机不会同时对物理资源造成很大的压力,它们各自的服务质量(QoS)也是能得到保障的。

CPU的过载使用,是让一个或多个客户机使用vCPU的总数量超过实际拥有的物理CPU数量,QEMU会启动更多的线程来为客户机提供服务,这些线程也是被Linux内核调度运行在物理CPU硬件上。

关于CPU的过载使用,最推荐的做法是对多个单CPU的客户机使用over-commit,比如:在拥有4个逻辑CPU的宿主机中,同时运行多于4个(如8个、16个)客户机,其中每个客户机都被分配一个vCPU。这时,如果每个宿主机的负载不很大的情况下,宿主机Linux对每个客户机的调度是非常有效的,这样的过载使用并不会带来客户机中的性能损失。

关于CPU的过载使用,最不推荐的做法是让某一个客户机的vCPU数量超过物理系统上存在CPU数量。比如,在拥有4个逻辑CPU的宿主机中,同时运行一个或多个客户机,其中每个客户机的vCPU数量多于4个(如16个)。这样的使用方法会带来比较明显的性能下降,其性能反而不如将客户机分配2个(或4个)vCPU,而且如果客户机中负载过重时,可能会让整个系统运行不稳定。不过,在并非100%满负载的情况下,一个(或多个)有4个vCPU的客户机运行在拥有4个逻辑CPU的宿主机中并不会带来明显的性能损失。

总的来说,KVM允许CPU的过载使用,但是并不推荐在实际的生产环境(特别是负载较重的环境)中过载使用CPU。在生产环境中过载使用CPU,有必要在部署前进行严格的性能和稳定性测试。

KSM

共享内存的概念在当今操作系统中是常见的。例如,当一个程序首次启动,它共享父进程所有的内存。当子进程或父进程尝试去更改这个内存,内核分配一个块新内存区域,拷贝原始内容并且允许这个程序去修改这块新区域。这被认为是写时拷贝。

KSM是一个新的Linux特性使用相反的概念。KSM使内核去检查2个或多个已经运行的程序并且比较它们的内存。如果任何内存区域或页面是相同的,KSM减少多个相同的内存页面到一个单独的页面。这个页面然后被标记为写时拷贝。如果来宾更改了这个页面的内容,一个新的页面被创建给那个来宾。

这对KVM虚拟化是非常有用的。当一个来宾启动,它只从父qemu-kvm进程继承内存。当所有来宾运行相同的操作系统或应用程序时,那么来宾运行来宾操作系统镜像的内容可以被共享。KSM只识别和合并相同的页面不会干扰来宾或对主机或来宾的安全性造成影响。KSM允许KVM请求这些被共享的相同的来宾内存区域。

KVM提供增强内存速率和利用率,在KSM下,共同的进程数据被存储在缓存或主要内存中。这为KVM来宾减少缓存遗漏可以提高一些应用程序和操作系统的性能。其次,共享内存减少来宾的整体内存使用率,允许更高密度和更大的资源利用率。

Red Hat EnterpriseLinux使用2个单独的方法控制KSM:

·ksm服务启用和停止KSM内核线程。

·ksmtuned服务控制和调试ksm,动态管理相同页面合并。当内存共享不是必要的,ksmtuned服务启动ksm和关闭ksm服务。ksmtuned服务必须被以返回参数告知来运行当来宾被创建或被销毁。

这2个服务被标准的服务管理工具控制。

KSM服务

ksm服务被包含在qemu-kvm包里面。KSM默认在Red Hat Enterprise Linux 6下

是关闭的。当使用Red Hat Enterprise Linux 6作为一个KVM主机时,然而,它

很有可能被开启由ksm/ksmtuned服务。

当ksm服务没有启动,KSM共享只有2000个页面。这个默认值是低的并且提供

有效的内存节省效益。

当ksm服务器启动,KSM将共享到主机系统的主内存一半。启动ksm服务来开

启KSM共享更多内存。

# service ksm start

Starting ksm: [ OK ]

ksm服务可以被添加到默认启动顺序。使用chkconfig命令让ksm服务持久。

# chkconfig ksm on

KSM调试服务

ksmtuned服务没有任何选项。ksmtuned服务循环并且调整ksm。当一个来宾被创建或销毁,libvirt将通知ksmtuned服务。

# service ksmtuned start

Starting ksmtuned: [ OK ]

ksmtuned服务可以被返回参数调试。返回参数指示ksmtuned手动运行调试功能。

/etc/ksmtuned.conf文件是ksmtuned服务的配置文件。默认的ksmtuned.conf如下文件。

# Configuration file for ksmtuned.

# How long ksmtuned should sleep between tuning adjustments

# KSM_MONITOR_INTERVAL=60

# Millisecond sleep between ksm scans for 16Gb server.

# Smaller servers sleep more, bigger sleep less.

# KSM_SLEEP_MSEC=10

# KSM_NPAGES_BOOST=300

# KSM_NPAGES_DECAY=-50

# KSM_NPAGES_MIN=64

# KSM_NPAGES_MAX=1250

# KSM_THRES_COEF=20

# KSM_THRES_CONST=2048

# uncomment the following to enable ksmtuned debug information

# LOGFILE=/var/log/ksmtuned

# DEBUG = 1

配置文件中最重要的参数是KSM_SLEEP_MSEC。Fedora 16使用的默认值是大型服务器的设置值。当在主机上运行较少的虚拟机,使用KSM时最好让主机休眠更长的时间。例如,尝试设置KSM_SLEEP_MSEC=50,然后测试对虚拟机的影响。

KSM变量和监视

KSM存储监视数据在/sys/kernel/mm/ksm/目录。在这个目录的文件被内核更新并且精确记录KSM的使用和统计。

以下变量同样是/etc/ksmtuned.conf文件里的配置变量。

/sys/kernel/mm/ksm文件

full_scans

全扫描运行。

pages_shared

总的共享页面

pages_sharing

目前共享的页面

pages_to_scan

页面没有扫描

pages_unshared

页面不再共享。

pages_volatile

Volatile页面的数目

run

KSM进程是否运行。

sleep_millisecs

睡眠多少毫秒

如果DEBUG=1被添加到/etc/ksmtuned.conf文件里,KSM调试活动被存储在/var/log/ksmtuned日志文件。日志文件的位置可以被改变通过LOGFILE参数。改变日志文件的位置是不建议的,而且可能需要在SELinux设置中特定配置。

关闭KSM

KSM在某些环境或主机系统中可能性能开销太大。如果目标是运行尽可能多的虚拟机,而且性能不是问题,应该保持KSM处于运行状态。例如KSM允许运行30个虚拟机的主机上运行40个虚拟机,这意味着最大化硬件使用效率。但是,如果服务器在运行相对较少的虚拟机并且性能是个问题时,那么应该关闭KSM。

对任何系统来说,最佳选择将取决于创建虚拟环境时的内存估算。如果在虚拟主机中有足够的物理内存,在没有开启KSM时就能够满足虚拟机的内存需求,那么最好关闭KSM。

KSM可以通过停止ksm服务和ksmtuned服务来关闭。关闭服务停止KSM但是在重启后不会持久。

# service ksm stop

Stopping ksm: [ OK ]

# service ksmtuned stop

Stopping ksmtuned: [ OK ]

永久停止KSM通过chkconfig命令。关闭这两个服务通过运行下面命令:

# chkconfig ksm off

# chkconfig ksmtuned off

重要:确保swap大小是足够的对于承诺的RAM甚至是KSM。KSM减少RAM相同的利用或相似的来宾。超量使用来宾和KSM特性没有足够的swap空间可能但是这是不建议的,因为来宾内存使用可以导致页面变的独享。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值