天天看点

KVM性能优化之内存KSM

1、KSM简介

KSM允许内核在多个进程(包括虚拟机)之间共享完全相同的内存页,KSM让内核扫描检查正在运行中的程序并且比较他们的内存,若发现相同的内存页,就将相同的内存页合并成单一的内存页,标识为“写时复制”。

如果有进程试图去修改被标识为“写时复制”的合并的内存页时,就为该进程开辟出一个新的内存页供其使用。

2、KSM提高内存的速度和使用效率

(1)相同的内存页被合并,减少了虚拟机的内存使用量,内存中的内容更容易被保存到CPU的缓存中。

(2)通过减少每个虚拟机实际占用的内存数量,让多个虚拟机占用的总内存之和大于物理内存,实现“内存过载”

3、KSM劣势

(1)消耗一定的资源用于内存扫描,加重CPU的消耗。

(2)虚拟机由于修改被KSM合并的内存页,从而这些被修改的内存重新被复制出来占用内存空间,造成内存不足,从而使用swap分区。因此内存不足时,频繁使用swap交互,虚拟机性能下降。

---------------------

[root@opman ksm]# pwd

/sys/kernel/mm/ksm

cd  ksm/

[root@opman ksm]# ll

总用量 0

-r--r--r-- 1 root root 4096 10月 25 14:56 full_scans   //已经对所有可合并的内存区域扫描过的次数。

-rw-r--r-- 1 root root 4096 10月 25 14:56 max_page_sharing     //

-rw-r--r-- 1 root root 4096 10月 25 14:56 merge_across_nodes

-r--r--r-- 1 root root 4096 10月 25 14:56 pages_shared  //正在使用中的共享内存页数量

-r--r--r-- 1 root root 4096 10月 25 14:56 pages_sharing  //有多少内存页正在使用被合并的共享页,不包括合并内存页本身。这是实际节省的内存页数量。 

-rw-r--r-- 1 root root 4096 10月 25 14:56 pages_to_scan

-r--r--r-- 1 root root 4096 10月 25 14:56 pages_unshared   //无重复内容而不可以被合并的内存页数量

-r--r--r-- 1 root root 4096 10月 25 14:56 pages_volatile

-rw-r--r-- 1 root root 4096 10月 25 14:55 run

-rw-r--r-- 1 root root 4096 10月 25 14:56 sleep_millisecs

-r--r--r-- 1 root root 4096 10月 25 14:56 stable_node_chains

-rw-r--r-- 1 root root 4096 10月 25 14:56 stable_node_chains_prune_millisecs

-r--r--r-- 1 root root 4096 10月 25 14:56 stable_node_dups

[root@opman ksm]#

查看是否开启KSM,0表示没有开启,1表示开启

[root@opman ksm]# cat run

[root@opman ksm]# echo 1 >run    //临时开启ksm,只能使用重定向,vim 不行

[root@opman ksm]# cat  run     

1        //可以将echo 1 >/sys/kernel/mm/ksm/run 写在/etc/rc.local,保证开机自启

查看所依赖的两个服务的状态

[root@opman ksm]# service   status ksm

status: 未被识别的服务

[root@opman ksm]# service ksmtuned status

ksmtuned (pid  2935) 正在运行...

[root@opman ksm]# service ksmd status

ksmd: 未被识别的服务

所以我们开启两个服务,分别是ksmd、和ksmdtuned

[root@opman ksm]# service ksm start

正在启动 ksm:                                             [确定]

[root@opman ksm]# service ksmtuned start

正在启动 ksmtuned:

查看状态

[root@opman ksm]# service ksm status

ksm 正在运行

查看扫描的页面数,默认是100,

[root@opman ksm]# cat pages_to_scan

100

对内存的限制

为了避免某个虚拟机无节制地使用资源,导致其他虚拟机无法正常使用,这时候就需要对内存的使用做限制

[root@opman ksm]# virsh memtune centos-6.8-1(虚拟机的名字) ,内存大小的单位为KB

hard_limit     : 0  强制设置虚拟机最大使用内存,单位为KB

soft_limit     : 0 可用最大内存,单位为KB

swap_hard_limit: 0  虚拟机最多使用的内存加上swap的大小,单位为KB

可以使用 virsh list –all 查看虚拟机列表

[root@opman ksm]# virsh list --all

 Id    名称                         状态

----------------------------------------------------

 -     centos-6.8-1                   关闭

查看使用帮助

[root@opman ksm]# virsh memtune --help

  NAME

    memtune - Get or set memory parameters

  SYNOPSIS

    memtune <domain> [--hard-limit <number>] [--soft-limit <number>] [--swap-hard-limit <number>] [--min-guarantee <number>] [--config] [--live] [--current]

  DESCRIPTION

    Get or set the current memory parameters for a guest domain.

    To get the memory parameters use following command:

    virsh # memtune <domain>

  OPTIONS

    [--domain] <string>  域名,id 或 uuid

    --hard-limit <number>  Max memory, as scaled integer (default KiB)

    --soft-limit <number>  Memory during contention, as scaled integer (default KiB)

    --swap-hard-limit <number>  Max memory plus swap, as scaled integer (default KiB)

    --min-guarantee <number>  Min guaranteed memory, as scaled integer (default KiB)

    --config         affect next boot   写入配置文件中,虚拟机重启后生效

    --live           affect running domain 让设置立即生效,但是虚拟机重启后,效果消失

--current        affect current domain 只在当前生效

测试:

[root@opman ksm]# virsh memtune  centos-6.8-1  --hard-limit 1024000

 --live

查看是否生效

[root@opman ksm]# virsh memtune centos-6.8-1

hard_limit     : 1024000

继续阅读