问题描述
在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日志上传性能优化的更多相关文章

  1. Hadoop如何将TB级大文件的上传性能优化上百倍?

    这篇文章,我们来看看,Hadoop的HDFS分布式文件系统的文件上传的性能优化. 首先,我们还是通过一张图来回顾一下文件上传的大概的原理. 由上图所示,文件上传的原理,其实说出来也简单. 比如有个TB ...

  2. 将本地开发完的SDK代码上传到SVN上面:an error occurred while contacting the repository The server may be unreachable or the URL may be incorrect

    将本地开发完的SDK代码上传到SVN上面:an error occurred while contacting the repository  The server may be unreachabl ...

  3. 复杂TableView在iOS上的性能优化

    声明:本文翻译自<iOS performance optimization>,原文作者 Khang Vo.翻译本文纯属为了技术交流的目的,并不具有任何的商业性质,也不得利用本文内容进行商业 ...

  4. Hadoop_13_Hadoop Shell脚本采集日志上传到HDFS

    案例1:开发shell采集脚本 1.点击流日志每天都10T,在业务应用服务器上,需要准实时上传至数据仓库(Hadoop HDFS)上 2.一般上传文件都是在凌晨24点操作,由于很多种类的业务数据都要在 ...

  5. 面试三轮我倒在了一道sql题上——sql性能优化

    一.前言 最近小农在找工作,因为今年疫情的特殊原因,导致工作不是特别好找,所以一旦有面试电话,如果可以,都会去试一试,刚好接到一个面试邀请,感觉公司还不错,于是就确定了面试时间,准备了一下就去面试了. ...

  6. 微信sdk 图片上传 两种方法 上传一张显示一张 并附带微信图片放大功能和删除功能

    html <!--上传图片--> <div class="upload-mod"> <div class="up-box" id= ...

  7. 互联网开发-web文件上传性能问题

    1. 问题描述 文件大小 部署环境 平均上传速度 5M 外网 28s-36s 5M 公司局域内网 秒传,很快 2. 问题分析 在网上搜索“测速网”测试了一下公司外网的带宽情况: 上传带宽 = 1.04 ...

  8. 阶段1 语言基础+高级_1-3-Java语言高级_07-网络编程_第3节 综合案例_文件上传_5_综合案例_文件上传案例优化

    自定义文件命名 文件名称被写死了 服务器上传了一张图片,服务器就停止了 把服务器端的代码放在while循环里面 服务器也不用 关闭了. 上传完成后服务器端没有关闭 再来启动客户端,又上传一张投片. 多 ...

  9. PHP SDK+Oss 上传文件流

    // Endpoint以杭州为例,其它Region请按实际情况填写. $endpoint = "http://oss-cn-hangzhou.aliyuncs.com"; // 云 ...

  10. 七牛php sdk 生成上传凭证时出现 undefined function Qiniu_SetKeys()

    将qiniu/http.php文件改名即可,原因是xampp等集成环境会安装pear存在了http.php

随机推荐

  1. Maven 切换JDK版本

    欢迎访问我的个人博客:xie-kang.com 查看Maven安装目录的conf目录可以看到有 settings.xml\toolchains.xml文件.settings.xml主要是设置切换Mav ...

  2. 原生JS及jQuery中事件委托的写法

    在绑定节点事件处理程序时遇到的问题: 每个 函数都是对象,都会占用内存:内存中的对象越多,性能就越差. 其次,必须事先指定所有事件处理程 序而导致的 DOM访问次数,会延迟整个页面的交互就绪时间. 采 ...

  3. C#重点语法——特性

    特性的基本理解 ************************************************************************************* 一.含义 特 ...

  4. k8s探针

    探针是由kubelet对容器执行的定期诊断.要执行诊断,kubelet调用由容器实现的Handler.有三类处理程序: ExecAction:在容器内执行指定命令.如果命令退出时返回码为0认为诊断成功 ...

  5. MAC范洪攻击-macof

    macof 目的:攻击交换机的路由表,实现网络信息嗅探 macof是dsniff中的一个小工具 概要:交换机中存在着一个记录着MAC地址的表,为了完成数据的快速转发,这个表有着自动学习机制,学习后可以 ...

  6. 【AI 全栈 SOTA 综述 】这些你都不知道,怎么敢说会 AI?【语音识别原理 + 实战】

    章目录 前言语音识别原理   信号处理,声学特征提取   识别字符,组成文本   声学模型   语言模型   词汇模型语音声学特征提取:MFCC和LogFBank算法的原理实战一 ASR语音识别模型 ...

  7. Java面试——锁

    公平锁:是指多个线程按照申请锁的顺序来获取锁,有点先来后到的意思.在并发环境中,每个线程在获取锁时会先查看此锁维护的队列,如果为空,或者当前线程是等待队列的第一个,就占有锁,否则就会加入到等待队列中, ...

  8. vue中 computed和watch的一些简单理解(区别)

    今天看到一个问题,就是vue的computed和watch要在哪些场景下使用,其实也就是在问他们的区别.computed也就是计算属性,它可以帮助我们将在模板中的一些稍微复杂的逻辑计算放回到js代码中 ...

  9. 【PWN】初见BROP

    前言|与BROP的相遇 第一次BROP,它让我觉得pwn,或者说网安很妙,也很折磨 在遇到它之前,之前接触的题目都是简单的栈溢出,感觉没有啥有趣的,很简单,找gadget溢出就可以,一切都看得见 可遇 ...

  10. python之pil图像库操作

    Image模块Image模块是在Python PIL图像处理中常见的模块,对图像进行基础操作的功能基本都包含于此模块内.如open.save.conver.show-等功能. open类Image.o ...