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