KVM IO 线程配置
iothread 把虚拟磁盘的 IO 处理从主线程分离到独立线程,减少 vCPU 与存储路径互相抢占带来的抖动。多盘、高队列深度的场景里效果明显,通常配合 virtio-scsi 控制器使用。它不是一个「开着就快」的开关:线程数量要与磁盘数量、队列深度和宿主核数匹配,配得过多反而增加调度开销。
基本信息
| 域级声明 | 在域 XML 中声明 iothreads 数量 |
|---|---|
| 盘级引用 | 在磁盘或控制器的 driver 属性上引用具体的 IO 线程编号 |
| 查看 | virsh iothreadinfo 查看线程与映射关系 |
| 动态调整 | iothreadadd / iothreaddel / iothreadset 支持运行时增删与调整 |
| 数量规划 | 按存储设备数与队列深度规划,改动后以压测结果为准 |
典型使用场景
- 多数据盘业务:数据库、日志与备份盘分别处理,避免互相阻塞
- 高 IOPS 负载:存储 IO 与 vCPU 抢占明显时分离处理路径
- 性能调优:对比启用前后同一负载的时延与抖动
- 多虚机宿主:控制单虚机的 IO 线程数量,避免线程过多相互干扰
- 排障:IO 等待高但 CPU 不满时,检查 IO 处理路径是否成为瓶颈
XML 片段:1 个 IO 线程加 virtio-scsi 控制器
XML 片段:1 个 IO 线程加 virtio-scsi 控制器
<iothreads>1</iothreads>
<controller type='scsi' model='virtio-scsi'>
<driver iothread='1' queues='4'/>
</controller>
<!-- 查看映射:virsh iothreadinfo vm1 -->
<!-- 动态新增:virsh iothreadadd vm1 2 -->配置项读法
| 配置 | 位置 | 说明 |
|---|---|---|
| iothreads | 域级 | 声明的 IO 线程总数 |
| driver iothread | 控制器或磁盘 | 指定该设备使用哪个线程 |
| queues | 控制器 driver | 队列数量,需 guest 侧配合 |
| iothreadinfo | virsh 命令 | 查看线程与设备的对应关系 |
IO 线程数量按存储设备与队列深度规划,并非越多越好,改动后以 fio 复测为准,用数据判断是否真的快了。
调整 IO 线程属于结构性变更:可能涉及停机与设备重新挂载,改动前先记录原配置,异常时能快速回到改动前的状态。
队列数量需要两端匹配:宿主侧设置队列数,guest 内驱动与中断分布也要相应生效,只配一侧往往看不到收益。
改动后按同一压测口径对比时延与抖动:吞吐略降但尾延迟明显改善,对交互型负载通常是可以接受的取舍,别只盯着单一数字作判断。