SDK日志上传性能优化

日志,SDK,性能 · 浏览次数 : 6

小编点评

## 优化SDK日志上传策略方案 **问题:** SDK在初始化时会开启一个倒计时,在5s倒计时结束后使用子线程将本地保存的历史日志信息上传到后台。由于日志文件数据量很大,集中对日志文件数据的编码和替换会导致CPU占用过高,造成了宿主APP短时间卡住的情况。 **优化方案:** 1. **时间换空间:** 将上传方法改为只使用一个线程,让100个上传请求做串行上传。 2. **缓存机制:** 使用缓存机制缓存已经处理过的日志文件,减少对本地日志文件的访问。 3. **线程池:** 创建多个线程进行日志编码和特殊字符替换,并根据线程数量设置线程池大小。 4. **异步请求:** 在子线程中进行数据拼接和网络请求,并设置异步执行。 5. **批量处理:** 当日志文件数据量超过一定大小时,将数据分成多个部分,并进行异步上传。 6. **信号机制:** 使用信号机制将上传开关与SDK的初始化状态联系起来,以便在初始化完成时关闭日志上传功能。 **具体实现:** ```java public class LogUploader { private final int threadCount; private final Executor executor; private final Semaphore semaphore; private final String logDirectory; public LogUploader(int threadCount, Executor executor, String logDirectory) { this.threadCount = threadCount; this.executor = executor; this.semaphore = new Semaphore(1); this.logDirectory = logDirectory; } // 初始化日志上传线程 public void init() { executor.execute(() -> { // 开启倒计时 // ... // 循环处理日志文件 for (String logPath : getLogPaths()) { // 读取日志数据 String logData = readLogData(logPath); // 进行数据编码和特殊字符替换 String encodedData = encodeAndReplace(logData); // 将数据写入缓存 cache.put(logPath, encodedData); // 如果缓存已满,开始异步上传 if (cache.size() >= threadCount) { semaphore.acquire(); // 发送网络请求 // ... // 释放线程池资源 semaphore.release(); } } }); } // 获取本地日志文件的路径 private String[] getLogPaths() { // 获取本地日志目录路径 // ... } // 读取本地日志数据 private String readLogData(String logPath) { // 获取日志文件内容 // ... } // 进行数据编码和特殊字符替换 private String encodeAndReplace(String logData) { // 进行数据编码和特殊字符替换 // ... } // 发送网络请求并缓存结果 private void sendRequest(String logPath) { // 从缓存中获取编码后的日志数据 String encodedData = cache.get(logPath); // 发送网络请求 // ... // 将数据重新创建成Data可变对象 // ... } } ``` **注意:** * 以上方案仅供参考,具体实现需要根据具体情况进行调整。 * 建议使用线程池优化线程数量和线程池大小设置。 * 使用缓存机制可以提高效率。

正文

问题描述
在SDK初始化时,会在init方法中开启一个倒计时,在5s倒计时结束后使用子线程将本地保存的历史日志信息上传到后台。
因业务需要,在日志在发送上传前,需要对日志数据做编码和特殊字符替换,而日志文件里包含的日志数据量相比于一般方法中的局部变量要大很多,所以这样集中对日志文件数据的编码和替换就直接导致了CPU占用过高,造成了宿主APP短时间卡住的情况。所以导致了因为SDK体验问题,日志启动上传功能只能被迫关闭,等待优化。

 

背景描述
SDK在使用过程中会产生日志,在操作正常情况下,一个流程结束就会把当前单次产生的日志上传到后台。而对于异常退出或其他异常时,日志就保留在了本地,等SDK第二次启动时时再上传。

问题解决情况
优化前:SDK启动时,上传日志对CPU的占用量为100%,占用时间为0.5s左右,
优化后:SDK启动时,上传日志对CPU的占用量为40%左右,占用时间为1.5s左右。
 
CPU使用情况数据采集如下,CPU采集频率为0.5s。
优化前CPU使用情况:

优化后CPU使用情况:

 

日志上传策略
1.当APP调用SDK的init方法初始时,在init方法中会开启一个倒计时,在5s后使用子线程进行发起上传。
2.上传方法调用后,日志工具会遍历本地日志目录下的日志文件,并将日志文件创建成NSData。
3.然后日志工具逐个读取未上传成功标记的日志数据进行data拼接。
4.每当一个Data日志拼接后会判断当前批次拼接的Data的大小是否大于100k, 如果大于则把数据放入请求参数,异步发送一个网络请求,重新创建一个Data可变对象。
5.循环执行3-4操作,直到所有的本地日志都发送到后台
当前日志上传策略逻辑清晰,但是存在一个问题。
虽然每个上传请求都是使用子线程上传不影响主线程,但是当本地日志量大时,比如有10M日志,那么可能会同时发生100条请求,并在同一时间段内集中对日志数据进行编码和特殊字符替换。这样直接就把CPU资源抢光了,所以会造成APP卡顿。

解决方法
以时间换空间,用户对日志上传时无感知的,只要不影响APP的使用就好。按照这个原则上传策略可以改为只使用一个线程,让这100个上传请求做串行上传。
如何让子线程的网络请求串行执行呢?
将上传方法在成功回调中做递归调用。递归出口是判断带上传的日志个数,如果个数大于0就继续递归调用上传,否则就什么也不做,结束上传操作。
另外,通过后台配置上传开关,在SDK调用时从后台请求到上传开关保存到本地,等上传时读取开关配置信息,判断是否开启上传。这样可用于紧急情况关闭日志上传功能。
 
 
 
 

与SDK日志上传性能优化相似的内容:

SDK日志上传性能优化

问题描述 在SDK初始化时,会在init方法中开启一个倒计时,在5s倒计时结束后使用子线程将本地保存的历史日志信息上传到后台。 因业务需要,在日志在发送上传前,需要对日志数据做编码和特殊字符替换,而日志文件里包含的日志数据量相比于一般方法中的局部变量要大很多,所以这样集中对日志文件数据的编码和替换就

【FAQ】集成分析服务的常见问题及解决方案

常见问题一:如何验证Analytics是否上报/接入成功?以及关键日志含义是什么? 在初始化Analytics SDK前添加SDK日志开关如下: HiAnalyticsTools.enableLog (); 2.初始化SDK代码如下: HiAnalyticsInstance instance = H

Semantic Kernel Java SDK,为Java应用程序提供AI功能集成

美国时间 2023 年 7 月 19 日,Semantic Kernel 团队在其官方博客[1]上宣布发布 Java 版Semantic Kernel。 Samantic Kernel系列的源代码可在GitHub上 [2]找到,但Java的0.2.6-alpha版本可从[3]Maven Centra

HarmonyOS SDK开放能力,服务鸿蒙生态建设,打造优质应用体验

华为开发者大会2023(HDC.Together)于8月4日至6日在东莞松山湖举行,在HarmonyOS端云开放能力技术分论坛上,华为为广大开发者们介绍了HarmonyOS SDK开放能力在基础开发架构、功能特性等方面的变化之处,通过将常见的通用能力全局化,关键技术底层化,为开发者提供更加低成本、高

HarmonyOS系统级推送服务,打造消息通知新体验

8月4日,第五届华为开发者大会 2023(HDC.Together)再次启航。在本次大会上,华为为广大用户带来了HarmonyOS 4全新升级的体验,同时,针对HarmonyOS应用的开发,此次也全面升级了HarmonyOS SDK开放能力。[账号服务](https://developer.huaw

【Azure 事件中心】 org.slf4j.Logger 收集 Event Hub SDK(Java) 输出日志并以文件形式保存

问题描述 在使用Azure Event Hub的SDK时候,常规情况下,发现示例代码中并没有SDK内部的日志输出。因为在Java项目中,没有添加 SLF4J 依赖,已致于在启动时候有如下提示: SLF4J: Failed to load class "org.slf4j.impl.StaticLog

加速鸿蒙生态共建,蚂蚁mPaaS助力鸿蒙原生应用开发创新

6月21日-23日,2024华为开发者大会(HDC 2024)如期举行。在22日的【鸿蒙生态伙伴SDK】分论坛中,正式发布了【鸿蒙生态伙伴SDK市场】,其中蚂蚁数科旗下移动开发平台mPaaS(以下简称:蚂蚁mPaaS)在论坛中提出,已正式推出鸿蒙原生Beta版能力集,覆盖手机、IoT等终端,企业、机

美团携手HarmonyOS SDK,开启便捷生活新篇章

华为开发者大会(HDC 2024)于6月21日在东莞松山湖拉开序幕,通过一系列精彩纷呈的主题演讲、峰会、专题论坛和互动体验,为开发者们带来了一场知识与技术的盛宴。6月23日,《HarmonyOS开放能力,使能应用原生易用体验》分论坛成功举办,美团作为鸿蒙原生应用开发中的优秀案例,受邀出席了此次活动。

一套基于 .NET Core 开发的支付SDK集 - paylink

前言 在我们的日常工作开发中对接一些第三方支付是比较常见的,如最常见的就是支付宝、微信支付的对接。今天给大家推荐一个基于.NET Core开发的支付SDK集:paylink,它极大简化了API调用及通知的处理流程从而大大提供我们的工作生产效率。 运行环境 .NET Core 3.1、.NET 6.0

Debian12安装.NET7 SDK

Debian,作为最受欢迎的 Linux 发行版之一,于 2023 年 6 月 10 日正式发布了其最新版本 Debian 12,代号“Bookworm”。Debian 12 带来了许多新特性和改进,其中最引人注目的是 Linux 内核的升级,从之前的 5.10 LTS 升级到了 6.1。 这两天尝