现象

自己编的 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用来组织大页需要的。