虚拟化场景下如何进行IO性能优化
问题现象描述
在鲲鹏服务器下进行虚拟机(8C16G)裸盘(预分配80G)fio 4k随机写测试(4jobs,iodepth为32),性能不符合预期,需要进行调优。
关键过程、根本原因分析
- 执行测试命令,观察鲲鹏服务器表现:
物理机上,发现KVM进程CPU占用较高,进一步分析发现鲲鹏服务器上KVM线程200+。
虚拟机上,鲲鹏服务器cpu0占用率很高,其中软中断占比高的不合理。
怀疑是虚拟机实现方式的问题,发现鲲鹏服务器虚拟机测试磁盘类型为virtio-scsi-device,且当前测试使用的QEMU版本较低,可能还不支持ARMv8新特性。
- 修改鲲鹏服务器虚拟机启动参数,将测试盘类型调整为virtio-block-device,性能有小幅提升,物理机上KVM线程数从200+降低到80以内,虚拟机上cpu0的软中断也较低到合理范围,但系统占用又变得很高,说明kvm线程和软中断高是磁盘类型导致,此时是CPU瓶颈。无法给鲲鹏服务器虚拟机指定cpu asimd特性,显示参数错误。
- 将虚拟机vCPU一对一绑核,关闭irqbalance,给fio测试程序绑核,几乎没有性能提升。开启大页内存,没有性能提升。
- 分析fio系统调用,发现clock_gettime系统调用耗时有时达到2ms,耗时很高,此客户机操作系统为3,更换为CentOS 7.7,fio系统调用看不到clock_gettime函数,但是性能没有提升。
- 使用原生0.0版本测试,性能有一定提升;进一步重新编译QEMU,加上对native aio的支持,性能提升较大。此时,虚拟机上仍然是cpu0占用特别高,物理机上观测一个vCPU线程CPU占用特别高,QEMU主线程CPU占用不高。
- 尝试给磁盘配置iothread卸载QEMU主线程压力、对磁盘添加write-cache=on和ioeventfd =on等属性、排查鲲鹏服务器物理机上对应SSD的性能表现,没有性能提升。将物理机上SSD的调度策略由默认的cfq调整为noop,性能有一定提升。
- 使用virtio-blk支持的multiqueues磁盘多队列特性,使虚拟机的性能有较大提升,虚拟机上单个CPU占用特别高的问题得到解决。
- 进一步优化,将IOMMU模式配置为passthrough,性能有进一步提升。
结论、解决方案及效果
虚拟化场景IO测试,IO路径较长,且不同类型磁盘IO路径也不同。首先需要确认磁盘bus类型(scsi、ide、virtio),保证使用的磁盘文件的协议(nfs、iscsi、本地挂载)是一致的,保证磁盘文件在对应物理机上创建的规则是一样的(预分配、缓存特性等)。
- 如果判断是单核瓶颈,可以尝试使用磁盘多队列特性。这种优化针对的是virtio-blk设备,在使用前需要注意QEMU和guest操作系统的版本要求。
- 如果是QEMU主线程占用率过高的问题,可以考虑开启iothread以分担负载。需要注意的是,这可能会影响动态迁移功能,因此需要进行进一步的研究和调查。
- 将磁盘异步调用设置为native可以提高性能,但是需要注意一些使用限制。该功能不能用于sparse images,否则在文件系统元数据需要更新时会导致QEMU线程阻塞。因此,在使用该功能之前,需要仔细了解自己的使用需求。
实际测试中,在进行瓶颈分析时需要结合虚拟机和物理机两者的系统表现。虚拟机的CPU、IO等占用信息不一定是真实的,因为虚拟机中的KVM线程本身也会被调度和阻塞,这可能会导致虚拟机的性能表现不准确。
- 使用最新版本的QEMU,GUEST OS也尽量使用更高版本。
- 使用virtio-blk磁盘多队列特性。
- 将虚拟机异步IO模式配置为native。
- 若虚拟化场景无需使用磁盘、网卡直通或SRIOV特性,则可关闭SMMU。
父主题: 其他