KVM虚拟化之(2):内存技术

目录

内存热插拔

扩展内存

缩小内存

设置最大内存

内存限制技术


内存热插拔

扩展内存

<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设置的最大内存值。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值