硬件平台:QCS6125

软件平台:Android11

问题:每天的7:00和22:00 服务器会突然收到批量设备的网络请求,导致服务器过载。

    通过系统的logcat日志发现了系统在休眠后,每天会有22:00、7:00的唤醒,从而导致这个时间段积累的workmanager定时任务同时批量调度,导致服务器紧张。

06-22 21:57:58.378     0     0 I         : Restarting tasks ... done. 
06-22 22:00:00.313  2108  2108 D Digital_clock: updateClock()!
06-22 22:00:00.314  1402  2696 I BatteryStatsService: In wakeup_callback: resumed from suspend
06-22 21:57:58.394     0     0 I         : Resume caused by misconfigured IRQ 20 glink-native
06-22 22:00:00.314     0     0 I PM      : PM: suspend exit 2025-06-22 14:00:00.314131022 UTC
06-22 22:00:00.314     0     0 I PM      : suspend exit
06-22 22:00:00.316  1402  1402 D ConditionProviders.SCP: onReceive ScheduleConditionProvider.EVALUATE
06-22 22:00:00.317  1402  1402 D ConditionProviders.SCP: evaluateSubscriptionLocked cal=ScheduleCalendar[mDays={1, 2, 3, 4, 5, 6, 7}, mSchedule=ScheduleInfo{days=[1, 2, 3, 4, 5, 6, 7], startHour=22, startMinute=0, endHour=7, endMinute=0, exitAtAlarm=true, nextAlarm=Thu Jan 01 08:00:00 GMT+08:00 1970 (0)}], now=Sun Jun 22 22:00:00 GMT+08:00 2025 (1750600800316), nextUserAlarmTime=Thu Jan 01 08:00:00 GMT+08:00 1970 (0)
06-22 22:00:00.317  1402  1402 D ConditionProviders.SCP: notifyCondition condition://android/schedule?days=1.2.3.4.5.6.7&start=22.0&end=7.0&exitAtAlarm=true STATE_TRUE reason=meetsSchedule
06-22 22:00:00.317  1402  1402 D ConditionProviders.SCP: Scheduling evaluate for Mon Jun 23 07:00:00 GMT+08:00 2025 (1750633200000), in +8h59m59s684ms, now=Sun Jun 22 22:00:00 GMT+08:00 2025 (1750600800316)
06-22 22:00:00.326  2108  2108 D Digital_clock: updateClock()!
06-22 22:00:00.332  2108  2108 D Digital_clock: updateClock()!
06-22 22:00:00.332   839  2062 D AudioPolicyManagerCustom: setForceUse() usage 3, config 8, mPhoneState 0
06-22 22:00:00.415     0     0 I PM      : PM: suspend entry 2025-06-22 14:00:00.415238470 UTC
06-22 22:00:00.415     0     0 I PM      : suspend entry (deep)
06-22 22:00:00.415     0     0 I PM      : Syncing filesystems ... done.
06-22 22:00:00.440     0     0 I         : Freezing user space processes ...
06-22 22:00:00.450     0     0 I PM      : Pending Wakeup Sources: qcom_rx_wakelock
06-22 22:00:00.450     0     0 E         : Freezing of tasks aborted after 0.010 seconds
06-22 22:00:00.450     0     0 I         : OOM killer enabled.
06-22 22:00:00.458  1402  2696 I BatteryStatsService: In wakeup_callback: suspend aborted
06-22 22:00:00.450     0     0 I         : Restarting tasks ... done.
06-22 22:00:00.457     0     0 I         : Resume caused by misconfigured IRQ 20 glink-native
06-22 22:00:00.457     0     0 I PM      : PM: suspend exit 2025-06-22 14:00:00.457686751 UTC

而这个唤醒规则是按照framework层的一个勿扰模式的默认配置文件default_zen_mode_config.xml来的:

<?xml version="1.0" encoding="utf-8"?>
<!--
/*
** Copyright 2014, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
**     http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
--><!-- Default configuration for zen mode.  See android.service.notification.ZenModeConfig. -->
<zen version="9"><allow alarms="true" media="true" system="false" calls="true" callsFrom="2" messages="false"reminders="false" events="false" repeatCallers="true" convos="false"convosFrom="3"/><automatic ruleId="EVENTS_DEFAULT_RULE" enabled="false" snoozing="false" name="Event" zen="1"component="android/com.android.server.notification.EventConditionProvider"conditionId="condition://android/event?userId=-10000&amp;calendar=&amp;reply=1"/><automatic ruleId="EVERY_NIGHT_DEFAULT_RULE" enabled="false" snoozing="false" name="Sleeping"zen="1" component="android/com.android.server.notification.ScheduleConditionProvider"conditionId="condition://android/schedule?days=1.2.3.4.5.6.7&amp;start=22.0&amp;end=7.0&amp;exitAtAlarm=true"/><!-- all visual effects that exist as of P --><disallow visualEffects="511" /><!-- whether there are notification channels that can bypass dnd --><state areChannelsBypassingDnd="false" />
</zen>                                                        

这个规则配置的目的可能就是在相应的时间点,触发系统是否进入勿扰模式的状态评估。

    针对我们这个问题,想到了大概两个方案吧,一个是直接禁用这个规则的加载;一个是把规则里边nextAlarm的时间打散,比如随机在22和7点上下浮动20min,即把唤醒的时间点从精准的7:00和22:00调整为散列在21:40~22:20以及6:40~7:20的范围。

    由于不太确定规则禁用对系统的直接影响,所以采用了第二种方式。

具体改动如下:

diff --git a/services/core/java/com/android/server/notification/ScheduleConditionProvider.java b/services/core/java/com/android/server/notification/ScheduleConditionProvider.java
index 35170332a07..df17b091e74 100644
--- a/services/core/java/com/android/server/notification/ScheduleConditionProvider.java
+++ b/services/core/java/com/android/server/notification/ScheduleConditionProvider.java
@@ -45,6 +45,7 @@ import java.io.PrintWriter;import java.util.ArrayList;import java.util.Calendar;import java.util.List;
+import java.util.Random;/*** Built-in zen condition provider for daily scheduled time-based conditions.
@@ -70,6 +71,7 @@ public class ScheduleConditionProvider extends SystemConditionProviderService {private AlarmManager mAlarmManager;private boolean mConnected;private boolean mRegistered;
+    private boolean mShakeValue;private long mNextAlarmTime;public ScheduleConditionProvider() {
@@ -181,6 +183,27 @@ public class ScheduleConditionProvider extends SystemConditionProviderService {updateAlarm(now, mNextAlarmTime);}+    private long getRandomTimeDelta() {
+        Random random = new Random();
+        // create a random num between 0~30
+        long randomNumber = (long) random.nextInt(21);
+
+        // set mShakeValue
+        mShakeValue = (randomNumber & 1) == 0;
+
+        if (mShakeValue)
+            return (randomNumber * 60 * 1000);
+
+        return -(randomNumber * 60 * 1000);
+    }
+
+    private boolean isNeedRandomTime(String cal) {
+        if (cal.contains("startHour=22"))
+            return true;
+
+               return false;
+    }
+@VisibleForTesting@GuardedBy("mSubscriptions")Condition evaluateSubscriptionLocked(Uri conditionId, ScheduleCalendar cal,
@@ -211,6 +234,13 @@ public class ScheduleConditionProvider extends SystemConditionProviderService {if (nextChangeTime > 0 && nextChangeTime > now) {if (mNextAlarmTime == 0 || nextChangeTime < mNextAlarmTime) {mNextAlarmTime = nextChangeTime;
+                if (DEBUG) Slog.d(TAG, String.format("mNextAlarmTime:  %s",
+                        ts(mNextAlarmTime)));
+                if (isNeedRandomTime(String.format("%s", cal))) {
+                    mNextAlarmTime = nextChangeTime + getRandomTimeDelta();
+                    if (DEBUG) Slog.d(TAG, String.format("Add random value mNextAlarmTime:  %s",
+                            ts(mNextAlarmTime)));
+                }}}return condition;

修改完成,编译验证日志:

06-25 16:50:39.122  1404  1404 D ConditionProviders.SCP: evaluateSubscriptionLocked cal=ScheduleCalendar[mDays={1, 2, 3, 4, 5, 6, 7}, mSchedule=ScheduleInfo{days=[1, 2, 3, 4, 5, 6, 7], startHour=22, startMinute=0, endHour=7, endMinute=0, exitAtAlarm=true, nextAlarm=Thu Jan 01 08:00:00 GMT+08:00 1970 (0)}], now=Wed Jun 25 16:50:39 GMT+08:00 2025 (1750841439104), nextUserAlarmTime=Thu Jan 01 08:00:00 GMT+08:00 1970 (0)
06-25 16:50:39.122  1404  1404 D ConditionProviders.SCP: notifyCondition condition://android/schedule?days=1.2.3.4.5.6.7&start=22.0&end=7.0&exitAtAlarm=true STATE_FALSE reason=!meetsSchedule
06-25 16:50:39.123  1404  1404 D ConditionProviders.SCP: mNextAlarmTime:  Wed Jun 25 22:00:00 GMT+08:00 2025 (1750860000000)
06-25 16:50:39.124  1404  1404 D ConditionProviders.SCP: Add random value mNextAlarmTime:  Wed Jun 25 22:18:00 GMT+08:00 2025 (1750861080000)
06-25 16:50:39.125  1404  1404 D ConditionProviders.SCP: Scheduling evaluate for Wed Jun 25 22:18:00 GMT+08:00 2025 (1750861080000), in +5h27m20s896ms, now=Wed Jun 25 16:50:39 GMT+08:00 2025 (1750841439104)

可以看到,默认设置的是22:00,但是通过修改的代码逻辑,下次alram的时间变成了22:18:00,即随机数生成的是18,目标达成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/911942.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/911942.shtml
英文地址,请注明出处:http://en.pswp.cn/news/911942.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

部署网站需求全满足:Websoft9 多应用托管一站式方案解析

在数字化浪潮中&#xff0c;搭建专业网站已成为企业触达客户的核心通道。然而&#xff0c;从服务器选型到软件环境配置&#xff0c;传统建站模式往往让技术门槛成为中小企业的 “拦路虎”。Websoft9 多应用托管平台通过深度优化的镜像技术&#xff0c;重新定义了 WordPress 建站…

Spring Boot 启动优化实践

本文系统性分析并优化了一个Spring Boot项目启动耗时高达 280 秒的问题。通过识别瓶颈、优化分库分表加载逻辑、异步初始化耗时任务等手段&#xff0c;最终将启动耗时缩短至 159 秒&#xff0c;提升近 50%。文章涵盖启动流程分析、性能热点识别、异步初始化设计等关键技术细节&…

Jenkins执行Jenkinsfile报错

遇到部署的步骤时传输文件到其他服务器&#xff0c;文件传上去了&#xff0c;但是命令都没有执行成功。 写法&#xff1a; 报错了&#xff1a;ERROR:Exception when publishing,exception message [Exec exit status not zero.Status [1]] 原因是因为&#xff1a;cd 引用了环…

Modbus TCP转Profibus DP网接APM810/MCE安科瑞多功能电表通讯案例

Modbus TCP转Profibus DP网接APM810/MCE安科瑞多功能电表通讯案例 在工业自动化和电力监控领域&#xff0c;Modbus TCP与Profibus DP是两种常见的通讯协议&#xff0c;它们各自有着广泛的应用场景和优势。而当需要将这两者进行连接&#xff0c;以实现不同设备间的数据传输和信…

MySQL常见问题概述

一、MySQL常见问题概述 MySQL是最常用的关系型数据库&#xff0c;但使用中常会遇到 性能慢、数据丢失、主从不同步、锁冲突 等问题。这些问题可能导致系统响应变慢、用户操作失败&#xff0c;甚至数据损坏。 核心解决思路&#xff1a;先定位问题类型&#xff08;是查询慢&…

zlmediakit windows 编译webrtc

1、环境准备 系统环境&#xff1a;Windows 10 专业版 序号名称版本用途1Microsoft Visual Studio20222openssl3.0.53cmake3.24.04libsrtp2.4.0webrtc播放需要 2、安装libsrtp https://github.com/cisco/libsrtp/releases/tag/v2.4.2 2.1、新建构建目录 在libsrtp-2.4.2根目录…

Redis Pipelining 是性能加速的秘密武器?

在高性能的现代应用中&#xff0c;Redis 因其闪电般的速度而备受青睐。而 Pipelining&#xff08;管道技术&#xff09; 则是 Redis 性能优化的核心功能之一。许多开发者都听说过它能提升性能&#xff0c;但它究竟是如何做到的&#xff1f;是否会带来负面影响&#xff1f;今天我…

系统性能优化-6 TCP 三次握手

系统性能优化-6 TCP 三次握手 TCP 三次握手 客户端优化 客户端发送 SYN 给服务器 此时客户端连接状态&#xff1a;SYN_SENT如果服务器繁忙或中间网络不畅&#xff0c;客户端会重发 SYN&#xff0c;重试的次数由 tcp_syn_retries 参数控制&#xff0c;默认是 6 次&#xff0c;第…

WPF 实现自定义弹窗输入功能

1.前端实现 <Grid><Grid.RowDefinitions><RowDefinition Height"60" /><RowDefinition Height"*" /></Grid.RowDefinitions><BorderGrid.Row"0"BorderBrush"WhiteSmoke"BorderThickness"0.1&qu…

WPF中Converter基础用法

IValueConverter 1.创建一个类集成接口IValueConverter,并实现 2在xaml中引入 举例 性别用int来表示&#xff0c;1为男&#xff0c;2为女 核心代码 创建GenderConverter继承IValueConverter public class GenderConverter : IValueConverter {//model->view转换public…

Postgresql的json充当字典应用

一般我们会将一些系统参数放到参数表中&#xff0c;有些参数的值是json结构&#xff0c;那么如何在查询时引用这些参数&#xff1f;&#xff1f; 比如我在业务表的的xxx_type,或xxx_status记录的是key,又想在查询的时候显示其描述。 先定义字典 如下图如何应用 Postgresql对j…

Dify全面升级:打造极致智能应用开发体验,携手奇墨科技共拓AI新生态

智能应用开发平台Dify以六大核心功能升级与深度性能优化&#xff0c;重新定义AI开发效率与体验。本次更新不仅响应了开发者社区的迫切需求&#xff0c;更通过与云计算领域先锋奇墨科技的战略合作&#xff0c;为企业提供了从开发到部署的全链路智能化解决方案。 .技术领先&#…

关于uniapp开发阻止事件冒泡问题

背景。uniapp开发微信小程序。在使用两个组件拼接嵌套使用后&#xff0c;发现问题&#xff0c;会误操作跳转到更多页面。下图中两个事件若不使用stop修饰符&#xff0c;会相互影响。若点击uni-list-item会串行触发uni-card的handledoctorlist方法。 产生上面问题原因是组件之间…

箭头函数和普通函数的区别?

箭头函数&#xff08;Arrow Functions&#xff09;和普通函数&#xff08;传统函数&#xff09;在 JavaScript 中有显著的区别&#xff0c;主要体现在语法、this 的绑定、构造函数行为、参数处理等方面。以下是详细对比&#xff1a; 1. 语法差异 普通函数&#xff1a; functio…

Linux系统日志与守护进程开发实战指南

Linux系统日志与守护进程开发实战指南 系统日志与守护进程 ├── 系统日志syslog │ ├── 日志路径: /var/log/syslog │ └── 核心API │ ├── openlog │ ├── syslog │ └── closelog └── 守护进程daemon└── 创建步骤├── um…

Vue.js 过滤器详解

Vue.js 过滤器详解 下面我将详细讲解Vue.js中过滤器的语法和使用注意事项&#xff0c;并提供一个完整的演示页面。 过滤器基本概念 在Vue.js中&#xff0c;过滤器&#xff08;Filters&#xff09; 是用于文本格式化的功能&#xff0c;可以在双花括号插值和v-bind表达式中使用…

【iOS】iOS崩溃总结

【iOS】iOS崩溃总结 一、前言 之前写了一篇博文《【Flutter】程序报错导致的灰屏总结》&#xff0c;浏览量、收藏率和点赞量还挺高&#xff0c;还被收录了&#xff0c;就想着总结一下iOS崩溃&#xff0c;这个也是在iOS面试中经常被问到的。 在 iOS 开发过程中&#xff0c;导致…

机器学习:特征向量与数据维数概念

特征向量与数据维数概念 一、特征向量与维数的定义 特征向量与特征类别 在机器学习和数据处理中&#xff0c;每个样本通常由多个特征&#xff08;Feature&#xff09; 描述。例如&#xff0c;一张图片的特征可能包括颜色、形状、纹理等&#xff1b;一个客户的特征可能包括年龄…

开发基于Jeston Orin Nx 开发版 16G的实现

一、基本配置 1.配置参数 密码&#xff1a;yahboom Ubuntu 20.04版本、python3.8、CUDA11.4、cuDNN8.6、TensorRT8.5、Jetpack5.1.1、Opencv4.5.4版本 终端输入命令&#xff1a;sudo jtop 其中Jetpack是英伟达提供的专门供它自己的嵌入式计算机平台使用的人工智能包。 终…

【技术分享】XR技术体系浅析:VR、AR与MR的区别、联系与应用实践

XR技术体系浅析&#xff1a;VR、AR与MR的区别、联系与应用实践 作者&#xff1a;EQ 雪梨蛋花汤 本文是技术分享文档&#xff0c;浅析VR&#xff08;虚拟现实&#xff09;、AR&#xff08;增强现实&#xff09;、MR&#xff08;混合现实&#xff09;的定义、特性、技术演进路线&…