知识卡片

轮询替代中断的高性能驱动设计

专业/工作 · 552.k

内容

中断驱动的I/O模型看似高效——设备完成操作后主动通知CPU,CPU平时可以去做别的事——但中断本身要跨越用户态内核态、引入软件处理的不确定性、并且无法避免上下文切换。SPDK反其道而行之,用异步轮询取代中断:应用线程不停检查设备完成队列的状态,一旦检测到完成就立刻触发回调,因为NVMe规范下检测队列状态只需要读一小段内存,代价极低,而配合CPU的DDIO技术,设备更新的内容会直接进CPU缓存,让轮询的检测几乎不产生额外访存开销。发散:中断和轮询的取舍本质是”低负载下省电省资源”和”高负载下响应最快”之间的权衡——中断适合请求稀疏的场景,一旦请求密集到轮询本身的开销远小于中断切换的开销,轮询就会反过来更优,这也是为什么高频交易、高性能网络(DPDK)也不约而同地选择轮询。

参考来源

《Linux开源存储全栈详解从Ceph到容器存储》第4章《存储加速》