最近发现使用气球内存 虚拟机突发情况需要大量内存 然后内存释放后 在宿主机上并不会释放
于是找到了一个办法手动释放内存。
操作都是在宿主机上操作:
首先查询占用的机器:
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"}'