一种linux内核自旋锁死锁检测报告系统和方法与流程

文档序号:11177009阅读:634来源:国知局
一种linux内核自旋锁死锁检测报告系统和方法与流程

本发明涉及内核死锁检测领域,具体的说是一种linux内核自旋锁死锁检测报告系统和方法。



背景技术:

linux内核死锁是长期困扰内核开发人员的问题之一,但自内核引入lockdep调试模块之后,内核死锁得到了快速定位和解决。linux开发人员为了实现一定功能,会开发自己的内核模块加载到内核以实现一定的内核功能,这种方式可能会引入内核死锁。由于lockdep是内核调试模块,主要用于内核开发中死锁检查,现有lockdep是内核debug模块,开启此功能需要重新编译内核。常规内核不会开启此选项,因此正常系统不包含此功能,因此正常系统下定位死锁更为困难。



技术实现要素:

本发明针对目前技术发展的需求和不足之处,提供一种linux内核自旋锁死锁检测报告系统和方法。

本发明所述一种linux内核自旋锁死锁检测报告系统和方法,解决上述技术问题采用的技术方案如下:所述linux内核自旋锁死锁检测报告系统,其系统架构主要包括内核态以及内核kpatch模块、用户态以及日志报告模块、通信模块;其中,内核态中生成内核kpatch模块,用户态中生成日志报告模块,并且内核kpatch模块通过通信模块与日志报告模块通信交互;

内核态中通过内核kpatch模块获取内核自旋锁死锁信息,通信模块将内核自旋锁死锁信息封装传输到用户态的日志报告模块,通过日志报告模块解析封装的内核自旋锁死锁信息,生成自旋锁死锁日志报告。

优选的,所述内核kpatch模块:是通过修改对应版本内核源码,实现获取内核自旋锁死锁信息功能,再通过kpatch-build命令生产内核kpatch模块。

优选的,所述通信模块:是通过netlink网络连接,实现内核态和用户态通信,将获取的内核自旋锁死锁信息封装后传输到用户态。

优选的,所述日志报告模块:对发送过来的内核自旋锁死锁信息进行解析,生成自旋锁死锁日志报告。

一种linux内核自旋锁死锁检测报告方法,通过修改对应版本内核源码,实现获取内核自旋锁死锁信息功能,并通过kpatch-build命令生成内核kpatch模块加载到内核中;然后,通过内核kpatch模块获取内核自旋锁死锁信息;通过通信模块网络链接实现内核kpatch模块与用户态中日志报告模块通信,将获取的内核自旋锁死锁信息传输到用户态;最后,用户态的日志报告模块对内核发送来的自旋锁死锁信息进行解析,生成自旋锁死锁日志报告。

优选的,生成内核kpatch模块的主要过程如下:

安装配置系统版本对应kpatch打包环境,修改内核源码实现获取自旋锁死锁信息功能;然后对比修改前后内核源码生成kpatch文件,通过kpatch-build命令生成获取死锁功能的内核kpatch模块。

本发明所述一种linux内核自旋锁死锁检测报告系统和方法,与现有技术相比具有的有益效果是:本方法在不编译内核的情况下,实现内核自旋锁死锁检测并报告;克服了启动lockdep内核调试模块死锁检查需要重新编译内核的缺陷,使得故障管理软件具有自旋锁死锁检查报告功能,增强服务器产品竞争力。

附图说明

附图1为linux内核自旋锁死锁检测报告系统的示意图;

附图2为linux内核自旋锁死锁检测报告方法的流程图。

具体实施方式

为使本发明的目的、技术方案和优点更加清楚明白,以下结合具体实施例,对本发明所述一种linux内核自旋锁死锁检测报告系统和方法进一步详细说明。

本发明提出了一种linux内核自旋锁死锁检测报告系统和方法,在不编译内核情况下,通过修改相应的内核源码,实现获取内核自旋锁死锁功能,再利用热补丁kpatch技术,在内核watchdog生成内核检测kpatch模块,动态加载到系统中;通过kpatch模块获取内核自旋锁死锁信息;最后将内核自旋锁死锁信息封装发送到用户态,用户态解析死锁数据并报告。

linux内核提供watchdogsoftlockup(抢占被长时间关闭而导致进程无法调度)机制,为每个cpu启动一个内核线程,该线程为优先级最高的实时线程,该线程得到调度时,会根据相应的计数(时间戳),同时启动定时器,当定时器到期时检查相应的时间戳,如果超时,没有更新,则说明这段时间内都没有发生调度,产生softlockup事件。内核自旋锁死锁满足softlockup产生条件,因此可以通过获取内核softlockup报告信息获取内核自旋锁死锁。

内核热补丁kpatch技术,是在不重新编译内核的情况下,修改内核代码,生成kpatch模块,动态加载到内核中,实现对运行中内核打补丁。

实施例:

本实施例所述linux内核自旋锁死锁检测报告系统,如附图1所示,其系统架构主要包括内核态以及内核kpatch模块、用户态以及日志报告模块、通信模块;其中,内核态中生成内核kpatch模块,用户态中生成日志报告模块,并且内核kpatch模块通过通信模块与日志报告模块通信交互;

内核态中通过内核kpatch模块获取内核自旋锁死锁信息,通信模块将内核自旋锁死锁信息封装传输到用户态的日志报告模块,通过日志报告模块解析封装的内核自旋锁死锁信息,生成自旋锁死锁日志报告。

所述内核kpatch模块:是通过修改对应版本内核源码,实现获取内核自旋锁死锁信息功能,再通过kpatch-build命令生产内核kpatch模块。

所述通信模块:是通过netlink网络连接,实现内核态和用户态通信,将获取的内核自旋锁死锁信息封装后传输到用户态。

所述日志报告模块:对发送过来的内核自旋锁死锁信息进行解析,生成自旋锁死锁日志报告。

所述linux内核自旋锁死锁检测报告方法,通过修改对应版本内核源码,实现获取内核自旋锁死锁信息功能,并通过kpatch-build命令生成内核kpatch模块加载到内核中;然后,通过内核kpatch模块获取内核自旋锁死锁信息;通过通信模块网络链接实现内核kpatch模块与用户态中日志报告模块通信,将获取的内核自旋锁死锁信息传输到用户态;最后,用户态的日志报告模块对内核发送来的自旋锁死锁信息进行解析,生成自旋锁死锁日志报告。

生成内核kpatch模块的主要过程如下:

安装配置系统版本对应kpatch打包环境,修改内核源码实现获取自旋锁死锁信息功能;然后对比修改前后内核源码生成kpatch文件,通过kpatch-build命令生成获取死锁功能的内核kpatch模块。这一过程中,修改内核源码实现获取死锁功能。

修改内核源码的实现过程主要如下:

定义内核死锁数据结构,主要包括:内核链表structlist_head,提供将死锁信息加入链表功能;unsignedintdevice,表示故障设备id,即死锁发生cpu编号;enumlock_typetype,表示死锁类型,判断是否为自旋锁类;unsignedinttask,死锁进程号,表示是哪个进程导致死锁;unsignedintduration,表示已经发生死锁持续时间。

并在softlockup代码实现位置添加获取device、type、task、duration数据;在内核watchdog.c文件的watchdog_timer_fn()函数中,device通过smp_processor_id()函数获取;task通过task_pid_nr(current)函数获取;type通过sprint_symbol(buffer,regs->ip)获取,通过对buffer中字段进行匹配,判断是否是自旋锁(spinlock);duration获取当前处理器duration参数。

采用上述linux内核自旋锁死锁检测报告方法,进行内核自旋锁死锁检查的具体流程如附图2所示:

第一,加载内核自旋锁死锁检测kpatch模块,kpatch模块修改的内核源码开始生效;

第二,判断内核中是否有满足softlockup事件发生,满足条件kpatch模块获取内核自旋锁死锁信息;

第三,判断是否是内核自旋锁死锁信息,满足条件,则将内核自旋锁死锁信息封装数据通过通信模块传输到用户态;

第四,用户态对内核自旋锁死锁数据进行解析,然后报告到日志中。

具体实施方式仅是本发明的具体个案,本发明的专利保护范围包括但不限于上述具体实施方式,任何符合本发明的权利要求书的且任何所属技术领域的普通技术人员对其所做的适当变化或替换,皆应落入本发明的专利保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1