如需更好的阅读模式,可点击这里前往我的博客

KSM内存去重技术可以查看这篇文章 (33 封私信 / 88 条消息) 一篇搞懂KSM机制剖析 — Linux内核中的内存去耦合 - 知乎
总之他在虚拟化场景具有非常高的利用价值,可以说是完全给虚拟化场景量身打造的,尤其是多个VM运行同一OS的时候内存几乎能实现只占用一个虚拟机的多一点。
唯一缺点就是会有CPU开销,由于需要经常扫描内存,所以开启这项技术你的CPU利用率可能不会一直是0%,内存越大开销就越大。
由于是合并内存也必须是相同的内存也所以只有通过克隆尤其是链式克隆的虚拟机有非常大的合并率和效果,亲测如果通过链式克隆的虚拟机可以实现12G虚拟机内存合并到只有2G占用,非常的离谱!非常的夸张!非常的好用!效果如下。
链式克隆虚拟机,实现一秒开十台,每台虚拟机占用不到100MB!
未开启之前

开启之后(激进)

开启方法(临时)
启动 KSM
echo 1 > /sys/kernel/mm/ksm/run
配置去重参数(经过我亲自测试的)
bash -c '
echo 500 > /sys/kernel/mm/ksm/pages_to_scan
echo 50 > /sys/kernel/mm/ksm/sleep_millisecs
echo 1 > /sys/kernel/mm/ksm/merge_across_nodes
echo 1 > /sys/kernel/mm/ksm/use_zero_pages
echo 0 > /sys/kernel/mm/ksm/smart_scan
'
echo 500 > /sys/kernel/mm/ksm/pages_to_scan # ✔ 扫描强度
echo 50 > /sys/kernel/mm/ksm/sleep_millisecs # ✔ 扫描间隔
echo 1 > /sys/kernel/mm/ksm/merge_across_nodes # ✔ 开启跨NUMA
echo 1 > /sys/kernel/mm/ksm/use_zero_pages # ✔ 开启 zero page
echo 1 > /sys/kernel/mm/ksm/smart_scan # ✔ 开启 smart_scan
其中尤其是smart_scan参数 关闭后可以跳过之前没命中的页效果非常明显
如果发现内存始终还是没有降低那么就再输入下面命令
echo 2000 > /sys/kernel/mm/ksm/pages_to_scan
echo 10 > /sys/kernel/mm/ksm/sleep_millisecs
echo 0 > /sys/kernel/mm/ksm/smart_scan
这个参数更加的激进,一般10-30秒就能立竿见影。

开启方法(永久)
设置启动脚本
cat > /usr/local/bin/ksm-tune.sh <<'EOF'
#!/bin/bash
set -e
# 先停再调(避免卡住)
echo 0 > /sys/kernel/mm/ksm/run
echo 2000 > /sys/kernel/mm/ksm/pages_to_scan
echo 10 > /sys/kernel/mm/ksm/sleep_millisecs
echo 1 > /sys/kernel/mm/ksm/merge_across_nodes
echo 1 > /sys/kernel/mm/ksm/use_zero_pages
echo 0 > /sys/kernel/mm/ksm/smart_scan
# 最后开启
echo 1 > /sys/kernel/mm/ksm/run
EOF
chmod +x /usr/local/bin/ksm-tune.sh
设置开机启动服务
cat > /etc/systemd/system/ksm-tune.service <<'EOF'
[Unit]
Description=KSM Aggressive Tune
After=local-fs.target
ConditionPathExists=/sys/kernel/mm/ksm/run
[Service]
Type=oneshot
ExecStart=/usr/local/bin/ksm-tune.sh
RemainAfterExit=yes
TimeoutStartSec=10
[Install]
WantedBy=default.target
EOF
启动服务
systemctl daemon-reload
systemctl enable ksm-tune
systemctl start ksm-tune --no-block
这样每次飞牛重启开机立即开启虚拟机后10秒左右内存就开始大幅度下降 超级爽!