举个栗子

好读书,不求甚解

ksmd 占用太多 CPU 资源

Kevalin's Avatar 2023-02-22

在一台 Centos 7.5 服务上运行了4台kvm, 发现ksmd的CPU占用时间最大, 占用比一直处于30%-50%左右

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@dlz-192-168-1-82 data]# top
top - 11:18:08 up 4 days, 14:51, 1 user, load average: 1.52, 1.51, 1.50
Tasks: 150 total, 2 running, 148 sleeping, 0 stopped, 0 zombie
%Cpu(s): 1.4 us, 12.4 sy, 0.0 ni, 86.1 id, 0.1 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 16094264 total, 395088 free, 12852328 used, 2846848 buff/cache
KiB Swap: 8388604 total, 8368792 free, 19812 used. 2900168 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
46 root 25 5 0 0 0 R 50.3 0.0 412:40.75 ksmd
1844 qemu 20 0 5027028 4.0g 3416 S 6.0 26.1 205:22.28 qemu-kvm
1811 qemu 20 0 5028052 4.0g 3396 S 2.0 26.0 128:51.29 qemu-kvm
1888 qemu 20 0 5034204 4.1g 3456 S 0.7 27.0 44:57.39 qemu-kvm
12608 qemu 20 0 5033176 3.7g 3392 S 0.7 24.0 33:18.73 qemu-kvm

ksm是基于内核的虚拟机KVM用来自调优的, 通过调整一些参数使KVM主机获得更好的性能. 通过使用kms, 可以使虚拟机获得更多的内存启动, 简而言之, 可以超过宿主机内存限制, 过度分配内存. 但使用ksm会带来性能损失, 一般情况会损失10%.

在RHEL 6+(Centos 6+)和Fedora 16+中, ksm默认打开. ksm通过ksmd和ksmtuned两个服务实现.

是否要使用ksm

  • 如果系统资源很充裕, 建议关闭
  • 如果系统资源很紧张, 建议开启

关闭ksm

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

调优ksm

/etc/ksmtuned.conf是ksm的配置文件, 我们可以适当的进行一些参数调整, 重启服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# Configuration file for ksmtuned.

# How long ksmtuned should sleep between tuning adjustments
# KSM_MONITOR_INTERVAL=60
KSM_MONITOR_INTERVAL=480

# Millisecond sleep between ksm scans for 16Gb server.
# Smaller servers sleep more, bigger sleep less.
# KSM_SLEEP_MSEC=10
KSM_SLEEP_MSEC=50

# KSM_NPAGES_BOOST=300
# KSM_NPAGES_DECAY=-50
# KSM_NPAGES_MIN=64
# KSM_NPAGES_MAX=1250
KSM_NPAGES_MAX=256

# KSM_THRES_COEF=20
# KSM_THRES_CONST=2048
KSM_THRES_CONST=1024

# uncomment the following if you want ksmtuned debug info

# LOGFILE=/var/log/ksmtuned
# DEBUG=1
  • 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 取消注释才生效,建议使用默认值

本文作者 : Kevalin
本文使用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议
本文链接 : https://kevalin.github.io/2023/02/22/ksmd-%E5%8D%A0%E7%94%A8%E5%A4%AA%E5%A4%9A-CPU-%E8%B5%84%E6%BA%90/