
如果已使用kvm_intel模块,则需要使用“ rmmod kvm_intel”命令删除kvm_intel模块并重新加载它,然后检查参数“ / sys / module / kvm_intel / parameters / nested”是否为“ Y“”. AMD平台上的kvm-amd模块的操作完全相同.
2)启动L1客户端时,向qemu-kvm命令中添加“ -cpu host”或“ -cpu qemu64,+ vmx”选项,以向L1客户端公开CPU的硬件虚拟化扩展,如下所示:
此处的“ -cpu host”参数的作用是尽可能向L1客户端公开主机L0的CPU特性,“-cpu qemu64,+ vmx”基于qemu64的CPU模型,然后添加Intel VMX功能(即CPU的VT-x支持). 当然,可以基于其他CPU模型添加VMX功能,例如“ -cpuSandyBridgekvm虚拟化技术实战与原理解析 pdf,+ vmx”,“-cpu Westmere,+ vmx”. 在AMD平台上,您需要相应的CPU模型(“ qemu64”是常见的),以及AMD-V功能,例如“ -cpu qemu64,+ svm”.
3)在L1客户端中,检查CPU的虚拟化支持,然后加载kvm和kvm_intel模块以启动L2客户端,如下所示:
如果L0没有为L1提供硬件虚拟化CPU环境,则在加载kvm_intel模块时将出现错误,并且kvm_intel模块将无法加载. 在L1中启动客户端与在普通KVM环境中完全相同. 但是kvm虚拟化技术实战与原理解析 pdf,L1系统的内核要求并不高. 通常,您可以选择更新的Linux内核. 例如,我选择了RHEL 6.3系统随附的内核和Linux 3.5内核. 这都是可能的.
4)检查L2客户端是否正常运行. 图5-22显示了“ KVM嵌套KVM”的虚拟化操作环境. L0启动L1,然后L2系统在L1启动.
图5-22 KVM嵌套示例KVM L0,L1,L2
由于KVM是完全虚拟化的Hypervisor,对于嵌套在KVM上运行的其他L1 Hypervisor(例如Xen),在L1中启动L2客户端的操作与普通Hypervisor中的操作过程完全相同. 因为KVM为L1提供了具有硬件辅助虚拟化功能的透明硬件环境.
5.6KSM技术
5.6.1KSM基本原理
共享内存是现代操作系统中的常用概念. 例如,在Linux系统中,当使用fork函数创建进程时,子进程与其父进程共享所有内存,而当子进程或父进程尝试修改其共享内存区域时,内核将分配一个新的内存区域,然后将要修改的共享内存区域复制到新的内存区域,然后让进程修改复制的内存. 这是著名的“写时复制”(COW)技术. 本节介绍的KSM技术在某种程度上与这种内存共享概念相反.
KSM是“内核SamePage合并”的缩写,中文可以称为“内核同一页合并”. KSM允许内核在两个或多个进程(包括虚拟来宾)之间共享相同的内存页面. KSM使内核扫描以检查正在运行的程序并比较它们的内存. 如果他们发现它们具有相同的内存区域或内存页面,则将多个相同的内存合并到一个内存页面中,并将其标记为“写入时复制”. 这可以在节省系统内存使用量方面发挥作用. 然后,如果某个进程试图修改标记为“写时复制”的合并内存页面,则将复制一个新的内存页面供该进程使用.

在QEMU / KVM中,虚拟客户机是QEMU进程,因此使用KSM还可以在多个客户机之间实现相同的内存合并. 此外,如果同一主机上的多个客户端运行相同的操作系统或应用程序,则客户端之间的相同内存页面的数量可能会相对较大,在这种情况下,KSM的作用将更为显着. KSM在KVM环境中使用. KSM还允许KVM请求可以共享和合并哪些相同的内存页面,因此KSM将仅识别和合并那些不会干扰客户端操作并且不会影响主机或客户端安全性的页面. 内存页. 可以看出,在KVM虚拟化环境中,KSM可以提高内存的速度和效率,这可以从以下两个方面理解.
1)在KSM的帮助下,合并了相同的内存页面以减少客户端的内存使用量. 一方面,内存中的内容更容易保存在CPU缓存中;另一方面,还有更多的内存可用于在某些磁盘上缓存数据. 因此,内存缓存命中率(CPU缓存命中率)和磁盘数据缓存命中率(命中内存中磁盘数据缓存命中率)都会增加,从而提高了KVM guest虚拟机中操作系统或应用程序的运行速度.
2)如第4.3.4节“使用内存过载”所述,KSM是使用内存过载的更好方法. KSM可以减少每个客户端实际占用的内存量,以便多个客户端分配的内存总和可以大于物理内存. 对于使用相同内存量的客户端,当物理内存量保持不变时,可以在一台主机上创建更多客户端,这将增加虚拟化客户端部署的密度并提高物理资源利用效率.
KSM已添加到Linux内核2.6.32中的内核主干代码. 当前,大多数流行的Linux发型已将KSM的支持编译到内核中. 内核配置文件具有“ CONFIG_KSM = y”. Linux系统的内核进程ksmd负责在扫描后合并进程的相同内存页,以实现KSM功能. root用户可以通过“ / sys / kernel / mm / ksm /”目录中的文件来配置和监视ksmd守护程序. KSM将仅扫描并尝试合并要合并的应用程序建议的那些内存页面. 应用程序(例如qemu-kvm)通过调用madvise系统调用来告知内核可以合并哪些页面. 当前,较新的qemu-kvm支持KSM. 您还可以通过在其代码中查看madvise函数的调用来确定是否支持KSM. 简要分析了qemu-kvm中的关键功能:
KSM最初是为在KVM虚拟化中使用而开发的,但对于非虚拟化系统仍然非常有用. KSM可以有效地减少KVM虚拟化环境中的内存使用量. 根据我在网上看到的信息,借助KSM,一些人在具有16GB物理内存的计算机上使用KVM成功运行了52个计算机. 具有1GB内存的Windows XP客户端. 由于KSM在KVM主机中对内存使用具有更高的效率和性能改进,因此通常建议启用KSM功能. 但是,“金是不够的,没有人是完美的”,KSM必须具有一个或多个进程来检测并找出哪些内存页是相同的并且可以用于合并,并且需要找到那些不会被更新的内存页通常,这样的页面最适合合并. 因此,KSM减少了内存使用量,但是CPU使用量将在一定程度上增加,并且还可能导致隐藏的性能问题. 为了达到更好的平衡,有必要在实际使用环境中配置KSM的使用.
KSM通过合并内存节省的内存量与客户机操作系统的类型以及在其上运行的应用程序有关. 如果主机上的客户机操作系统相同,并且主机上运行的应用程序相似,则节省内存的效果将非常显着,甚至可以节省50%以上的内存. 相反,如果客户机操作系统不同,并且正在运行的应用程序也非常不同,则KSM无法有效节省内存,甚至可能无法达到5%.
此外,使用KSM实现内存过载时,最好确保系统的交换空间足够大. 因为KSM合并了不同客户端的相同内存页面以减少内存使用量,但是客户端可能需要修改由KSM合并的内存页面,以便将这些修改后的内存再次复制出以占用内存空间,因此可能如果系统内存不足,则需要足够的交换空间以确保系统正常运行.
5.6.2 KSM操作实践内核的KSM守护程序是ksmd,用于配置和监视ksmd的文件位于“ / sys / kernel / mm / ksm /”目录中. 您可以通过以下命令行查看此目录中的多个文件:
其中一些文件对于理解KSM的实际工作状态非常重要. 这是每个文件的角色的简要介绍.
full_scans: 记录已扫描所有可合并内存区域的次数. pages_shared: 记录正在使用的共享内存页数. pages_sharing: 记录正在使用正在共享的共享页面的存储页面数量,不包括合并的存储页面本身. 这是实际保存的内存页数.
pages_unshared: 记录了守护程序检查并尝试合并的内存页面数,但是没有发现重复的内容并且无法合并.
pages_volatile: 记录由于内容易于更改而未合并的内存页面.

pages_to_scan: ksmd进程休眠之前将扫描的内存页面数.
sleep_millisecs: ksmd进程休眠的时间(单位: 毫秒),两次ksmd运行之间的间隔.
run: 控制ksmd进程是否正在运行的参数. 默认值为0. 要激活KSM,必须将其值设置为1(除非内核禁用sysfs功能). 设置为0可停止运行ksmd,但保留已合并的内存页;设置为1可立即运行ksmd进程;设置为2可以停止运行ksmd并分离所有合并的内存页面,但保持注册为可用状态. 合并的内存区域用于下一次运行.
从这些sysfs中与ksm相关的文件中可以看到,root用户仅可读写pages_to_scan,sleep_millisecs和run,其余五个文件是只读的. 您可以将自定义值写入三个文件page_to_scan,sleep_millisecs并运行以控制ksmd的操作. 例如,“ echo 1200> / sys / kernel / mm / ksm / pages_to_scan”用于调整每次扫描的内存页数,而“ echo 10> / sys / kernel / mm / ksm / sleep_millisecs”用于设置ksmd运行两次. 时间间隔“ echo 1> / sys / kernel / mm / ksm / run”用于激活ksmd的操作.
pages_sharing的值越大,KSM保存的内存越多,KSM效果越好. 以下命令计算已保存的内存量.
通过将pages_sharing除以pages_shared所获得的值越大,重复相同的内存页面的次数越多,KSM效率越高. 通过将pages_unshared除以pages_sharing所获得的值越大,表示ksmd扫描无法合并的内存页面越多,KSM的效率越低. 可能有多种因素影响pages_volatile的值,但是page_voliatile的值较高表示应用程序可能会过多使用madvise(addr,length,MADV_MERGEABLE)系统调用以将其内存标记为KSM可合并
通过“ / sys / kernel / mm / ksm / run”修改KSM的设置后,系统默认不会修改其值,这可能无法更好地利用后续系统条件,或者经常需要手动动态调整比较麻烦. Redhat系列系统(例如RHEL 6.3)提供了ksm和ksmtuned两项服务,以动态调整KSM的操作. RPM 6.3安装软件包qemu-kvm中包含RHEL 6.3中的ksm和ksmtuned这两个服务. 在RHEL 6.3上,如果不运行ksm服务程序,则默认情况下,KSM仅共享2000个内存页面,通常很难获得良好的结果. 启动ksm服务后,KSM可以共享最多系统物理内存一半的内存页面. ksmtuned服务保持周期性运行,以调整ksm服务的操作. 它的配置文件在/etc/ksmtuned.conf中. 配置文件的默认内容如下:
以下内容演示了KSM在节省内存方面的实际效果. 在具有4GB物理内存的系统上,具有Linux 3.5内核的RHEL 6.3系统被用作主机,并且ksm和ksmtuned服务在一开始就被挂起. “ / sys / kernel / mm / ksm / run”的默认值为0,KSM无效,然后启动4个Windows 7客户端,每个客户端具有1GB的内存(未安装virtio-balloon驱动程序,不保存任何内存)气球),启动ksm和ksmtuned服务,并在10分钟后检查系统内存使用情况,以确定KSM的效果. 实现此功能的示例脚本(ksm-test.sh)如下:
执行脚本,命令行输出如下:
在上面的输出中,可以看到在ksm和ksmtuned服务开始运行之前和之后,“ free-m”命令的“-/ + buffers / cache: ”行的输出值: KSM,系统可用内存已从126 MB增加到1101MB,并且已获得近1GB的可用内存. 此时,请在“ / sys / kernel / mm / ksm /”目录中检查KSM的状态,如下所示:
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-214106-1.html
不喜欢舒淇
好好
又不是啥大事
因为此举把困扰欧洲的令其焦头烂额的叙利亚难民的安置问题
击不击沉是决策者的事