十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

VOI架构vDisk IO瓶颈优化实战:从系统减负到缓存调优

VOI架构vDisk IO瓶颈优化实战:从系统减负到缓存调优 机房上午第一节课的“开机风暴”应该是所有运维VOI平台的兄弟最有共鸣的噩梦。五十台终端同时通电服务器端的vDisk虚拟磁盘镜像要被疯狂拉取硬盘指示灯直接跑成跑马灯终端卡在“正在加载操作系统”的进度条上鼠标转圈转到天荒地老。这种场面不夸张地说就是在和底层存储的并发IO能力硬碰硬。这篇博文不聊虚的把我这几年在VOI架构下处理vDisk IO瓶颈的真实经验和优化方案完整梳理一遍从Windows系统本身的“减负”到vDisk缓存策略的精细化调参再到存储和网络侧的配合最后把常见故障的排查思路也一并列出来。无论你是在学校机房、企业办公区还是连锁门店做VOI环境的运维与改造这文章里的思路和参数应该都能直接抄作业。先说清楚一个现象很多朋友一遇到IO瓶颈第一反应就是砸钱换服务器、加全闪阵列。硬件升级当然有效但你有没有想过很多时候瓶颈其实是自己这台Windows“太吵”——后台一堆不该有的读写动作和虚拟磁盘抢带宽。在动硬件之前把Windows优化这步做扎实往往能释放出20%到30%的IO余量这比例在机械盘阵列上还会更夸张。所以这篇文章我会把系统层的优化放在最前面它的性价比实在太高了。1. VOI架构IO瓶颈是怎么来的问题根源在哪1.1 先搞清楚VOI和VDI的IO路径差异很多人把VOI和VDI混为一谈但它们的IO模型差别非常大优化方向自然也不同。VDI是把虚拟机的整个系统盘放在服务器上终端只是一个显示协议客户端所有读写操作都发生在服务器端存储上IO瓶颈非常集中一卡就是全体终端一起卡。而VOI的核心思路是“镜像集中管理计算本地执行”终端启动时通过网络从服务器上的vDisk镜像文件拉取操作系统加载到本地内存后由终端自己的CPU和内存接管运行。这个差异决定了VOI的IO瓶颈往往不在“运行中”而在“启动时”。系统起来之后绝大部分读操作已经落在本地内存或本地缓存盘上写操作也是先写本地再异步回传。所以你在VOI环境里遇到的卡顿几乎都集中在两个时间点一个是早晨大批终端同时开机的“启动风暴”另一个是镜像更新或批量唤醒时的“回写风暴”。把这两个场景想透了优化思路就清晰了。1.2 IO瓶颈的三个真实来源每一个都要对症下药根据我自己排障的经验VOI架构下的IO瓶颈通常不是单一因素造成的而是三个层面叠加在一起的结果。第一层是终端并发启动时对服务器存储的瞬时读压力。假设一台终端加载基础镜像需要顺序读取约3GB数据50台终端同时开机就意味着服务器要短时间扛住150GB的读取量如果镜像文件连续存放还好一旦碎片化机械盘阵列的随机读IOPS立刻被打满。这个环节的瓶颈点在存储阵列的IOPS和网络带宽。第二层是Windows系统自身的后台IO行为在虚拟化环境下被放大。本地物理机上Superfetch预读、Windows Search索引、Defender实时扫描这些操作对用户感知影响不大但在VOI环境下这些行为会不断产生“额外”的读请求和写请求和镜像加载抢IO。而且这些请求往往是随机小文件读写恰好是机械盘最不擅长应付的。第三层是缓存策略配置不当导致的写放大与回写风暴。vDisk的写缓存机制如果参数没调好终端会在某个时间点把积压的写数据集中回传到服务器造成周期性卡顿。这个我在后面专门用一节来讲因为这是最容易被忽视、却恰恰是优化的最大突破口。2. Windows系统层优化先把没必要的读写全部砍掉2.1 服务与计划任务瘦身砍掉后台隐形IO做系统层优化前我建议你先把镜像在维护模式下打开也就是进入一个“准备模板”的环境不要在正式终端上逐台改。下面的每一项优化都在模板镜像里做然后固化到vDisk的“黄金镜像”里推给所有终端。这是最基本的操作纪律不然你改十台机器的时间够人家重做三次镜像了。先说我每次必砍的后台服务清单SysMain原Superfetch这个服务在物理机上会预加载常用应用到内存但是在VOI环境下意义不大。系统镜像和常用软件本来就被vDisk缓存了Superfetch的预读动作反而会干扰IO调度。直接在服务管理器里设为禁用或者用命令sc config SysMain start disabled。Windows SearchWSearch这是IO大户它在后台会对整个系统盘建立索引产生海量小文件随机读写。机房和办公环境里绝大多数场景用不到系统级搜索直接禁用命令是sc config WSearch start disabled。磁盘碎片整理计划任务在虚拟磁盘上做碎片整理没有意义反而会制造大量无用的写IO。在“任务计划程序”里找到“碎片整理计划”直接禁用。如果你的vDisk底层用的是固态盘缓存碎片整理更是有害无益会加速闪存磨损。Windows Defender实时保护这条要谨慎。如果VOI网络是隔离的、终端无法外联互联网我建议关闭实时扫描改用集中式的专杀工具定期巡检。如果终端需要外网则不要完全关闭Defender而是把vDisk缓存目录、镜像挂载目录、系统临时目录加入排除列表避免每一次读写都触发扫描。Windows Update自动更新在VOI环境里Windows Update自动更新是一个很麻烦的事情。几十台终端如果各自下载更新瞬间就能把带宽和IO吃满。正确的做法是关闭自动更新由管理员在黄金镜像里统一打补丁后再推送。尤其是企业办公场景一定要禁用wuauserv服务或设置组策略关闭自动更新。做完服务层禁用后建议顺手清理一遍启动项。打开任务管理器里的“启动”选项卡把所有非必要的软件自启动全部禁用。很多单位的VOI镜像里会预装各种办公套件、输入法、即时通讯工具这些软件默认开机自启每一个都在系统启动的高峰期抢IO和CPU。你想象一个场景50台终端同时开机每台机器的QQ、微信、WPS、浏览器全部并发启动服务器端的IO压力等于是翻倍的。把自启动项砍成只保留输入法和杀毒客户端启动体感完全不一样。2.2 注册表、文件系统和电源策略把每一分IO花在刀刃上服务砍完之后还有几个系统参数值得动刀。这些参数改起来很简单但效果很实在。关闭NTFS最后访问时间更新。Windows默认会在每次文件访问时更新NTFS的USN日志和最后访问时间戳这在大量小文件读取场景下会产生额外的元数据IO。在管理员命令行执行fsutil behavior set disablelastaccess 1这个设置立竿见影尤其对于镜像文件这类“读多写少”的大文件能明显降低元数据操作对磁盘的干扰。关闭系统休眠功能。休眠文件hiberfil.sys的大小等于物理内存容量而且会在休眠时把一个内存镜像写入磁盘对虚拟化环境毫无用处。管理员命令行执行powercfg /h off这一步能释放一个和内存容量等大的磁盘空间同时少一个潜在的写盘动作。别看休眠平时不用就不管很多终端用户直接按电源键关机系统默认可能进入混合睡眠就会触发写盘。固定虚拟内存或移出缓存盘。在VOI终端上如果物理内存充足8GB以上建议把虚拟内存设置为固定大小避免页面文件频繁动态扩展引发碎片化。如果物理内存吃紧也尽量不要让页面文件落在vDisk的写缓存盘上——页面文件是高频随机读写的会严重影响回写缓存的性能这在第3部分会详细讲。我自己通常的做法是终端内存8GB以上的虚拟内存固定为2GB放在系统盘以外的本地预留分区避免和系统镜像抢空间。临时文件夹重定向。把%TEMP%和%TEMP%环境变量指向本地非缓存盘或内存盘可以避免应用运行时产生的临时小文件频繁写入vDisk缓存。这招对浏览器、Office这类应用特别有效因为它们会频繁写临时文件。如果终端内存充裕甚至可以用内存盘软件如ImDisk划出1GB内存区给临时文件用跑完即断电消失既快又不伤盘。做完这些回到IO监控上你就会发现空闲状态下终端的后台磁盘活动肉眼可见地减少。我在实际项目里测过一台刚装好Windows 10并做完上面优化的终端空闲时每分钟的系统IO请求次数能从三四百次下降到二三十次效果非常明显。2.3 镜像瘦身与关键软件安装规范减少“带病”进系统在黄金镜像里安装软件时有一个经验性的规范值得强调所有软件尽量做成“绿色版”或“免安装版”安装版软件能少装就少装。原因很简单——安装版软件会在系统里注册大量服务、计划任务、右键菜单扩展这些组件在开机时都会被系统扫描加载变相增加启动IO。我见过一个单位镜像里装了9个软件其中4个安装版软件都注册了开机自检服务结果就是终端启动时间从40秒变成90秒。另外要注意的是软件安装位置。在VOI模式下系统镜像通常是“只读”或“还原”状态分发给所有终端。如果你把软件装在C盘那它就是镜像的一部分所有终端共享这一个副本适合全单位统一使用的软件。如果你需要在个别终端上装特殊软件务必装到D盘或本地独立的分区并确保这个分区被排除在还原策略之外。镜像本身也要定期做“瘦身体检”。用Dism或Windows 10轻松设置这类工具清理系统更新备份、过期驱动程序、临时文件、缩略图缓存。每次把镜像里1GB的垃圾清出去意味着终端启动时少拉取1GB的数据几十台终端同时开机时服务器侧的读取压力就降低几十GB这个账很划算。3. vDisk缓存策略把热点数据留在离CPU最近的地方3.1 读缓存和写缓存分开看别混为一谈很多朋友把vDisk的缓存策略当成一个开关来处理要么全开要么全关这是不对的。实际上读缓存和写缓存的优化逻辑完全不同需要分开设计。读缓存的目的是“避免重复从服务器拉取数据”。在VOI环境里终端的系统启动、常用软件打开读取的其实都是镜像中的同一份数据。如果这些数据能缓存在终端本地——无论是内存还是本地SSD——第一次开机读一次之后的启动直接命中缓存IO压力就只存在于服务器到终端之间非常短暂的一段时间。所以读缓存的核心指标是缓存命中率命中率越高服务器侧承担的读压力越小。写缓存的目的是“让终端看起来响应很快”。用户在使用过程中产生的写入比如文档保存、配置修改、系统日志如果直接透传到服务器每一次写操作都要经过网络延迟高且占带宽。所以vDisk一般是先写本地缓存再异步回传到服务器持久化。这里的关键参数是缓存容量和回写频率缓存容量太小写入频繁触发“写满-冲刷-再写”的循环回写频率太激进会不停占用网络和服务器IO。给一个直观的比喻读缓存相当于你家楼下的便利店常见的东西在楼下拿不用每次都去超市写缓存相当于快递代收点快递先堆在代收点攒一波再统一送到家。如果代收点太小门口堆不下快递员就得频繁跑动物流效率反而更差。3.2 缓存容量怎么定回写时机怎么选在主流VOI产品如锐捷的vGala、和信、深蓝等里终端本地缓存通常分内存缓存和SSD缓存两级。实际调优时我建议遵循以下几个原则内存读缓存建议设置为物理内存的25%~35%。比如终端4GB内存就可以划出1GB~1.5GB作为vDisk读缓存8GB内存则划2GB~3GB。但这个值不是越大越好要留足系统运行本身的内存需求尤其要防止内存缓存撑爆导致系统换页。SSD缓存盘的容量预留建议不低于20%的OP空间。很多人在终端上加装固态盘做缓存却忽略了SSD主控的垃圾回收和磨损均衡需要预留空间。把SSD塞到98%满主控的GC操作会频繁到飞起反而降低读写性能加速颗粒老化。我一般给终端用的SSD缓存盘只分80%容量出去用剩下的20%作为隐藏OP。写缓存的回写时机看两个条件时间阈值和容量阈值。建议设置成“每30秒回写一次”或“缓存使用率超过70%时立即回写”。这两者触发其一就开始回传重点是避免缓存长期接近满负荷导致突发回写风暴。有朋友问那我把回写频率调低一点比如5分钟一次不是更省IO吗理论上可以但风险在于如果终端断电或死机这5分钟内未回写的数据直接丢失用户保存的文档可能就没了。VOI环境下终端数量多、重启频繁我个人的安全底线是60秒内必须回写一次不建议为了极致IO性能牺牲数据安全。热点镜像可以预加载到服务器内存盘。如果服务器的内存足够大比如64GB以上可以把最高频使用的基础镜像文件直接放入内存盘终端启动时直接从内存读取完全绕开物理磁盘。这个方案适合“所有终端启动同一个母镜像”的场景效果比任何SSD缓存都好。不过要留意服务器要预留足够内存给虚拟化平台本身和写缓存不能全部压给读写内存盘否则服务器内存一紧张其他虚拟机都会跟着遭殃。3.3 缓存命中率怎么看低了怎么排查缓存命中率是判断vDisk缓存优化是否到位的关键指标。在主控台上一般能看到“读命中率”“写命中率”“回写队列长度”这几个指标。我的经验值是读命中率正常应该在85%以上。如果低于80%说明终端本地缓存没有把热点数据留住常见原因包括缓存容量太小、缓存盘故障、镜像版本频繁更换导致缓存失效。回写队列长度不应该长期超过缓存容量的50%。如果队列长期堆积说明回写间隔太长或网络带宽不足需要调快回写频率或者检查交换机端口是否降速到百兆。有一次我给一家连锁门店做优化发现读命中率只有60%左右排查半天最后发现是门店终端每天晚上断电而SSD缓存盘在断电前没有完成回写数据的落盘。第二天开机缓存盘需要重新校验期间缓存命中率暴跌。这个问题的解法是在vDisk策略里开启“缓存延时落盘”和“平滑关机”功能同时给终端配置UPS或调整门店的关机流程避免冷断电。这类实战中的细微之处往往是参数表上写不清楚的只能靠现场踩坑积累。4. 存储与网络侧的配合优化让数据管道不再成为短板4.1 服务器端存储方案怎么选阵列级别与SSD分层把终端侧的缓存策略调好了服务器端的存储压力会大大降低但这块本身也不能拖后腿。服务器端存储分两个层面一个是承载vDisk镜像文件本身的存储一个是承载终端回写数据的存储。镜像文件存储主要是“读”压力对顺序读带宽和并发读IOPS都有要求。如果是机械盘强烈建议RAID 10而不是RAID 5。RAID 5虽然空间利用率高但写操作伴随奇偶校验计算而且单盘故障后的重建性能很差在并发读取场景下RAID 10的随机读性能大约是RAID 5的1.5倍到2倍而且坏一块盘不影响阵列整体可用性。如果有条件镜像存储用SATA SSD组RAID 10或者直接在服务器上加PCIE NVMe盘做镜像热点缓存效果立竿见影。再深入一层可以用“分层存储”方案把“高频访问的母镜像”放在SSD层把“低频访问的备份镜像、日志”放在机械盘层。很多存储系统自带自动分层功能如果没有手动把核心镜像文件“钉”在SSD上也行。记住存储层级的核心思路就是把80%的IO请求压到20%的高速存储上。回写数据的存储主要是“写”压力对写入延迟和随机写性能要求高。终端回传的数据比较碎单次写入量不大但频率高。这里不要用机械盘阵列来做回写存储否则很容易被写入延迟拖垮。我一般建议单独划一块SSD空间作为回写存储池容量不需要太大——能容纳全场终端高峰期的回写数据即可关键是要有可靠的掉电保护。4.2 网络参数调优巨型帧、多播部署与端口缓冲VOI架构的IO不只是存储系统内的“内部读”还牵扯到服务器到终端之间的“网络传输”。网络侧有几个参数值得重点看。巨型帧Jumbo Frame。把服务器网卡和交换机端口统一开启巨型帧MTU从1500提升到9000。这意味着同样传输10GB的镜像数据所需的数据包数量大幅减少CPU中断次数也显著降低。镜像传输和终端启动加载都能明显提速。注意必须保证服务器的网卡、交换机的相关端口、终端网卡三端的MTU设置一致只要有一个环节还停留在1500就无法正常通信甚至会出现“能ping通但传输极慢”的奇葩故障。多播部署PXE MultiCast。在批量给终端分发镜像的时候默认的单播模式意味着服务器要同时向每一台终端独立发送一份数据50台终端就要发50份。多播模式下服务器只发一份数据流交换机复制后分发到各个终端整个镜像分发的耗时从“乘以终端数量”变成“基本等于单台耗时”。多播部署要用在“批量初始化”的场景日常增量更新则可以用“差异盘”功能只传输变化部分效率更高。交换机的端口缓冲和流控。在启动风暴高峰期交换机端口可能因为瞬时流量过大而出现丢包TCP重传会加剧网络拥塞。如果有条件选择带较大端口缓冲的交换机在关键端口开启IEEE 802.3x流量控制避免因丢包导致的无意义重传。网络是容易被忽略的IO瓶颈很多卡顿问题排查到最后发现是交换机某个端口协商成了百兆或者网线质量太差导致CRC错误包飙升。5. 常见问题与排查技巧实录5.1 典型问题速查表把日常运维中遇到的典型IO问题整理成一张速查表方便大家对照排查。这张表里的场景都是我实际处理过或同行群里反复讨论过的故障现象可能原因排查顺序开机卡在“正在加载操作系统”进度条不走服务器镜像文件大量碎片化网络丢包终端网卡协商速率异常先看服务器磁盘队列长度再ping网关测延迟与丢包最后看终端网卡协商速率终端运行中集体卡顿过一会恢复写缓存回写风暴服务器回写存储IOPS被打满看vDisk回写队列长度看服务器回写存储盘的平均队列长度个别终端卡其他终端正常该终端本地缓存盘故障缓存盘容量耗尽网线/端口故障先换缓存盘测试再换网线/网口测试镜像更新后所有终端变慢镜像未完成缓存预热终端缓存策略被重置检查缓存命中率重新做一遍镜像缓存预热服务器CPU和内存都不高但终端还是卡存储子系统IOPS达到上限网络端口拥塞看存储延迟和网络端口丢包统计不要只看CPU和内存终端使用中死机重启后数据丢失写缓存回写间隔设置过长终端断电调短回写间隔检查终端断电策略增加UPS这张表里几乎每一条都对应着我在前文讲过的某个优化点。如果你把前面几个部分的优化都做扎实了表中大部分问题出现的概率都会大幅下降。5.2 排查IO瓶颈的三板斧看队列长度、看缓存命中率、看网络丢包当问题真出现时怎么快速定位我通常用三个手段能覆盖90%的IO瓶颈场景。第一板斧是看服务器端的磁盘队列长度。在Windows性能监视器里添加PhysicalDisk(_Total)\Avg. Disk Queue Length和PhysicalDisk(_Total)\Avg. Disk sec/Read、Avg. Disk sec/Write这几个计数器。正常机械盘队列长度应该小于2SSD应该小于1。如果随机读延迟超过50毫秒写延迟超过20毫秒说明存储确实已经处于过载状态这时候不是再调参数能解决的得从缓存命中率和存储扩容两个方向入手。第二板斧是看vDisk的缓存命中率和回写队列。第3部分已经讲过怎么调这里不再重复只强调一点回写队列如果长期持续超过60%无论用什么参数都改善不了的话基本可以断定是回写存储的IOPS不够了单纯调整参数是治标不治本需要给回写存储扩容或升级。第三板斧是看网络丢包和重传率。在服务器上跑ping 网关地址 -t同时记延迟再用iperf测一下服务器和终端的实际传输带宽。如果延迟正常但实际传输带宽只有标称值的30%以下很大概率是网线质量、交换机端口或MTU设置的问题。我遇到过一个案例千兆环境里做镜像分发只有30MB/s的速率折腾了很久最后发现是终端侧的网线有一段压线没压好导致协商成了百兆。换网线后速率直接冲到110MB/s。另外一个容易被忽略的点是在排障时保留“优化前”的完整数据。哪怕只是记录一下优化前一台终端开机需要多长时间、服务器侧磁盘队列峰值是多少优化后再对比一遍心里就有数了。我在每次项目里都会在维护日志里记这样一张对比表哪一步优化带来了多少提升一目了然对以后复盘和改进也特别有帮助。最后说几句实在话。VOI架构下vDisk的IO优化本质上不是某一个参数、某一台设备的问题而是一个“系统层做减法、缓存层做命中、存储网络层做带宽”的系统工程。先把Windows自带的后台IO动作砍到干净再让缓存策略足够聪明最后才轮到考虑硬件扩容。按这个顺序走一遍很多原本以为非得加服务器才能解决的问题其实在软件和配置层面就能化解大半。我在实际项目里的体会是同样的服务器硬件光把系统层和缓存策略优化扎实带机量提升20%到30%是完全可行的。这篇文章先把主线的四层优化思路讲清楚以后有机会再和大家聊聊差异化镜像在多层软件环境里的更新策略那些“在路上了”的坑只会比IO瓶颈更头疼。
返回列表