背景
再测试环境中遇到IO超过分钟级没回来的场景。通过日志分析为什么会有分钟级IO没有返回
分析定位
通过存储的日志发现,有批量的IO有超过秒级的返回
追查后发现,bdev层注册到spdk reactor的poller有长时间没有被调用
查看当前进程的线程运行的状态发现在该线程上的另一个poller一直在运行。
查看spdk的代码代码如下
再处理zcopy特性的时候接收到内核的ERRQUEUE的时候,存在一个循环,如果没有跳出循环则死循环无法调度到下一个poller。通过gdb 发现在处理的这个serr的内存数据如下
通过变量和代码分析出判断死循环无法退出。导致异常
后续修复
SPDK默认在编译环境如果支持zcopy的话是默认开启的,可以通过以下方式修复: