问题还原
测试同事在进行vdbench测试出现长时间断流,别的同事没有找到原因,问题最终来到我这里,jira记录没有做故障,后端服务进程正常。
现场没有了,还好保存了crash core,需要分析crash来定位。
crash分析
1. 加载我们的内核模块
2. 打印所有进程栈信息,查看可疑的进程栈
|
|
通过查看所有的进程栈,发现:
dataio_srv是我们的数据服务线程,发现有三个服务线程都被卡在一个rw_semaphore上了,ffs_get_user_page函数会申请mmap_sem读信号量,分析应该是有进程请求写信号量而之前有读未释放导致。
3. 找到对应的mm_struct地址进入得到mmap_sem的地址为0xffff8b92ab737e20
读写信号量的等待队列结构为struct rwsem_waiter,遍历这个链表即可获得所有等待在这个信号量的task。
|
|
|
|
4. 请求写信号量的栈
5. 查找拿着读信号量的进程
__do_page_fault会拿着mmap_sem的读信号量,然后22134线程会发送读命令给dataio去后端读取数据,但是dataio线程卡在这个信号量了(因为12862请求了些信号量,后续请求读读信号量会排在写信号量之后),这就导致了死锁。