目录
内存热插拔
扩展内存
<memory unit='KiB'>8388608</memory>
<currentMemory unit='KiB'>4194304</currentMemory>
需要在虚拟机xml中事先进行配置,memory为最大内存设置,currentMemory是虚拟机使用的内存大小。
# virsh setmem Domain_Name 8GiB
但,不能超过memory设置的值:
error: invalid argument: cannot set memory higher than max memory
在指定内存时的单位,需要区分GiB和GB,以此类推MiB、MB,KiB、KB。
Ki = 1024
K = 1000
比如指定8GB=8000MB=8,00,000KB,然而虚拟机使用的标准单位是KiB,所以会用8,000,000KB/1024*1000 = 7,812,500KiB。和我们要设置的8G内存比较大。
缩小内存
virsh setmem Domain_Name 2GiB
需要注意,查看被压缩内存的虚拟机当前使用的内存量,如果要压缩到used数值以下,会导致虚拟机出现短暂的卡顿,需要将内存交换到swap,此时将会严重降低业务运行性能。
如果降低到虚拟机运行操作系统所需最低内存,将会导致虚拟机宕机重启,并且会启动失败,一直到给予足够的内存。
设置最大内存
设置后 需要重启虚拟机才能生效。不能影响active domain:
error: Unable to change MaxMemorySize
error: Requested operation is not valid: cannot resize the maximum memory on an active domain
其实和使用virsh edit进行手动xml修改效果是一样的。
virsh setmaxmem Domain_Name 8GiB --config
--config affect next boot,写配置文件,下次重启生效
--live affect running domain,默认方式,影响正在运行的虚机,重启后失效
--current affect current domain,影响正在运行或停止的虚机,如果运行的虚机,重启后失效。
内存限制技术
virsh memtune <domain> [--hard-limit <number>] [--soft-limit <number>] [--swap-hard-limit <number>] [--min-guarantee <number>] [--config] [--live] [--current]
--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)
带swap的最大内存:虚拟机最多使用的内存加上swap的大小。此值必须大于提供的hard_limit值
--min-guarantee <number> Min guaranteed memory, as scaled integer (default KiB)
虚拟机最低保证内存。 最后一个参数虽然OPTIONS里有列出,但是实测是发现CentOS7.0 以上系统不能支持,执行的时候会报下面这样的错误(CentOS6然不会报这个错,但是这命令貌似也不会有实际效果):
virsh memtune Domain_Name --min-guarantee 2097152 --config
error: Unable to change memory parameters
error: argument unsupported: parameter 'min_guarantee' not supported
如果强制在xml中定义,在保存xml的时候就会报错:
error: unsupported configuration: Parameter 'min_guarantee' not supported by QEMU.
默认不做限制,可以通过下面的命令查看内存限制参数:
# virsh memtune Domain_Name
hard_limit : unlimited
soft_limit : unlimited
swap_hard_limit: unlimited
此外,为了提高虚拟机性能,我们应该减少虚拟机使用宿主机的swap。限制虚机对宿主机swap的使用可以通过edit xml来实现(其原理是将hard_limit设置的内存锁死在宿主机的内存页,并且主机将不允许交换它们。因此,恶意guest可能会被用来攻击宿主机,以至于宿主机内存耗尽,所以启动locked必须要使用hard_limit进行最大内存限制,以降低风险):
<memoryBacking><locked/></memoryBacking>
不建议用户进行该设置,除非宿主机足够大。不然很容易导致其他虚拟机被oom-killer 干掉:
2020-08-04 07:19:22.092+0000: shutting down, reason=crashed
# dmesg |grep oom-killer 可以看到oom-killer被调用日志。为了便于验证,可以事先将dmesg日志清空一下(dmesg -c)
但是启动虚机报错:
virsh start Domain_Name
error: Failed to start domain Domain_Name
error: internal error: qemu unexpectedly closed the monitor: mlockall: Cannot allocate memory
2020-08-04T06:35:05.316700Z qemu-kvm: locking memory failed
主要原因是hard_limit设置的内存值小于< memory设置的最大内存值。