timer bug导致系统hard lockup分析

  问题现象:

  系统(android)正常运行一段时间之后就会panic,查看kernel的log发现是发生了hard lockup,相关的log如下:

<4>[ 1815.827575] c0 cpu0 detected cpu1 has HARDLOCKUP!
<4>[ 1815.828063] c0 Modules linked in: sd8xxx(O) citty(O) mlan(O) exfat_fs(P) exfat_core(P) geu(O) galcore(O)

  什么是HARDLOCKUP,简单来说,就是在多核(4核)系统中,如果其中一个核(core1)长时间没有响应timer中断,会被逻辑上的上一个核(core0)检测到,然后系统就会panic。而每次timer中断中watchdog thread都会调度到,所以我们从watchdog thread出发进行调试,首先利用crash工具来查看watchdog/1 上一次被调度到是什么时候。

crash> ps
3008 2 1 e0e29e00 IN 0.0 0 0 [watchdog/1]
crash> struct task_struct e0e29e00
struct task_struct {
exec_start = 1801178161618, // 1801.1178161618

  所以上次watchdog thead被wake up大概是在1801s,大概是在hardlockup发生(1815s)前的14秒。为什么这么长时间了watchdog一直没有被再次调度呢,怀疑是timer除了问题,所以查看core1的next time event 还有timerkeeper。

crash> struct clock_event_device 0xc1a11200
struct clock_event_device {
event_handler = 0xc01596a4 <hrtimer_interrupt>,
set_next_event = 0xc0118470 <twd_set_next_event>,
set_next_ktime = 0,
next_event = {
tv64 = 665477081301 //665.477081301,
},

crash> p timekeeper
timekeeper = $11 = {
total_sleep_time = {
tv_sec = 1139,
tv_nsec = 350860596

  根据上面的数据计算,next time event应该发生在665.47 + 1139 + 0.35 ~ 1805s左右,这个时间点watchdog thread理论上应该被再次wakeup。但是实际上过了将近14s还是没有收到新的timer event,感觉上就是timer变慢了,查看code发现local timer是根据启动的core frequency是配置的,而启动的core frequency是1.2G,而panic的时候core的frequency却只有312M了,差了4倍左右,导致原本只需要等4s现在却需要16s(next time event发生的时间变成1801+16 ~ 1807s),时间大大超出预期,core0就误判core1已经无法响应中断,一个hardlockup就这样被trigger。

时间: 2024-07-30 19:45:00

timer bug导致系统hard lockup分析的相关文章

高并发下Netty4底层bug导致直接内存溢出分析

事故记录: 10点游戏开服,迅速冲破2300+单区同时在线 18点15分,运营反应玩家进不了,准备吃饭的人被抓回来排查故障 发现,由于直接内存被占满,一直在Full GC ,并且回收不掉,所以完全不处理玩家请求,通知运维重启服务器,临时解决. 2.考虑了下是不是把RPC连接数量改成了8条,超时改长了了导致,试着把数量减少,超时改成2个小时,发现直接内存随着时间推移还在增加. 3.把内存数据dump了一份下来,发现是netty底层占用比例大大超出了正常水平. 输出缓冲区ChannelOutboun

MySQL Bug导致异常宕机的分析流程

原文链接:http://click.aliyun.com/m/42521/ 摘要: 本文主要通过一个bug来记录一下如何分析一个MySQL bug的崩溃信息. 版本:Percona 5.7.17-11 一.数据库重启日志分析 terminate called after throwing an instance of 'std::out_of_range' what(): ... 本文主要通过一个bug来记录一下如何分析一个MySQL bug的崩溃信息. 版本:Percona 5.7.17-11

【原创】访问Linux进程文件表导致系统异常复位的排查记录

前提知识: Linux内核.Linux 进程和文件数据结构.vmcore解析.汇编语言 问题背景: 这个问题出自项目的一个安全模块,主要功能是确定某进程是否有权限访问其正在访问的文件. 实现功能时,需要在内核里通过扫描该进程打开的文件表,获取文件的路径,和安全模块里配置的可访问文件的进程白名单进行匹配: 模块会一直到搜索到进程pid为1的进程,也就是init进程.在访问中间某个父进程的文件表时,出现struct task_struct的files指针为空的情况, 导致系统异常复位. 下面就是这次

View的post方法导致的内存泄漏分析

简述: 写这篇文章的缘由是最近项目中查内存泄漏时,发现最终原因是由于异步线程调用View的的post方法导致的. 为何我会使用异步线程调用View的post方法,是因为项目中需要用到很多复杂的自定义布局,需要提前解析进入内存,防止在主线程解析导致卡顿,具体的实现方法是在Application启动的时候,使用异步线程解析这些布局,等需要使用的时候直接从内存中拿来用. 造成内存泄漏的原因,需要先分析View的post方法执行流程,也就是文章前半部分的内容 文章内容: View#post方法作用以及实

程序Bug导致了天大的损失,要枪毙程序员吗?

转自 http://www.cocoachina.com/programmer/20160331/15835.html 号外!号外!走过,路过,不要错过!日本 IT 业的狗血八卦继续独家放送啦!! 2015 年 9 月 3 日,随着东京最高法院驳回瑞穗证券的上诉,维持二审的原判结果,一个长达 10 年的诉讼终于画下了句号.这个判例将对 IT 行业产生深远的影响:如果程序的 bug 导致了巨大的经济损失,应该由谁来承担?用户?运营商?还是系统开发商? bug:计算机程序里的错误 今天故事的主角是,

Linux中进行用户UID测试导致系统报错

今天在Ubuntu14.04下进行了一个小测试,即修改系统文件/etc/passwd的用户UID值,却导致系统Bug,无法正常使用.因为修改/etc/passwd需要root权限,当再次准备使用sudo命令复原文件时,报错: sudo:unknown uid 1000:who are you? 重启之后却直接进入最低权限的guest账号,同时使用sudo命令是报错: sudo:unable to change to root gid:Operation not permitted仍然无法解决.

Redis 未授权访问缺陷可轻易导致系统被黑

Redis 未授权访问缺陷可轻易导致系统被黑 漏洞概要 Redis 默认情况下,会绑定在 0.0.0.0:6379,这样将会将Redis服务暴露到公网上,如果在没有开启认证的情况下,可以导致任意用户在可以访问目标服务器的情况下未授权访问Redis以及读取Redis的数据.攻击者在未授权访问Redis的情况下可以利用Redis的相关方法,可以成功将自己的公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys 文件中,进而可以直接登录目标服务器. 漏洞概述 Redis

程序bug导致了天大的损失,要枪毙程序猿吗?

程序bug导致了天大的损失,要枪毙程序猿吗? 作者: 雷子  发布时间: 2016-03-24 10:34  阅读: 33465 次  推荐: 63   原文链接   [收藏] 文/雷子,来源/公众号:东京 IT 人 号外!号外!走过,路过,不要错过!日本 IT 业的狗血八卦继续独家放送啦!! 2015 年 9 月 3 日,随着东京最高法院驳回瑞穗证券的上诉,维持二审的原判结果,一个长达 10 年的诉讼终于画下了句号.这个判例将对 IT 行业产生深远的影响:如果程序的 bug 导致了巨大的经济损

谈谈运行稳定性好效率高的千万级大型网站系统架构性分析

千万级的注册用户,千万级的帖子,nTB级的附件,还有巨大的日访问量,大型网站采用什么系统架构保证性能和稳定性? 首先讨论一下大型网站需要注意和考虑的问题. 数据库海量数据处理:负载量不大的情况下select.delete和update是响应很迅速的,最多加几个索引就可以搞定,但千万级的注册用户和一个设计不好的多对多关系将带来非常严重的性能问题.另外在高UPDATE的情况下,更新一个聚焦索引的时间基本上是不可忍受的.索引和更新是一对天生的冤家. 高并发死锁:平时我们感觉不到,但数据库死锁在高并发的