前段时间,参与了我司基于dpdk的高速数据包转发模式项目,在开发的过程,我们遇到一个奇怪的coredump事件,考虑到其定位过程比较特殊,又是关于的dpdk定位过程,故记录在此。
背景:
我司的产品是个典型的数据转发为导向的项目,业务逻辑在流量高并发情况下,可能连5%都占不到。所以我们在dpdk的开发套件上,完成一些特性,支持了我们的业务。其系统配置如下:
version: dpdk17.11
system: ubuntu14.04 server
线程:dpdk接管8个超线程
现象:
数据面在做稳定性测试时,使用tc模拟数据报文高并发冲击测试,大约半个小时左右会出现一次coredump,且每次出现的core文件的记录基本都是挂在在rte_pktmbuf_read。如果流量不大的话,则未出现异常现象。如下,是一次coredump的堆栈信息。
分析:
查看mbuf的指针在rte_pktmbuf_read时还是有地址的, 在调用内置的封装函数__rte_pktmbuf_read时, 该mbuf的指针地址突然变成了0, 显然程序在访问这个mbuf时产生了异常,造成coredump。
上一步函数入参还是正常,下一步入参直接地址变成了0,为什么会出现这种情况?如果是单线程,绝不可能出现这种情况的(不考虑硬盘,内存等硬件的问题,因为这个一个必现的问题)。考虑到是多线程程序,第一个假设就是多线程引起的野指针问题(后来证明的确是由于多线程的临界区抢占造成的)。
定位过程:
一、验证多线程
为了证明该coredump确实是个多线程引起的,我去验证了在不同的线程数下,coredump出现的频率。如下是验证结果:
线程数 |