IO wait 高导致手机重启案例分析

教育   科技   2024-07-18 11:18   上海  

和你一起终身学习,这里是程序员Android

经典好文推荐,通过阅读本文,您将收获以下知识点:

一、拷贝大文件,IO wait 高,导致SWT重启
二、高IO wait 导致重启的 解决方案

一、拷贝大文件,IO wait 高,导致SWT重启

1.通过 AEE 抓取的log

部分 Log 如下:

Aee log

2.高 IO 导致CPU 使用率过高

部分 Log 如下:

Block IO 很高导致重启

二、高IO wait 导致重启的 解决方案

1. 调整内核,优化 IO

通过调整内核参数,将写活动的高峰分布成频繁的多次写,每次写入的数据比较少。这种方式执行的效率比较低,但减少了内核组合写操作的机会,降低重启概率发生。

修改init.rc 文件
文件路径如下:
system/core/rootdir/init.rc

     # Tweak background writeout
write /proc/sys/vm/dirty_expire_centisecs 200
- write /proc/sys/vm/dirty_background_ratio 3
- write /proc/sys/vm/dirty_ratio 10
+ write /proc/sys/vm/dirty_background_ratio 1
+ write /proc/sys/vm/dirty_ratio 2

# Permissions for System Server and daemons.
chown radio system /sys/android_power/state

2. 关闭ANR dump 信息

修改init.aee.customer.rc文件
修改代码如下:
/vendor/mediatek/proprietary/external/aee/config_external/init.aee.customer.rc

 on init
export LD_PRELOAD libdirect-coredump.so
write /proc/self/coredump_filter 39
+ setprop persist.dbg.anrflow 1

on property:vold.decrypt=trigger_restart_framework
restart debuggerd

3. 关闭 wtf dump文件log信息

当拷贝大型文件到手机中(5G以上),此时手机IO wait 会很高,此时Dump ANR wtf等信息,会严重影响到IO wait,如果系统超过1分钟无响应,看门狗会自动重启手机,故在 高IO wait的情况下,建议可以关闭 dump信息,缓解一下CPU负载过高的问题。

注释掉 AMS 中的Log打印
ActivityManagerService代码路径如下:
/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService

 public final class ActivityManagerService extends ActivityManagerNative

// should be protected to avoid security holes, so yell loudly

// to ensure we examine these cases.

if (callerApp != null) {

- Log.wtf(TAG, "Sending non-protected broadcast " + action

- + " from system " + callerApp.toShortString() + " pkg " + callerPackage,

- new Throwable());

+ // add for copy 5G file reboot

+ android.util.Log.e("wangjie","Sending non-protected broadcast cause reboot pkg "+callerPackage);

+ //Log.wtf(TAG, "Sending non-protected broadcast " + action

+ // + " from system " + callerApp.toShortString() + " pkg " + callerPackage,

+ // new Throwable());

+ // add for copy 5G file reboot

} else {

- Log.wtf(TAG, "Sending non-protected broadcast " + action

- + " from system uid " + UserHandle.formatUid(callingUid)

- + " pkg " + callerPackage,

- new Throwable());

- }

+ // add for copy 5G file reboot

+ android.util.Log.e("wangjie","Sending non-protected broadcast cause reboot pkg "+callerPackage);

+ // Log.wtf(TAG, "Sending non-protected broadcast " + action

+ // + " from system uid " + UserHandle.formatUid(callingUid)

+ // + " pkg " + callerPackage,

+ // new Throwable());

+ // add for copy 5G file reboot

+ }

+

+ // add for copy 5G file reboot

}

} else {

至此,本篇已结束。转载网络的文章,小编觉得很优秀,欢迎点击阅读原文,支持原创作者,如有侵权,恳请联系小编删除。同时感谢您的阅读,期待您的关注。

程序员Android
这是一个专注提供 Java Android 知识体系服务的公众号。 和你一起终身学习,小安愿做你成长道路上的垫脚石,不断垫高你的高度,衬托你的威仪。 风里雨里,我们一直在 Java Android 学习的路上支持你!
 最新文章