Watchdog机制以及问题分析学习笔记

1. 前言

本文主要是学习了Watchdog机制以及问题分析这篇文章,作者详细阐述了Android watchdog的实现机制,并用实际案例说明一次watch dog重启发生的原因,个人认为非常有帮助。

Android在软件层面设计了Watchdog,主要目的是检测各个重要的系统服务,防止出现死锁等问题导致系统服务卡死,如果发现有系统服务长时间无法退出,就会杀死系统服务,导致系统重启。

2. watchdog主要机制

Android的Watchdog是一个单例线程,在System Server时就会初始化Watchdog,初始化时会主要创建两种handler:
Monitor Checker主要监控系统服务可能发生的死锁;
Looper Checker主要检测全局及各个线程的消息队列是否长时间工作。

对于Monitor Checker,各个主要的系统服务在初始化时会通过addMonitor向watchdog注册monitor监控对象,watchdog线程会每隔一段时间循环调度各个系统服务注册的monitor处理函数执行,由于系统服务持有锁,而moniitor也尝试持有相同的锁,如果monitor申请持有锁成功,则可以正常退出,表示系统服务线程还在运行 , 如果monitor不能获取锁,60S后就会触发watchdog重启。

注:
1.一般monitor都是空的,一般系统服务的monitor会直接调用native的monitor, 如storageMangaerService会调用VoldNativeService的monitor
2.对于需要同步的情况,各个系统服务执行操作时会申请锁,monitor函数执行时也会尝试持有锁
3.不管monitor是空的,还是申请锁的情况,如果系统服务长时间工作持有锁或系统服务得不到调度,monitor函数无法得到执行,超过60s就会触发watchdog。

3. 根据log定位问题

系统测试会产生如下几种log:
system log
anr log
tracer log

1.对于watchdog重启问题,在system log中首先会打印WATCHDOG KILLING SYSTEM PROCESS,以确认是watchdog重启,其中可以看出是哪个进程发生的monitor超时,如下打印显示为android.fg

*** WATCHDOG KILLING SYSTEM PROCESS: Blocked in monitor com.android.server.StorageManagerService on foreground thread (android.fg) 18

名为android.fg的线程在StorageManagerService 的monitor()方法被阻塞了。这里隐含了两层意思:
1.StorageManagerService 实现了Watchdog.Monitor这个接口,并将自己作为Monitor Checker的对象加入到了Watchdog的监测集中
2.monitor()方法是运行在android.fg线程中的。Android将android.fg设计为一个全局共享的线程,意味着它的消息队列可以被其他线程共享, Watchdog的Monitor Checker就是使用的android.fg线程的消息队列。因此,出现Monitor Checker的超时,肯定是android.fg线程阻塞在monitor()方法上。

2.找到Watchddog出现之前的traces.txt文件,它会将Android重启前的所有进程的调用栈以及锁的使用情况打印出来,根据1在traces.txt中搜索android.fg

注:
1.tracer文件是由两个anr文件合并而来,并加入了一些其它的信息;
2.watchdog会30S检测一次,首次检测到后会先生成一个anr文件,第二次进入后如果仍然无法获取锁会生成第二份anr文件,并执行watchdog重启,两份anr文件之间可以确认服务被block的一个时间段;
3.因为Watchdog默认的超时时间是1分钟,因此"WATCHDOG KILLING SYSTEM PROCESS"打印时间和tracer文件中记录的时间差最好不要超过1分钟,一般tracer文件记录时间早于"WATCHDOG KILLING SYSTEM PROCESS"打印时间;
4.这里也可以通过tracer文件的system server pid与system log中的system server pid比较,如果一致,则说明此pid是watchdog重启发生前的

通过android.fg线程调用栈,我们可以得到几个关键的信息:
-这个线程当前状态是否是阻塞?
-什么原因引起的阻塞?是否是等待锁?等待哪个锁?锁当前被哪个进程持有?
-如果是锁被持有,找到持有锁的进程,检查状态

3.如果是别的进程持有锁,则搜索到此进程,检查它的状态,可以看到此进程在java层block在哪里

4.继续跟踪需要进一步查看内核空间block在哪里,从而做进一步分析

参考文档

Watchdog机制以及问题分析

Watchdog机制是一种用于监控系统运行状态的机制。它可以通过定期检查某个对象的状态来确定系统是否正常运行,并在系统出现异常采取相应的措施。根据引用\[2\],Watchdog机制有多种实现方式,其中包括内核Watchdog和用户空间Watchdog。 内核Watchdog是在操作系统内核中实现的,它通过监控一些关键指标(如中断次数、设备间戳等)来判断系统的健康状态。当系统出现异常,内核Watchdog会触发相应的动作,如重启系统或记录日志。 用户空间Watchdog是在用户程序中实现的,它也是通过定期检查某个对象的状态来判断系统是否正常运行。当系统出现异常,用户空间Watchdog可以执行一些自定义的操作,如发送警报通知管理员或执行特定的恢复操作。 总的来说,Watchdog机制的基本思路是通过监控系统关键指标来判断系统的健康状态,并在系统异常采取相应的措施。具体的实现方式可以是内核Watchdog或用户空间Watchdog。 #### 引用[.reference_title] - *1* [Watchdog机制概述](https://blog.csdn.net/weixin_30569033/article/details/97173279)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Linux Watchdog 机制](https://blog.csdn.net/vic_qxz/article/details/120888410)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值