背景
SPDK以轮询方式高效的处理请求,能够最大化的利用CPU达到高性能的目的。
当SPDK应用需要提供大量vhost设备,iSCSI或NVMe-oF服务时,默认情况下,如图1,SPDK内承载各个存储服务工作的协程(基于spdk_thread结构)会均匀分布在SPDK绑定的CPU核心上。这样的设置能够满足SPDK涉及的大多数工作场景。
Figure 1. SPDK Reactor, thread与CPU core的映射关系
但是,每个存储服务的工作协程负载大小会有不同,而且会随时间变化;单个CPU核心上轮询执行的几个存储服务的工作协程,它们的负载总和有可能会超过该CPU核心的计算能力。上述两种条件同时发生时,会出现一种情形,如图2:在某一时刻,SPDK使用的一部分CPU核心承担的负载超过它的计算能力,其上的IO负载会有过高的时延,同时吞吐量也有可能下降;而同一时刻,SPDK使用的另一部分CPU核心,对应工作协程的负载不高,存在一定量的空闲计算能力。
Figure 2. SPDK工作负载不均分布在各个核心
对于追求性能极致的用户来说