---
title: 虚拟化场景下如何进行IO性能优化
description: "在鲲鹏服务器下进行虚拟机（8C16G）裸盘（预分配80G）fio 4k随机写测试（4jobs，iodepth为32），性能不符合预期，需要进行调优。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengcpfs/troubleshooting/trouble/kunpengcpfs_09_0024.html
sourcePath: /source/zh/kunpengcpfs/troubleshooting/trouble/kunpengcpfs_09_0024.html
indexId: 5d5296eb7a14f4f06c904353b122af11e6f6d581d682e3d14a62d0fb6782c46971
---
# 虚拟化场景下如何进行IO性能优化

#### 问题现象描述

在鲲鹏服务器下进行虚拟机（8C16G）裸盘（预分配80G）fio 4k随机写测试（4jobs，iodepth为32），性能不符合预期，需要进行调优。


#### 关键过程、根本原因分析

1. 执行测试命令，观察鲲鹏服务器表现：
  物理机上，发现KVM进程CPU占用较高，进一步分析发现鲲鹏服务器上KVM线程200+。

  虚拟机上，鲲鹏服务器cpu0占用率很高，其中软中断占比高的不合理。

  怀疑是虚拟机实现方式的问题，发现鲲鹏服务器虚拟机测试磁盘类型为virtio-scsi-device，且当前测试使用的QEMU版本较低，可能还不支持ARMv8新特性。

2. 修改鲲鹏服务器虚拟机启动参数，将测试盘类型调整为virtio-block-device，性能有小幅提升，物理机上KVM线程数从200+降低到80以内，虚拟机上cpu0的软中断也降低到合理范围，但系统占用又变得很高，说明KVM线程和软中断高是磁盘类型导致，此时是CPU瓶颈。无法给鲲鹏服务器虚拟机指定cpu asimd特性，显示参数错误。
3. 将虚拟机vCPU一对一绑核，关闭irqbalance，给fio测试程序绑核，几乎没有性能提升。开启大页内存，没有性能提升。
4. 分析fio系统调用，发现clock_gettime系统调用耗时有时达到2ms，耗时很高，此客户机操作系统为3，更换为CentOS 7.7，fio系统调用看不到clock_gettime函数，但是性能没有提升。
5. 使用开源的0.0版本测试，性能有一定提升；进一步重新编译QEMU，加上对native aio的支持，性能提升较大。此时，虚拟机上仍然是cpu0占用特别高，物理机上观测一个vCPU线程CPU占用特别高，QEMU主线程CPU占用不高。
6. 尝试给磁盘配置iothread卸载QEMU主线程压力、对磁盘添加write-cache=on和ioeventfd=on等属性、排查鲲鹏服务器物理机上对应SSD的性能表现，没有性能提升。将物理机上SSD的调度策略由默认的cfq调整为noop，性能有一定提升。
7. 使用virtio-blk支持的multiqueues磁盘多队列特性，使虚拟机的性能有较大提升，虚拟机上单个CPU占用特别高的问题得到解决。
8. 进一步优化，将IOMMU模式配置为passthrough，性能有进一步提升。


#### 结论、解决方案及效果

虚拟化场景IO测试，IO路径较长，且不同类型磁盘IO路径也不同。首先需要确认磁盘bus类型（scsi、ide、virtio），保证使用的磁盘文件的协议（nfs、iscsi、本地挂载）是一致的，保证磁盘文件在对应物理机上创建的规则是一样的（预分配、缓存特性等）。

- 如果判断是单核瓶颈，可以尝试使用磁盘多队列特性。这种优化针对的是virtio-blk设备，在使用前需要注意QEMU和guest操作系统的版本要求。
- 如果是QEMU主线程占用率过高的问题，可以考虑开启iothread以分担负载。需要注意的是，这可能会影响动态迁移功能，因此需要进行进一步的研究和调查。
- 将磁盘异步调用设置为native可以提高性能，但是需要注意一些使用限制。该功能不能用于sparse images，否则在文件系统元数据需要更新时会导致QEMU线程阻塞。因此，在使用该功能之前，需要仔细了解自己的使用需求。

实际测试中，在进行瓶颈分析时需要结合虚拟机和物理机两者的系统表现。虚拟机的CPU、IO等占用信息不一定是真实的，因为虚拟机中的KVM线程本身也会被调度和阻塞，这可能会导致虚拟机的性能表现不准确。

1. 使用最新版本的QEMU，GUEST OS也尽量使用更高版本。
2. 使用virtio-blk磁盘多队列特性。
3. 将虚拟机异步IO模式配置为native。
4. 若虚拟化场景无需使用磁盘、网卡直通或SRIOV特性，则可关闭SMMU。
