|
|
51CTO旗下网站
|
|
移动端

玩转KVM:聊聊KSM内存合并

共享内存的概念在现代操作系统中很常用了,比如,一个程序启动时会与父进程共用它的全部内存。

作者:佚名来源:知乎|2019-07-11 15:43

【大咖·来了 第7期】10月24日晚8点观看《智能导购对话机器人实践》

KVM的KSM技术介绍

共享内存的概念在现代操作系统中很常用了,比如,一个程序启动时会与父进程共用它的全部内存。但子或父进程需要修改共享内存的时候,linux便再分配新内存,然后copy原区域内容到新内存。这个过程就叫copy on write。

而KSM是linux的新属性,它做的东西刚好与共享内存相反。 当linux启用了KSM之后,KSM会检查多个运行中的进程,并比对它们的内存。如果任何区域或者分页是一样的,KSM就会毫不犹豫地合并他们成一个分页。 那么新分页也是被标记成copy on write。如果VM要修改内存的话,那么linux就会分配新的内存给这个VM。

KSM技术应用场景

了解了KSM技术后,觉得KSM可以在KVM大有作为哦。

优点:

a. 一个VM启动,则只继承了父进程(qemu-kvm)的内存。一台VM的内存,可以让相同操作系统或者运行相同应用的VM共享。

b. 当开启了KSM,常用的进程数据存在缓存和主内存中。这样可以减少VM的缓存未***,同时也提高了VM性能。

c. 共享内存降低了VM的总体内存使用率,从而允许更高的密度和更大的资源利用率。

当然每种技术都有局限性的,不同场景下,它的缺点也暴露无疑。

a. 利用KSM使内存超用。这会导致消耗一定的计算资源用于内存扫描,加重了CPU的消耗。内存超用,使得频繁地使用swap交互,导致VM性能下降。

b. KSM使用了边通道(side channels),可能存在泄露客户信息的潜在风险。为此就要考虑在VM上关闭KSM。

所以总结一下应用的场景:

a. 生产环境慎用,应急时可开启。

b. 测试环境建议使用。

c. 桌面虚拟化环境建议使用,但要注意内存使用情况。

KSM技术实践

Linux的2.6.32 内核中新增了 KSM(Kernel Samepage Merging),在CentOS 6和Fedora 16中,KSM默认是打开的。而debian和ubuntu默认是没有这个服务的。 KSM通过两个服务:ksmd和ksmtuned实现,管理员应该判断他们的环境并决定保持KSM处于运行状态还是关闭它。

1. 对centos6系统来说,在没有开启KSM时就能够满足虚拟机的内存需求,那么***关闭KSM。关闭的方法如下:

  1. chkconfig ksmd off 
  2. chkconfig ksmtuned off 
  3. service ksmd off 
  4. service ksmtuned off 

2. 而ubuntu默认没有KSM服务, 如果需要使用则安装ksmtuned服务

  1. sudo apt-get install ksmtuned 
  2. service ksmtuned start 

3. 查看KSM运行情况

在/sys/kernel/mm/ksm目录下,

pages_to_scan: ksmd睡眠前需要扫描多少分页(默认是100)。

sleep_millisecs :文件定义执行另一次页面扫描前 ksmd 休眠的毫秒数。

max_kernel_pages :文件定义 ksmd 可以使用的***页面数(默认值是可用内存的 25%,但可以写入一个 0 来指定为***)。

pages_to_scan :文件定义一次给定扫描中可以扫描的页面数。任何用户都可以查看。这些文件,但是用户必须拥有根权限才能修改它们。

full_scans :文件表明已经执行的全区域扫描的次数。

pages_shared:KSM 正在使用的不可交换的内核页面的数量。

pages_sharing:一个内存存储指示。 多少节点被共享并且多少被保存。

pages_unshared:为合并而重复检查的惟一页面的数量。

pages_volatile:频繁改变的页面的数量。

max_page_sharing: 每个分页能运行共享的次数。

merge_across_nodes: 是否指定多个numa节点的内存进行合并。

run :设置ksm属性的状态。

use_zero_pages : 是否合并空白分页,默认关闭。

4. KSM设置

即然上面对KSM的作用进行了了解,那么如何在使用KSM时进行调优呢?

KSM的参数可以在/etc/ksmtuned.conf文件中调整。其默认参数如下:

以下是对于该参数的具体解释:

KSM_MONITOR_INTERVAL表示ksm每次内存扫描的时间;

KSM_SLEEP_MSEC表示每次扫描休息的间隔时间(最小值为10),KSM扫描会占用一些CPU的开销,所以当KVM虚拟机数量或者应用软件较少时可以调整KSM_SLEEP_MSEC至一个较大的值,反之则设置较小的值;同时当Hypervisor里面的虚拟机的内存调优到达一个稳定状态,也可以根据情况把这个参数调小节省CPU的开销;

KSM_THRES_COEF表示临界值系数;

KSM_THRES_CONST表示临界值常量;

KSM_NPAGES_BOOST表示内存页合并增加数量;

KSM_NPAGES_DECAY表示内存页合并减少数量;

KSM_NPAGES_MIN表示内存页合并最小值;

KSM_NPAGES_MAX表示内存页合并***值;

LOGFILE表示ksmtuned的日志存放路径,建议使用默认路径;

DEBUG取消注释才生效,建议使用默认值。

5. 对vm的设置

在kvm环境中,可以选择VM是否允许内存合并。

为了保护客户的信息不泄露,一般我们还是会关闭KSM。步骤很简单,修改VM的xml:

  1. <memoryBacking> 
  2. <nosharepages/> 
  3. </memoryBacking> 

【编辑推荐】

  1. 浅谈虚拟机内存区
  2. 分布式系统Kafka和ES中,JVM内存越大越好吗?
  3. 云计算之基,一文带你速懂虚拟化KVM和XEN
  4. JVM 与 Linux 的内存关系详解
  5. KVM虚拟化使用详解
【责任编辑:武晓燕 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

订阅专栏+更多

16招轻松掌握PPT技巧

16招轻松掌握PPT技巧

GET职场加薪技能
共16章 | 晒书包

333人订阅学习

20个局域网建设改造案例

20个局域网建设改造案例

网络搭建技巧
共20章 | 捷哥CCIE

652人订阅学习

WOT2019全球人工智能技术峰会

WOT2019全球人工智能技术峰会

通用技术、应用领域、企业赋能三大章节,13大技术专场,60+国内外一线人工智能精英大咖站台,分享人工智能的平台工具、算法模型、语音视觉等技术主题,助力人工智能落地。
共50章 | WOT峰会

0人订阅学习

读 书 +更多

精通JavaScript动态网页编程(实例版)

本书通过大量实例代码,以ECMA-262版本3为基础,结合JavaScript 1.5和JavaScript 5.5,由浅入深、循序渐进地介绍了JavaScript知识要点与编...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊

51CTO服务号

51CTO播客