在一台运行虚拟化业务的随身服务器上,磁盘顺序读取很快,随机写入却偶发卡到数百毫秒;调整虚拟机里的IO调度器后,宿主机上的延迟曲线几乎没有变化。问题往往不在“调度器有没有切换”,而在客体请求是否真正抵达宿主机队列,以及宿主机的块层队列深度是否被并发任务推满。
如果你正在选机器,或者想先把线路和配置跑通再谈长期方案,可以先看看这几家的线路说明和技术参数:野草云(全球云服务器),先看清带宽线路、流量策略和退款条款,再决定要不要迁。
客体系统里的调度器,作用于虚拟磁盘设备向上提交的请求。常见的电梯调度算法会按扇区位置排序、合并相邻请求,再决定下一次派发哪些块请求;请求合并深度越大,越容易把连续的小写入拼成大请求,但等待合并也可能增加单次请求延迟。对顺序任务,电梯式排序有利于减少寻道和乱序提交;对随机写,它却可能让一个小请求等待邻近请求,或者把许多随机请求积压在设备队列中。
宿主机一侧是另一层边界。虚拟机发出的请求经过虚拟化驱动后,可能被映射到宿主机块队列,再由宿主机的电梯、截止时间或公平队列策略处理。若使用多队列virtio磁盘,客体的多个队列通常会映射到宿主机对应队列或CPU队列组;此时只改客体内的调度器,未必能改变宿主机最终的派发顺序。判断依据应是请求路径,而不是宿主机上看到的“调度器名称”。

因此,客体调度器更适合解决虚拟机内部的请求排序、合并和公平性,宿主机队列则决定多个虚拟机共享物理SSD时如何分配服务能力。把两层混为一谈,常导致两个误判:一是以为关闭客体调度器就能关闭宿主机的合并,二是以为提高客体的块层队列深度就能提高宿主机吞吐。前者通常不成立,后者还可能让更多并发请求同时争抢同一块设备。
顺序负载优先看吞吐和请求合并收益。先固定文件大小、块大小、并发数和缓存状态,再逐级增加队列深度,分别测试深度1、4、8、16、32、64、128。记录带宽、平均IOPS、设备利用率和请求等待时间,并观察队列是否从“持续有请求”变成“周期性被填满”。若深度超过16后带宽不再上升、平均延迟却持续抬升,继续加深度只会放大排队,而不是提升性能。顺序任务通常可优先尝试减少不必要合并、限制并发上限的方案。
随机写负载则必须盯住随机写尾延迟,不能只看平均IOPS。应同时采集p95、p99和p999尾延迟,记录队列深度、合并等待、设备队列长度以及宿主机其他租户的干扰。随机访问缺少天然顺序,电梯算法强行排序可能增加等待;固定截止时间的调度器更容易控制单次请求的服务上界,但收益会受SSD内部并行通道限制。若p99抖动主要出现在宿主机队列,而非客体内等待,就应把优化重点移到宿主机的队列隔离、并发限制和设备服务策略。

切换调度器时要做调度器切换验证:每次只改变一个变量,保持虚拟机、镜像、文件系统、缓存预热和压测脚本一致;切换前后保存调度器状态、队列深度和延迟分位数,并用同样的阶梯序列重复至少三轮。常见坑包括未清理缓存、把首次预热计入结果、只测平均值,以及在切换后没有确认模块实际生效。若尾延迟随深度呈阶梯式恶化,才说明队列已经进入拥塞区间;若某个深度明显稳定,可把它作为生产环境的保守上限。
传统电梯调度算法并不追求随机写的即时完成,而是尽量减少磁头寻道和方向切换。块层先把相邻请求排序、合并,再交给设备;请求合并深度越大,吞吐通常越高,但等待被合并或刷回的时间也可能更长。调整块层队列深度时,应先确认瓶颈究竟在CPU、队列、设备服务时间还是后端存储,不能把更大的队列简单理解为更低的时延。
随机写的尾延迟常由同步刷盘、文件系统日志、元数据更新和设备缓存共同造成。调度器只能改变请求到达设备的顺序,不能消除fsync的同步点。若只观察平均吞吐,容易掩盖少量请求的长时间排队;验证时应同时采集平均延迟、P95、P99和P99.9,并区分合并前等待、队列等待与设备执行时间。

在线切换调度器前,应记录当前调度器、块设备拓扑、队列参数和NUMA亲和性,并确认目标调度器支持多队列设备。运行时切换通常作用于指定块设备,命令参数因内核版本而异;切换后要重新检查请求合并、队列深度及设备缓存策略,不能只以系统无报错作为成功标准。动态调节nr_requests还会改变内存占用和并发压力,队列过深可能引发超时、重试和尾延迟抖动。
基准测试必须使用同一数据集、块大小、文件布局、并发数和fsync频率,并分别覆盖顺序读写、同步随机写及混合负载。不要只在热缓存下测一次,也不要用dd的单次结果代表稳态表现;还要对比冷启动、热缓存、设备重启后以及后台任务空闲与繁忙等场景。除iostat外,可用blktrace定位排队与完成间隔,用fio保存完整延迟分布,并结合pidstat确认CPU并未成为新瓶颈。
可执行检查清单:①保存切换前后的调度器、队列参数和内核日志;②一次只改一个变量,并设置可回滚阈值;③以吞吐、平均延迟、P99和P99.9共同验收,同时记录CPU、IOPS、await和队列深度;④确认业务写入方式、文件大小与持续时间一致;⑤在目标硬件上进行长时间稳定性测试;⑥若尾延迟恶化,立即回退并复测。最终不只看跑分,还要确认错误率、超时率、资源占用和业务SLA均满足要求。