我有一个使用 kvm 和 virt-manager 来处理虚拟机的虚拟机管理程序。
该虚拟机管理程序具有 6GByte 内存。
如果我添加一个新的虚拟机,我不知道还有多少内存可用。
至少 virt-manager 对话框没有显示它:
是否有一个工具可以帮助我找到匹配的最大值?
例子:
- 6 GB 总主机内存
- 为主机“host-one”分配 2 GB
- ? GB 代表主机“host-two”。
以上只是一个简单的例子。在我们的真实服务器上,我们有更多的虚拟主机。
我担心给虚拟主机分配太多内存。如果虚拟机管理程序的内存太少,则会导致严重的性能影响。如果我给“host-two”分配 4GB,那么虚拟机管理程序就会“着火”,因为它“没有空气可以呼吸”。
是否有一个工具可以帮助我确定有多少可用内存?
答案1
正如您链接的有关过度使用内存的 Redhat 文档所述,
“在 KVM 管理程序上运行的客户虚拟机没有分配专用的物理 RAM 块。相反,每个客户虚拟机都充当 Linux 进程,其中主机物理机的 Linux 内核仅在请求时分配内存。”
不幸的是,这使得确定你可以/应该为每个主机分配多少 RAM 的整个情况变得有点模糊。你可以使用一个工具来查看虚拟机之间分配的内存维尔什和它的空当接龙命令。
virsh 的手册页指出 freecell“打印机器上或 NUMA 单元内的可用内存量。freecell 命令可以提供机器上可用内存的三种不同显示之一,具体取决于指定的选项...。”
virsh
对于基于 KVM 的虚拟机管理程序,您可以在终端中使用虚拟机 shell 命令 ( ) 进入虚拟 shell ——您的提示符应从默认提示符更改为virsh #
。然后,您可以使用该list
命令显示虚拟机管理程序上的虚拟机列表。
要显示每个虚拟机的内存量(通过命令显示的数字list
),请使用:
virsh # freecell <cell_number>
您还可以传递--all
标志而不是单元号来显示为每个虚拟机和整个机器分配的内存量。
这应该能让您很好地了解您正在使用的总内存以及分配给每个虚拟机的内存量。如果您决定要更改分配的内存量,virsh 还提供了setmem
更改来宾域内存分配的命令。它类似于 virt-manager 提供的界面,但提供了更多选项和灵活性。您可以使用 找到所有命令选项和说明man virsh
。
答案2
如果您想要真正安全并且不过度使用内存,另一种方法是在主机上启用大页面并让虚拟机使用它们。缺点是您确实需要拥有所需的所有内存 - 主机内存和虚拟机内存将基本分开。
如果禁用匿名大页面(使用 启动transparent_hugepages=never
),您可以更好地控制大页面的使用方式,然后可以根据需要分配任意大小的大页面池(使用 启动default_hugepagesz=2M hugepagesz=2M hugepages=2560
5GB 内存,并将 1GB 留给主机操作系统)。
您还需要将其添加到您的 VM 定义中。
<memoryBacking>
<hugepages/>
</memoryBacking>
回答你的问题,如果你使用大页面,那么“需要多少内存”将由 回答grep ^Huge /proc/meminfo
。这里有一个示例,为虚拟机保留了 60G,还有大约 600MB 可用。
> grep ^Huge /proc/meminfo
HugePages_Total: 30000
HugePages_Free: 304
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
答案3
这是我的 hack 版本。欢迎提出改进意见:
列出每个虚拟机所需的 RAM 数量(以 kiB 为单位):
hypervisor5:~ # for dom in $(virsh list --all --name); do echo $(virsh dumpxml $dom | sed -nre 's/^.*>([0-9]*)<.currentMemory.*$/\1/p') $dom ; done| sort -n
524288 testfoo
2146304 x131
3121152 y114
3121152 foo
4096000 y123
4194304 mac-test
6144000 x123
虚拟机使用的 RAM 总和
hypervisor5:~ # for dom in $(virsh list --all --name); do virsh dumpxml $dom | sed -nre 's/^.*>([0-9]*)<.currentMemory.*$/\1/p' ; done| awk '{s+=$1} END {print s}'
23347200
可用的物理虚拟机:
hypervisor5:~ # cat /proc/meminfo | grep MemTotal
MemTotal: 24797436 kB
还剩下多少空间用于运行虚拟机:
hypervisor5:~ # python -c 'print 24797436-23347200'
1450236 (kiB)
...留给虚拟机管理程序的东西不多了。
再次强调:欢迎提出改进意见!