磁盘性能优化
Libvirt具备使用IOThreads实现专用磁盘访问(针对支持的设备)的能力。这些是专门的事件循环线程,用于执行块I/O请求,并在SMP系统上提高可扩展性。KubeVirt通过ioThreadsPolicy设置公开了这一libvirt特性。此外,每个Disk设备还提供了一个dedicatedIOThread设置。这是一个布尔值,表示指定的磁盘应分配一个独占的IOThread,该IOThread不会与其他磁盘共享。
当前有效的策略包括shared和auto。如果完全省略ioThreadsPolicy,则会禁用IOThreads的使用。但是,如果有任何磁盘请求了独占的IOThread,ioThreadsPolicy将被启用,并默认为shared。
共享
ioThreadsPolicy设置为shared时,表示KubeVirt应使用一个线程,由所有磁盘设备共享。这一策略源于大量IOThreads通常并无益处,因为每个线程都会带来额外的上下文切换开销。
将dedicatedIOThread设置为true的磁盘不会使用共享线程,而是分配一个专属线程。如果预期某个特定磁盘会有大量的I/O流量(例如数据库主轴),这通常很有用。
自动
auto IOThreads表示KubeVirt应使用一个IOThread池,并以轮询方式将磁盘分配给IOThreads。池的大小通常限于分配给虚拟机(VM)的VCPU数量的两倍。这本质上试图将磁盘分配给不同的IOThreads,但只限于合理的上限。例如,在具有大量磁盘和较少CPU数量的系统中,这一点会发挥作用。
关于IOThread池的大小,设置了dedicatedIOThread的磁盘始终会保证拥有自己的线程。这实际上降低了分配给其余磁盘的线程数量的上限。例如,一个拥有2个CPU的虚拟机通常会为所有磁盘使用4个IOThreads。但如果有一个磁盘将dedicatedIOThread设置为true,那么KubeVirt只会为共享池使用3个IOThreads。
总会至少有一个线程用于那些将使用共享IOThreads池的磁盘。因此,如果足够多的磁盘被分配了独占的IOThreads,auto和shared策略最终会导致相同的布局。
带有独占(绑定)CPU的IOThreads
当虚拟机的vCPU被绑定到主机的物理CPU时,最好也将IOThreads绑定到特定的CPU,以防止它们在CPU间漂移。KubeVirt将自动计算并绑定每个IOThread到一个CPU或一组CPU,这取决于它们之间的比例。如果有更多IOThreads比CPU,每个IOThread将以轮询方式被绑定到一个CPU。否则,当IOThreads少于CPU时,每个IOThread将被绑定到一组CPU。
带有QEMU模拟器线程和独占(绑定)CPU的IOThreads
为了进一步改进vCPU的延迟,KubeVirt可以为模拟器线程分配额外的独占物理CPU,将其固定于此。这将有效地“隔离”模拟器线程与VMI的vCPU。当ioThreadsPolicy设置为auto时,IOThreads也会被“隔离”,并与QEMU模拟器线程放在同一物理CPU上。