xChar
·a month ago

最近发现使用气球内存 虚拟机突发情况需要大量内存 然后内存释放后 在宿主机上并不会释放

于是找到了一个办法手动释放内存。

教程

操作都是在宿主机上操作:

首先查询占用的机器:

cat /proc/2666006/cgroup

把2666006替换成对应的pid,可以得出类似一下的信息:

[root@localhost ~]# cat /proc/2666006/cgroup
12:cpuset:/machine.slice/machine-qemu\x2d233\x2dkvm669.scope/libvirt/emulator
11:memory:/machine.slice/machine-qemu\x2d233\x2dkvm669.scope/libvirt
10:perf_event:/machine.slice/machine-qemu\x2d233\x2dkvm669.scope/libvirt
9:devices:/machine.slice/machine-qemu\x2d233\x2dkvm669.scope/libvirt
8:pids:/machine.slice/machine-qemu\x2d233\x2dkvm669.scope
7:blkio:/machine.slice/machine-qemu\x2d233\x2dkvm669.scope/libvirt
6:freezer:/machine.slice/machine-qemu\x2d233\x2dkvm669.scope/libvirt
5:cpu,cpuacct:/machine.slice/machine-qemu\x2d233\x2dkvm669.scope/libvirt/emulator
4:rdma:/
3:hugetlb:/
2:net_cls,net_prio:/machine.slice/machine-qemu\x2d233\x2dkvm669.scope/libvirt
1:name=systemd:/machine.slice/machine-qemu\x2d233\x2dkvm669.scope
[root@localhost ~]# 

这里需要操作的机器是kvm669,首先查询目前机器实际占用多少。

执行:

# 先将虚拟机当前可用内存限制为实际使用值(如 6G)
virsh setmem kvm669 6G --current

# 等待 10-20 秒,让气球驱动生效

# 再恢复到原来的最大内存(如 20G,根据实际配置调整)
virsh setmem kvm669 20G --current

这会触发气球驱动 “放气”,将虚拟机内未使用的内存推回宿主机。

查询是否成功:

# 查找虚拟机的pid
pgrep -f "qemu.*kvm669"

# 2666006替换成实际的pid 查询内存占用
ps -p 2666006 -o rss --no-headers | awk '{print $1/1024/1024 " GB"}'
Loading comments...