现象
自己编的 spdk 程序, 有时候能跑起来, 经过多次启停之后, 偶尔会出现下面的现象:
0 0x0000000000052dc5 ucs_debug_print_backtrace() /home/dengke/ucx-1.9.0/src/ucs/debug/debug.c:656
1 0x00000000006175e0 _spdk_msg_queue_run_batch() /root/workspace/join/essd/third-party/spdk/lib/thread/thread.c:430
2 0x00000000006175e0 spdk_thread_poll() /root/workspace/join/essd/third-party/spdk/lib/thread/thread.c:506
3 0x00000000005cd158 _spdk_reactor_run() /root/workspace/join/essd/third-party/spdk/lib/event/reactor.c:337
4 0x000000000062b79f eal_thread_loop() ???:0
5 0x0000000000007ea5 start_thread() pthread_create.c:0
6 0x00000000000fe8dd __clone() ???:0
解决方法
- 检查大页空间是否足够
cat /proc/meminfo
如果大页空间不够, 用 dpdk/tool/ 下的脚本申请新的大页内存
- rm /dev/shm/your_test_program
删掉spdk进场在/dev/shm下残留的文件
归因分析
看下图:可以看到 msg 为NULL了:
assert 时候没有core . 看到 messages 里几个元素都是空的 (值为0).
另外这个数据结构是thread safe,需要排查是不是单核单线程在处理.
每个IO都在一个线程上,如果通过msg发给另外一个线程,那完成后需要发回原始接到IO的线程。可以参考下bdev层QoS的实现,线程间也是通过msg。最重要的是IO哪里接到的,需要从哪个线程回去。这样大致一样的,哪个线程上注册的,哪个线程上un register。
spdk 程序启动后, /dev/shm 下面的这些共享内存是用来映射大页的,是下面DPDK用来组织大页需要的。