
虚拟机用久了越来越慢打开个应用要转好几圈CPU动不动就飙到100%明明宿主机的配置看着并不差。这种现象我在最近几年帮朋友和自己的机器调优时碰到过太多次了。很多人第一反应是“配置不够”于是加内存、加核心结果钱花了性能提升却非常有限。实际上绝大多数“慢”都不是硬件不够而是虚拟化软件和虚拟机的默认设置根本没有为当前这台机器的真实负载做适配。这篇内容我整理了15个可以直接落到实处的性能提升手段覆盖CPU、内存、磁盘I/O、网络四条最主要的性能链路每一条都给出为什么要这么改、怎么改、以及改完大概会有什么效果。适合正在用VMware Workstation、VirtualBox、KVM/QEMU或者Hyper-V做开发、测试、跑服务的人尤其是那种机器配置明明不错、但虚拟机动不动卡顿的场景。我会把操作细节和踩过的坑一起写出来按顺序做基本能感受到明显变化。1. 先搞清楚虚拟机为什么慢三类瓶颈的源头1.1 虚拟化开销到底花在哪虚拟机慢不是因为它“不是物理机”而是因为虚拟化层要把真实硬件虚拟成多个逻辑设备这中间会产生三类明显的开销。第一类是CPU开销虚拟机里跑的每个指令都要经过虚拟机监控器转发如果连硬件虚拟化扩展都没打开这个转发就是纯软件模拟开销非常大第二类是内存开销虚拟机的物理内存并不直接在宿主机的物理内存地址上而是多了一层地址转换如果没有硬件辅助每次内存访问都要软件翻译第三类是I/O开销虚拟机的磁盘和网络都要经过宿主机的模拟设备一次写入可能要经过多次上下文切换和设备模拟延迟比物理机高出一个量级。我用过一个很形象的类比虚拟机就好比一个翻译坐在两个说不同语言的人中间每句话都要经过他转述。优化做的事情不是把翻译撤掉而是让翻译尽量少说话、说得更快比如开启硬件直通、加大翻译的缓冲区、减少需要翻译的句子数量。这篇里的15招本质上就是围绕“减少翻译工作量”和“让翻译本身更快”这两个方向在做文章。1.2 优化前先测基线怎么量化“慢”不测基线就调优等于蒙着眼睛调参。我每次拿到一台需要优化的虚拟机都会先跑一组标准化测试记录三个核心数据启动时间、CPU空闲占比、磁盘吞吐。具体做法是在虚拟机上安装sysstat或Windows的性能监视器然后在宿主机负载稳定的情况下分别记录开机到桌面可用的秒数、空闲状态下虚拟机内CPU占用率以及用fio或CrystalDiskMark测一次顺序读写的吞吐和延迟。这套基线数据非常关键。比如如果你发现虚拟机在空闲状态下CPU占用就有30%以上那问题大概率出在宿主机或者虚拟机内部的系统服务上而不是业务负载如果启动时间特别长多半是磁盘I/O路径有问题。我把这三个数据记录下来之后每做一项优化就再测一次用数据确认哪一招真正有效。这个方法不复杂但能让你在后面十几招优化里不至于盲目。2. CPU层面的5招优化让计算不再“空转”2.1 第1招确认硬件虚拟化已开启别让CPU在软件模拟中硬扛这一条是基础中的基础也是最容易被忽略的。很多人的电脑BIOS/UEFI里默认关闭了Intel VT-x或AMD-V虚拟机只能退回到纯软件模拟模式性能损失可以达到50%以上尤其是跑Windows虚拟机时那种慢会让人怀疑人生。怎么确认Windows下打开任务管理器切到“性能”标签看CPU部分是否显示“虚拟化: 已启用”如果显示“已启用”再看“基于虚拟化的安全性”是否开启因为这个功能如果开启会和VMware的二进制翻译产生冲突导致性能异常。Linux下可以用grep -E (vmx|svm) /proc/cpuinfo检查有输出就代表CPU支持且BIOS已开启。如果没开启重启进BIOS找到“Intel Virtualization Technology”或“SVM Mode”选项设为Enabled保存重启即可。这一条属于“不做白不做”的优化对任何虚拟机软件、任何操作系统都有效。我遇到过有人折腾了半天虚拟机配置最后发现只是BIOS里关了虚拟化开关打开之后性能直接翻倍。2.2 第2招vCPU数量配多少最合理别盲目加核心给虚拟机分配的逻辑CPU数量不是越多越好分配多了反而是负担。原因在于虚拟机调度器要管理这些vCPU与宿主机物理核心之间的映射vCPU越多上下文切换和调度开销就越大特别是在宿主机物理核心本身不多的情况下。一个比较保守但长期有效的方法是vCPU数量不要超过宿主机物理逻辑处理器数量的一半。比如你的机器是4核8线程也就是8个逻辑处理器那么单台虚拟机的vCPU建议给2到4个。如果同时跑多台虚拟机还需要把每台机器的vCPU加起来一起算总和对宿主机CPU超分比不要超过1:4后面第2.5会详细讲。判断方法很直接打开虚拟机的资源监视器如果CPU使用率长期在20%以下说明给多了如果在高负载时能跑到70%-80%以上那这个配置就是合理的。还有一种常见情况是虚拟机的数据库或编译任务吃不满CPU反而是单线程瓶颈这时候加vCPU毫无意义应该去优化应用本身的并发逻辑。2.3 第3招CPU亲和性绑定让调度器别乱跑默认情况下CPU调度器会在各个物理核心之间自由切换vCPU这没错但如果虚拟机对延迟很敏感比如跑了数据库或者实时抓包工具这个自由切换就会带来不小的性能抖动。解决方法是为虚拟机绑定固定的物理核心避免vCPU在不同核心之间迁移。VMware Workstation下可以在vmx配置文件中加入这样几行sched.cpu.affinity 0,1 sched.cpu.affinity 2,3意思是把虚拟机绑定到物理CPU的0、1号逻辑处理器上把宿主机和虚拟机分开用不同的核心。KVM/QEMU环境下可以用taskset -c 0,1配合启动命令或者在libvirt的domain配置里用vcpupin标签完成绑定。需要提醒的是亲和性绑定并不适合所有场景。如果宿主机本身核心数量不多绑定反而会造成资源浪费因为被绑定的核心空闲时虚拟机的vCPU也不能用其他核。所以这一招适用于多核宿主机 单台重要虚拟机的场景像我跑数据库虚拟机时就会这样处理普通办公虚拟机完全没必要。2.4 第4招嵌套页表EPT/NPT为什么是性能快车道虚拟机的内存地址要经过两层转换虚拟机内部的逻辑地址先转为虚拟机物理地址再由虚拟机监控器转为宿主机物理地址。早期没有硬件辅助的时候用的是影子页表也就是由虚拟机监控器软件维护一张映射表每次内存访问都有额外软件开销这对内存密集型应用影响非常大。现在主流的CPU都支持EPTIntel或NPTAMD把这层转换交给硬件完成虚拟机访问内存时由CPU的MMU直接做两级转换。这一招不是“怎么配置”而是“确认已经开启”。VMware下如果硬件虚拟化正常且开启嵌套页表就不需要额外设置但如果你的虚拟机配置里出现了“启用二进制翻译”或者“使用软件MMU”之类的选项一定要改成“使用硬件虚拟化”。KVM/QEMU环境下只要CPU支持EPT/NPT且没有在启动参数里显式关闭默认就是开启的可以通过cat /proc/cpuinfo里的ept、npt标志来确认。这个优化对数据库、Java应用这类内存访问密集的场景收益特别大。我实测过同一台物理机打开EEP/NPT前后跑内存基准测试的成绩差距在30%以上非常直观。2.5 第5招控制CPU超分比别让宿主机的资源被“抢米”CPU超分比是宿主机所有虚拟机vCPU总数与物理逻辑处理器数量的比值。超分是虚拟化平台非常核心的能力它允许你跑出比物理核心数量更多的vCPU因为不是每台虚拟机的每个vCPU都时刻满载。但超分是有限度的。VMware官方建议CPU超分比不要超过1:4也就是物理8逻辑核心的机器最多分配32个vCPU给所有虚拟机。一旦超过这个比例虚拟机之间互相争用CPU反而会造成整体吞吐下降甚至出现CPU就绪等待过长表现为虚拟机内部CPU使用率很高、但实际运行很慢。实操时还有一个很容易踩的坑很多人只盯着单台虚拟机的vCPU却忘了一台宿主机上往往挂了好几台虚拟机。所以我的经验是先统计宿主机上所有虚拟机的vCPU总和再对照物理逻辑核心数如果超过2倍就要开始优化超过3倍优先级最高的事情不是调优虚拟机而是分流去其他宿主机或降低单台虚拟机的vCPU数量。3. 内存优化4招避免“慢到卡死”的交换3.1 第6招内存预留与ballooning优先级要分清虚拟机的内存通常是可以动态调整的这依赖于一个机制ballooning内存气球。简单说当宿主机内存吃紧时虚拟机监控器会通过一个“气球驱动”从虚拟机内部回收一部分空闲内存页让宿主机有更多可用内存。这个机制对提高内存利用率很有效但有一个致命弱点它无法区分哪些内存在被业务使用、哪些只是空闲。如果回收到了业务进程正在使用的内存虚拟机内部就会被迫执行内存回收甚至交换性能瞬间崩塌。所以在跑数据库、缓存服务这类内存敏感应用时一定要做内存预留。VMware Workstation中先把内存大小的“预留所有客户机内存”选项勾上KVM下不要开启内存balloon设备或者用memoryBacking配置锁定内存页。这样虚拟机的内存就不会被宿主机回收代价是宿主机一旦内存不足只能靠自身的swap来救急所以前提是宿主机内存确实足够。我踩过一回一台8G物理内存的机器同时跑了3台虚拟机每台分配4G内存结果数据库虚拟机在做大查询时疯狂卡顿宿主机内存占用却只有70%。后来才发现是ballooning把数据库的内存页回收了一部分等触发了内部分页延迟直接上百倍。这个场景下做内存预留的效果立竿见影。3.2 第7招启用大内存页减少TLB压力现代CPU的MMU里有一个叫TLB旁路转换缓冲的缓存专门缓存虚拟地址到物理地址的映射关系。默认情况下内存页大小是4KB一个程序如果占用1GB内存就要有25万多个页表项去描述TLB根本缓存不过来每次访问都得查页表开销很大。如果改用2MB甚至1GB的大内存页页表项数量瞬间减少500倍TLB压力大大降低内存访问速度自然提升。Linux宿主机上配置大页比较简单在 /etc/sysctl.conf 里加一行vm.nr_hugepages 1024然后执行sysctl -p生效再用cat /proc/meminfo确认HugePages_Total不为0。之后在QEMU启动参数里加-mem-prealloc -mem-path /dev/hugepageslibvirt环境也可以直接在domain配置里加memoryBackinghugepages//memoryBacking。不过要注意大页的内存是预先分配的不能动态扩容所以配置前要想清楚给哪些虚拟机用。另外虚拟机的guest内核里也可以开启透明大页THP但这里有个争议点THP在后台做内存融合时会导致轻微的延迟波动如果你跑的是对延迟极度敏感的服务更稳妥的选择是关闭THP直接在宿主层面用静态大页性能更稳定。3.3 第8招快照链的隐藏代价别让回滚功能拖慢写入很多人打开快照功能之后就没有再管过。快照的工作原理是写时复制COW也就是说一旦给虚拟机关联了快照虚拟机内所有块设备的写入都要先经过一套“检查该扇区是否已存在于快照之中”的逻辑然后才写入新的位置。快照越多、链越长这套检查的层级就越多磁盘写入性能被拖慢的程度也就越大。我见过最夸张的情况是一台虚拟机上有7层快照跑一个只读的web服务都能感觉到明显的卡顿更不用说有写入负载的数据库了。所以我的建议非常简单直接不要在生产环境保留超过1个快照。如果只是做升级前的备份做完升级并且确认没问题之后马上合并删除快照。VMware里是Snapshot ManagerVirtualBox里是Snapshots页面都可以一键删除快照把改动合并到父盘。快照合并过程本身也会占用不小的I/O建议在业务低峰期操作。这一招几乎零成本但收益非常明显。如果你发现虚拟机是越用越慢、而且最近一段时间做过快照操作优先检查快照链的深度。3.4 第9招调整Guest内核对内存回收的策略即使做了内存预留、大页这些宿主层面的设置虚拟机内部的操作系统默认行为也可能坑你。以Linux guest为例默认的swappiness值是60意思是内存压力到了一定程度内核会倾向于把不常用的内存页交换到swap分区。而很多虚拟机的swap是放在虚拟磁盘上的这个虚拟磁盘又走宿主机的I/O栈一旦发生交换性能就是断崖式下跌。如果Linux虚拟机的负载是计算密集或数据库类的可以把这个值调低。具体做法echo 10 /proc/sys/vm/swappiness永久生效则写入 /etc/sysctl.conf设置为vm.swappiness10。如果虚拟机本身内存充足甚至可以考虑直接设为0只在物理内存完全不足时才触发交换。Windows虚拟机那边对应的操作是关闭系统盘上的页面文件或者在“性能选项-高级-虚拟内存”里启用“自动管理所有驱动器的分页文件大小”并设置固定大小避免频繁扩展页文件造成的磁盘碎片和I/O抖动。调完之后再看性能监控里内存页面的读写速率如果交换导致的磁盘读写消失了就说明这个调整起效了。4. 存储I/O优化磁盘性能提升的4个关键设置4.1 第10招换SSD、选对控制器I/O延迟差一个量级磁盘I/O是虚拟机性能的另一个大头也是最直观的一个。物理机是机械硬盘的话虚拟机再优化也就那样因为底层物理I/O的瓶颈在那里。所以第一步永远是给虚拟机所在的宿主机换一块固态硬盘。这个替换带来的收益比做虚拟机层面任何一项优化都大在NVMe SSD上4K随机读的延迟可以做到几十微秒而机械硬盘要在几毫秒级别相差百倍量级这种差异在虚拟机里面会被放大因为虚拟化层本身还有一层开销。除了介质虚拟磁盘的控制器类型也直接影响性能。VMware默认可能是SATA或IDE但PVSCSIParavirtual SCSI控制器的性能明显更好尤其是并发I/O场景它的队列深度更高CPU开销也更小。Windows guest装好VMware Tools之后可以添加一个PVSCSI控制器把磁盘迁移过去Linux guest则优先用VirtIO块设备KVM环境性能接近裸盘。VirtualBox用户同样可以把SATA控制器换成NVMe或VirtIO模式吞吐也有肉眼可见的提升。4.2 第11招固定大小磁盘 vs 动态扩展写入性能差距在哪创建虚拟磁盘的时候大多数人图省事选了“动态分配”也就是磁盘文件刚开始很小随着虚拟机内部写入逐渐增长。这个选项的好处是节省宿主机磁盘空间但对性能的牺牲非常隐蔽。动态分配的虚拟磁盘每次写入都要查询当前扇区是否已经分配没有分配的话还要先做分配动作多出来的就是一条额外的元数据路径。更麻烦的是磁盘文件在宿主机文件系统上是碎片化增长的时间一长顺序读也会退化。解决方法是创建固定大小的虚拟磁盘一次性把空间全部预分配给虚拟机。VMware里选择“立即分配所有磁盘空间”VirtualBox选“固定大小”KVM用qemu-img create -f qcow2 -o preallocationfull也是同理。固定大小磁盘的写入路径短没有分配查询顺序性能更稳定碎片化也更低。不过固定磁盘的缺点是创建时间比较长而且要占用宿主机相等大小的真实空间。我通常的做法是系统盘用固定大小数据盘用固定大小快照和备份都放在另外的地方。如果你已经用了动态磁盘又不想重装可以先把磁盘迁移用固定分配方式重新创建再把数据复制过去虽然麻烦一点性能收益值回时间成本。4.3 第12招把日志、数据文件和系统盘拆开虚拟机里的存储布局也值得讲一讲。很多人在虚拟机里给系统盘分配很大的空间然后把数据库的数据文件和操作系统的临时文件全都丢在同一个磁盘上。这样做的麻烦在于数据库的写入压力会和其他I/O混在一起互相竞争同一块虚拟磁盘的I/O队列导致所有请求都变慢。合理的做法是把热I/O路径拆分到不同的虚拟磁盘上。比如MySQL可以单独挂一块数据盘存ibdata和binlog再单独挂一块日志盘存redo log应用服务器的临时目录(/tmp)也可以单独放一个虚拟磁盘让临时文件的写入不干扰主业务盘。即使是普通办公虚拟机有条件的话至少要把交换文件或休眠文件放在独立的虚拟磁盘上避免系统盘被频繁的交换操作拖垮。这样做还有一个额外好处备份和快照可以根据需要只针对某个磁盘数据卷分离之后备份策略的复杂度会大大下降。4.4 第13招关闭宿主机上不必要的I/O干扰源虚拟机的性能不只是虚拟机自己决定的宿主机上的很多后台任务会占用大量磁盘I/O间接拖慢所有虚拟机。最典型的是Windows宿主机上的Windows Search索引服务、Defender实时扫描、以及系统更新。这些服务会持续地扫描磁盘尤其在虚拟机磁盘文件被访问的时候反复进行实时监控相当于给虚拟机磁盘I/O又加了一层“检查站”。我的习惯是给虚拟机磁盘文件所在的目录单独加排除规则。Windows Defender里把存放虚拟机镜像的目录比如D:\VirtualMachines加入“排除项”然后关闭Windows Search对这几个目录的索引。在Linux宿主机上要留意的是日志服务、包管理器的缓存更新以及定期任务 cron 里的备份脚本如果它们跑的时间刚好在虚拟机的业务高峰期磁盘I/O就会被抢走。另外宿主机电源管理也会产生I/O副作用比如机械硬盘在空闲时被切换到休眠状态虚拟机下次访问时要等盘片重新转起来会有一次长达几秒的卡顿。这个问题在第6章会说把宿主机电源计划改为“高性能”避免硬盘停转对虚拟机的响应速度也是很实际的影响。5. 网络优化2招解决“虚拟机上网慢半拍”5.1 第14招虚拟网卡型号怎么选很多人对虚拟机网络性能没概念认为虚拟网卡只是个软件模拟而已用默认的就行。其实虚拟网卡型号对千兆以上吞吐和延迟的影响相当大。以VirtualBox为例默认的AMD PCnet或Intel PRO/1000系列属于完全模拟的设备每次收发数据包都要经过完整的设备模拟路径CPU占用高、吞吐上不去。而VirtIO网卡是专门为虚拟化设计的半虚拟化设备guest和宿主机之间通过共享缓冲区直接传递数据包省掉了一整层模拟开销。所以在KVM/QEMU里给Linux虚拟机加网卡时优先选择virtio模型Windows虚拟机同样可以用VirtIO驱动或者VMware环境直接用vmxnet3。VMware Workstation里如果以太网配置中能看到“VMXNET 3”优先选它没有的话默认的e1000也能用但性能上限低不少。识别当前网卡型号的简单方法是看虚拟机系统里的硬件列表。Windows在设备管理器里看网络适配器Linux用lspci | grep -i ethernet。如果发现是e1000或pcnet且你的虚拟化平台支持半虚拟化网卡换个型号的收益会很明显尤其是在传输大文件和跑Web服务时。5.2 第15招多队列与SR-IOV把中断分散给多个CPU默认情况下虚拟网卡只有一个发送队列和一个接收队列所有网络中断都落在同一个CPU上处理。虚拟机内部的网络流量一旦变大这个CPU会成为瓶颈表现为单核跑满但其他核心空闲整体吞吐上不去。解决的办法是开启多队列让不同队列的中断分散到多个CPU上。KVM/QEMU里创建网卡时加上mqon参数guest里再通过 ethtool 设置队列数ethtool -L eth0 combined 4这样数据包收发的中断可以平均分散到4个逻辑CPU上多核优势才真正发挥出来。VMware的vmxnet3默认就支持多队列在VMware Tools配置页面或vmx文件里可以设置ethernet0.queueCount 4。如果虚拟机对网络延迟和吞吐要求到了极致比如跑分布式存储或者多节点集群还有一个更暴力的方案SR-IOV直通。把物理网卡划分出多个虚拟功能VF直接把一个VF分配给虚拟机让虚拟机绕过虚拟机监控器的网络栈直接操作物理网卡硬件。这样网络性能几乎等于裸机但代价是你会失去虚拟交换机的特性比如VLAN隔离、网络监控、热迁移时的网络跟随这些都要靠外部交换设备或SR-IOV网卡的硬件功能来补。所以我一般只在测试环境和性能敏感的生产节点用普通办公虚拟机关联不大。6. 宿主系统与虚拟机的“内外配合”6.1 集成服务/增强工具必须装如果虚拟机里没装VMware Tools或VirtualBox Guest Additions那就相当于开着没有驱动声卡和显卡的电脑性能必然是残血的。这些增强工具的作用不只是让屏幕自适应分辨率更重要的是它们会安装半虚拟化驱动VMware的pvscsi、vmxnet3、以及guest内存同步等模块都依赖Tools在guest内注册并运行对应驱动。不装Tools很多性能优化手段根本没有落地的通道。在Windows虚拟机里装VMware Tools只需要从VMware菜单里选“Install VMware Tools...”然后在虚拟机里把光驱里的安装程序跑一遍。装完重启之后再确认设备管理器里没有带黄色感叹号的设备也就是每个设备都加载了正确的半虚拟化驱动。Linux虚拟机安装的步骤类似用mount /dev/cdrom /mnt挂载光盘后执行安装脚本即可。这一步是所有优化里性价比最高的相当于给虚拟机装上原厂驱动。6.2 宿主机电源计划、系统特效调整办公室电脑装虚拟机宿主机多半用的是“平衡”甚至“节能”电源计划。这个设置在虚拟化场景下特别坑CPU主频会随负载动态调整但当虚拟机负载不高却需要低延迟响应时CPU还在从低频往高频爬升的路上响应就已经慢了一步。对延迟敏感的应用建议把宿主机电源计划切换到“高性能”让CPU保持在高频率运行减少频率切换带来的延迟抖动。笔记本用户如果担心功耗至少也要在插电状态下用“高性能”电池供电时再降回来。Windows宿主的“系统特效”同样值得关掉窗口动画、任务栏缩略图、透明效果等等这些特效虽然不重启不占大资源但会在虚拟机启动或宿主机资源紧张时额外消耗CPU。虚拟机运行游戏或3D应用时还会涉及宿主的显卡资源竞争这时候关掉宿主机的动态壁纸、桌面动画这些花哨功能能明显减少拖累。6.3 显存与3D加速怎么取舍虚拟机里的显卡性能长期是最弱的一环因为除了GPU直通虚拟机里的显卡本质上是软件模拟的只能提供基础显示能力。VMware的3D加速功能可以把部分DirectX/OpenGL调用交给宿主GPU处理对图形密集型应用有效但它同时会消耗宿主的GPU资源并增加虚拟机和宿主之间的通信开销。我的建议是分场景处理如果虚拟机只是跑开发工具、数据库、Web服务图形需求很低那就把显存设置到足够显示器流畅显示的水平比如128MB到256MB关掉3D加速反而能让虚拟机把更多资源留给计算任务如果虚拟机要跑CAD编辑、轻量设计软件再打开3D加速并且把显存调到512MB以上。不要在任何虚拟机里开“最大分辨率”搭配“最大显存”然后再配3D加速这样会把宿主机显卡资源抢得干干净净其他虚拟机也会跟着卡。7. 性能问题排查与实战记录7.1 常见症状与对应措施速查表调试的时候我一般先看现象再对照可能的优化点比盲目重装系统快得多。整理一份速查表可以参考现象首要怀疑点处理动作虚拟机启动特别慢磁盘I/O路径过长检查是否用SSD、是否有快照链、控制器是否为半虚拟化空闲时CPU占用高宿主后台扫描/虚拟机内部服务排除Defender扫描目录关闭guest内的无用自启动服务高负载时CPU就绪过高vCPU分配过多或超分比过高降低vCPU数量核对CPU亲和性内存频繁交换内存预留不足或ballooning做内存预留调整swappiness关闭页面文件动态扩展磁盘IO高但业务不高动态磁盘碎片/快照链换固定磁盘清理快照网络吞吐上不去虚拟网卡型号不对/单队列换成vmxnet3或virtio开启多队列另外还有两个容易被误判的情况一个是磁盘空间不足动态磁盘如果宿主磁盘满了写入会出现极端缓慢甚至报错另一个是磁盘碎片整理机械硬盘的虚拟磁盘文件碎片化严重时可以用宿主机上的磁盘整理工具整理一下虚拟磁盘文件的位置SSD则没必要。7.2 两个真实案例启动慢与磁盘占用100%我处理过一个经典的启动慢案例。客户反馈Windows 10虚拟机开机要转圈十几分钟才进桌面。排查下来发现这台虚拟机的磁盘文件是动态分配格式并且在快照管理里有3个旧快照没有合并。宿主机上是机械硬盘Defender实时扫描还在运行。三重因素叠加导致开机时系统大量读写虚拟磁盘每个写入都要经过快照层查询同时Defender还要实时扫描文件内容结果就是慢到无法接受。我做了三步处理删除旧快照合并更换磁盘控制器到PVSCSI在Defender排除虚拟机目录。重启后开机时间从十几分钟降到两分钟以内虽然是机械硬盘但已经有了明显改善。另一个案例是虚拟机内磁盘占用100%的问题。应用服务没有明显的高负载但磁盘活动时间一直卡在100%CPU使用率却很低。我通过iotop看到是虚拟机内的curl下载任务在写临时文件而临时目录在同一块系统盘上导致系统盘I/O饱和。解决方案是把/tmp挂载到单独的一块虚拟磁盘上并且把临时目录放在内存里tmpfs磁盘占用问题立刻消失。这类问题往往不是硬件不够而是存储布局不合理造成的I/O风暴。8. 一些个人的调优心得说句实在话做虚拟机性能优化这么多年我最深的体会是不要一上来就找什么“大招”而是把基线测出来一项一项去验证。15招里面有些对你目前的环境可能完全无效有些却会带来成倍的提升这完全取决于瓶颈在哪里。虚拟机的性能问题就像管道里的水流瓶颈可能在某一个弯头而不是水龙头本身。最后再分享一个小技巧也是我每次在新环境里都会做的优化完之后同样用第1.2节的方式重新测一遍基线把前后的数据放在一起对比。不仅能确认优化效果还能形成一份通俗的性能备忘以后这台机器再出问题翻出来对照一下排查速度会快很多。另外虚拟机的各项设置不要一次改太多每改一两个配置就观察一下虚拟机运行状态这样定位问题才不会糊里糊涂。