当前位置:主页 > 网站优化 >

基于KSM的内存优化方法分析

来源:网络整理 发布时间:2017-10-11 阅读:

 

  云计算技术对传统的IT结构实现逻辑的统一与整合,对现代信息技术以及互联网的发展有至关重要的作用。云计算技术将IT资源集中化管理,提高了IT资源的利用率。云计算中最主要的硬件资源包括CPU,内存,存储,网络。硬件资源的利用率是衡量一个云产品解决方案的重要指标。本文中介绍的KSM内存调优方法,可以把基于KVM的Hypervisor的内存利用率提高30% ~ 50%,CPU的开销大概只有3~5%。

  本文首先从操作系统内核的角度分析了KSM工作的基本原理;然后介绍了KSM内存调优的具体步骤;同时为了更好地了解调优参数,对ksmtuned的工作方法,如何查看KSM内存优化状态以及使用KSM应注意的事项做了相关的介绍。

   KSM内存优化原理

 

  内存共享在现代操作系统中是一个很常见的用法。比如一个进程第一次启动的时候,它会首先与父进程共享所有内存。当该子进程或者其父进程需要修改这片内存区域的时候,操作系统内核会分配另外一段内存区域,需要修改内存的进程就在新分配的内存中修改。这个就是“copy on write”模式。

  KSM(Kernel Shard Memory)的作用正好与以上过程相反,KSM使用操作系统内核检查不同进程是否有相同的内存页或者区域;如果有相同的,就把不同进程的相同内存页合并成同一个;同时把这一个页面标记成“copy on write”。如果是一个KVM虚拟机要修改一个被标记成”copy on write”的页面,新的内存也会分配给这个虚拟机。

  KSM设计的初衷就是针对KVM的虚拟化场景。一个KVM虚拟机其实就是操作系统里面qemu-kvm进程的一个子进程。当一个KVM虚拟机启动后,它首先只继承父进程 qemu-kvm的内存。当KVM虚拟机正在运行时,它内存中的内容可以被其他相同操作系统以及运行相同软件应用的KVM虚拟机共享。 如果一个Hypervisor里面都是不通操作系统的KVM虚拟机,或者在一个Linux系统中部署着完全不通的应用,相同的内存页会少很多,KSM的优化效率也会相应地减少。实际上KSM更适用于在同一Hypervisor中部署相同软件应用的场景,相同的软件应用可以互相共享相同页面的内存。

  2. KSM 内存调优具体步骤

  KSM 由redhat公司开发,首次在linux内核2.6.32版本发布。在RedHat 6.5以后, KSM机制可以对NUMA进行相关配置。KSM是包含在qemu-kvm软件包之中,默认为未启动状态。KSM配置步骤如下:

  启动ksm服务:

 

  使KSM在操作系统中默认启动

 

  启动ksmtuned 服务

 

  对于ksmtuned 服务,可以通过配置文件/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取消注释才生效,建议使用默认值;

  3. ksmtuned的工作方法

 

  ksm先取得到宿主机的总内存“total”;

  然后根据KSM_THRES_COEF和KSM_THRES_CONST计算出一个临界值“thres”,这个值等于total * KSM_THRES_COEF / 100。然后与临界值常量KSM_THRES_CONST进行比较,如果thres 小于 KSM_THRES_CONST,那么thres就 等于 KSM_THRES_CONST;

  计算qemu进程使用的内存总和:committed;

  当且仅当committed + thres > total时,才开始操作内存页合并。所以调整临界值常量与临界值系数可以确定临界值thres, 从而有效地调整ksm工作方式。

  KSM每次合并的内存页数量计算方式:判断剩余内存量free与thres的大小,如果free < thres,ksm每次扫描后内存页合并数会增加 KSM_NPAGES_BOOST,该参数上限为KSM_NPAGES_MAX;反之如果free>thres内存页合并数量会 减少 KSM_NPAGES_DECAY,下限为KSM_NPAGES_MIN。

  4. 查看KSM内存优化状态

  可以通过sys/kernel/mm/ksm 文件查看 KSM内存优化状态。该文件夹包括以下参数:

  pages_shared合并的页面数

  pages_sharing 正在共享单个页面的虚拟页面数

  pages_unshared作为共享候选者但当前未共享的页数

  pages_volatile作为共享候选者但频繁更改的页数,ksm服务不会合并这些页面。

  full_scan为重复内容扫描KSM的次数

  merge_across_nodes是否允许在NUMA节点中执行合并

  pages_to_scan一次扫描的页数,该数字会影响系统性能

  sleep_milisecs扫描之间的时间间隔

  5. 使用KSM应注意的事项

  1、在系统中如果CPU是整个宿主机的资源瓶颈则不建议使用KSM,因为KSM会带来相应的CPU开销;

  2、 建议在使用KSM的时候,不要跨NUMA节点进行内存页的合并。跨NUMA节点合并内存页会降低系统的性能。可以通过以下配置文件”/sys/kernel/mm/ksm/merge_across_nodes” 禁止跨NUMA节点合并内存页面;

  3、 在KVM虚拟化环境中使用KSM,会给虚拟机带来安全方面的风险;

  4、 建议开启KSM的同时不要使用memory balloon,两种内存优化方案会降低系统的性能;