![当主机 I/O 负载较重时,为什么虚拟机会在 I/O 方面陷入困境?](https://linux22.com/image/106447/%E5%BD%93%E4%B8%BB%E6%9C%BA%20I%2FO%20%E8%B4%9F%E8%BD%BD%E8%BE%83%E9%87%8D%E6%97%B6%EF%BC%8C%E4%B8%BA%E4%BB%80%E4%B9%88%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%BC%9A%E5%9C%A8%20I%2FO%20%E6%96%B9%E9%9D%A2%E9%99%B7%E5%85%A5%E5%9B%B0%E5%A2%83%EF%BC%9F.png)
我已经多次注意到,当主机操作系统处于繁重的 I/O 负载下时,所有虚拟机都开始在 I/O 方面陷入难以置信的困境,甚至无法使用 systemd 启动CPU卡住消息和其他超时。它在 Linux 主机上的 VMWare Workstation 和 VirtualBox 下都以这种方式工作。与任何客人。基本上,如果主机正在执行例如文件系统检查或某些校验和计算,则客户操作系统由于几乎根本不工作 I/O 而只能发挥一半功能。
值得一提的是,主机进程在此类负载期间共享 I/O 不会出现问题,并且当运行第二次校验和时,I/O 只是或多或少均匀地分布在两个进程中。这是为什么?是什么让VM如此“特别”?可以帮忙吗?
答案1
消费级控制器/磁盘没有能力有效地执行多个繁重的 I/O 操作;然而,一般来说,技术速度越快,过程就会越好(理论上)。
显然,如果您运行软件 RAID 等 CPU/I/O 密集型操作(正如 OP 所说),它会降低整个设置的性能,无论是在共享控制器时,还是在耗尽 CPU 资源时。我建议至少投资一个硬件 RAID 控制器。
服务器级硬件通常可以更好地处理多个虚拟机/多个用户并行大量访问的情况。
然而,选择服务器级硬件并不是全部,在处理消费级或服务器级硬件时,有一些优化策略非常有用。
paravirtualizing
在虚拟机中可以做的事情就是服务,这对减少虚拟机管理程序的 I/O 负担有很大帮助。
半虚拟化意味着添加特殊的驱动程序,这些驱动程序将直接与虚拟化服务/内核进行批量数据传输(在 VMWare 中称为 PVSCSI),因此不必模拟实际的媒体存储设备/NIC。
对于所有 vmware 解决方案,无论是 Enterprise 还是 Workstation,您都可以获得适用于 Linux 和 FreeBSD 的软件包open-vm-tools
。
在 Debian 下,您可以使用以下命令安装它:
apt-get install open-vm-tools
对于 Debian Stretch,它不再涉及编译任何内容。对于 Jessie,我建议从向后移植安装 open-vm-tools,因为向后移植安装open-vm-tools
v10。
安装 open-vm-tools 后,您必须关闭 VM,并将磁盘控制器更改为 type ParaVirtual
,将网络控制器更改为vmxnet3
。
看一下配置磁盘以使用 VMware 准虚拟 SCSI (PVSCSI) 适配器 (1010398)
vmtools 还允许虚拟机进行内存膨胀,因此,它们不需要耗尽未使用的 RAM。
虚拟内存气球是虚拟机管理程序使用的一种计算机内存回收技术,允许物理主机系统从某些来宾虚拟机 (VM) 检索未使用的内存并与其他虚拟机共享。内存膨胀允许来宾 VM 所需的 RAM 总量超过主机上可用的物理 RAM 量。
对 VT 和 VT-d 等处理器级别仿真技术的支持也有助于使过程更加顺利。英特尔定向 I/O 虚拟化技术 (VT-d)
不用说,减少 I/O 的操作系统级别的优化也有帮助;例如,记录到远程日志系统,而不是本地虚拟机。
或者对齐分区。
VMware vSphere 5 中的分区对齐,DeepDrive,第 1 部分
VMware vSphere 5 中的分区对齐,DeepDrive,第 2 部分
还要注意其他 I/O 优化,例如由于日志守护进程刷新日志文件以在突然重新启动时保持日志完整性,因此从 /var 分区中取出数据库存储空间。
它还有助于遵循 Unix 使用最少所需服务的理念。根据我的使用经验,较小的虚拟机在内部管理/分页方面将使用较少的 I/O。显然,如果您使用的内存多于实际拥有的内存,则可能会出现 I/O 问题(也称为垃圾回收)。
您还可以在虚拟机管理程序中微调特定虚拟机的 I/O 优先级,即赋予其更高或更低的优先级。我知道它可以在 VCenter/VMWare ESX 中完成,可能不能在 VMWare Workstation 中完成,因为它是 2 级虚拟机管理程序,因此它是负责管理 I/O 操作和切片配额的主机操作系统(稍后会详细介绍)在)。
不言而喻,当使用 2 级虚拟机管理程序时,我们在这里讨论的许多优化也应该尽可能应用于主机操作系统。
VMware虚拟机管理程序技术也似乎比其他方案更好地处理多个虚拟机中的高负载 I/O。
但是,如果您关心性能,至少在 VMWare 领域,至少对于生产系统来说,我建议使用他们的 Type-1/裸机虚拟机管理程序(ESX 或 ESXi),而不是使用 VMware 工作站。
从管理程序:
类型 1、本机或裸机虚拟机管理程序 这些虚拟机管理程序直接在主机硬件上运行,以控制硬件并管理来宾操作系统。因此,它们有时被称为裸机管理程序。 IBM 在 20 世纪 60 年代开发的第一个虚拟机管理程序是本机虚拟机管理程序。 [4]其中包括测试软件 SIMMON 和 CP/CMS 操作系统(IBM z/VM 的前身)。现代同类产品包括 Xen、Oracle VM Server for SPARC、Oracle VM Server for x86、Citrix XenServer、Microsoft Hyper-V 和 VMware ESX/ESXi。 2 类或托管虚拟机管理程序 这些虚拟机管理程序与其他计算机程序一样在传统操作系统 (OS) 上运行。来宾操作系统作为主机上的进程运行。
2 类虚拟机管理程序从主机操作系统中抽象出来宾操作系统。 VMware Workstation、VMware Player、VirtualBox、Parallels Desktop for Mac 和 QEMU 是 2 类虚拟机管理程序的示例。
最后,还可以选择使用本地虚拟机管理程序或容器技术,这些技术不会为海量存储访问添加模拟层,例如Xen
PV 模式下的 Linux 主机,docker
或FreeBSD jails
.这种替代方案也有其优点和缺点,超出了本答案的范围。