抖音 ANR 自动归因平台建设实践

背景介绍

本文在 2024 年初最新一期『抖音客户端基础技术大揭秘』技术沙龙活动中已做过专题分享,本次将内容重新整理文章进行分享。公众号后台回复技术沙龙可查看沙龙回放及 PPT~

抖音作为一个超大型的应用,我们在 ANR 问题治理上面临着很大的挑战。首先对于存量问题的优化,由于缺少有效的归因手段,一些长期的疑难问题一直难以突破解决,例如长期位于 Top 1 的 nativePollOnce 问题。同时我们在防劣化上也面临很大的压力,版本快速迭代引入的新增劣化,以及线上变更导致的激增劣化,都需要投入大量的人力去排查定位,无法在第一时间快速修复止损。

ANR 原理简介

既然我们要建设的是 ANR 归因平台,首先需要了解下什么是 ANR ?它是 Android 系统定义的一种“应用程序无响应”的异常问题,目的是为了监控发现应用程序是否存在交互响应慢或卡死的问题。从用户的视角来看,发生 ANR 时设备上会出现提示应用无响应的弹窗,甚至在一些机型上可能就直接闪退了。所以 ANR 与其他崩溃问题一样,是一种会对用户体验造成严重打断的异常问题。

接下来我们从系统的设计原理来看下为什么会发生 ANR ?以一种常见的广播超时引起的 ANR 为例,首先系统 AMS 服务会通过 IPC 方式将一个有序广播发送给应用进程,并在同时启动一个超时监控。应用进程在 Binder 线程接收到广播之后,会将其封装成一个消息 Message 加入到主线程的消息队列里等待执行。正常情况下,广播消息在应用内都会得到及时响应,然后通知系统 AMS 服务取消超时监控。但是在一些异常的情况下,如果在系统设置的超时到来之前,目标消息还没有调度执行完成的话,系统就会判定响应超时并触发 ANR。

de9c98e41446f6d2bb1962ea348f715f.png

归因方案现状

当前业界针对 ANR 问题的归因手段有哪些?第一种是传统归因方案:基于系统生成的 ANR Trace 和 ANR Info 来定位问题原因。这里的 ANR Trace 是在问题发生时系统通知应用自身 dump 采集的各个线程的堆栈以及状态信息,而 ANR Info 中则包括了 ANR 原因、系统以及应用进程的 CPU 使用率 和 IO 负载等信息。对于像下图中这类由于当前消息严重耗时或卡死引起的 ANR,这种系统原生的方案可以帮助我们快速的定位到问题堆栈。

但是它也存在一个明显的问题,从前面的原理分析可以知道,广播等系统组件消息在加入到主线程之后,是按照它在消息队列中的先后顺序来执行的,所以有可能是之前的历史消息存在严重耗时从而引起的问题。这种情况下在 ANR 实际发生时系统抓取的堆栈很有可能就已经错过了问题的现场,基于这样的数据进行归因得到的结果也是不准确的。

7cca25514d47ef655bed43ed0a6d6710.png

第二种是慢消息归因方案:通过监控主线程消息的执行情况,并结合耗时消息的采样抓栈来定位问题原因。这个方案解决了前面传统归因方案中存在的问题,提供了一种更细粒度的监控和归因能力,可以同时发现当前和历史的耗时消息,以及其中可能存在的耗时问题堆栈。

但这个方案也同样存在的一些不足之处, 因为对于像抖音这样的大型应用来说,ANR 通常是由于各种复杂的综合性因素导致的,包括子线程 / 子进程 CPU 抢占、应用 / 系统内存不足等也都会对主线程的执行效率造成影响,间接导致主线程整体都变慢了。在这种情况下,主线程的慢消息或堆栈可能并不是问题的根本原因,同样以此得到的归因结果也是不全面的。

91df5902d92809ebc46c35875fb6b0f7.png

所以总结一下目前的现状,现有的 ANR 归因方案存在以下几个痛点问题:首先是归因不准确,归因结果难以消费,不能真正解决问题。其次是归因能力少,对于复杂问题难以定位根本原因。最后是归因效率低,人工排查周期长。

建设思路

接下来重点介绍下 ANR 归因平台的建设思路,平台归因体系主要围绕以下三个方向进行建设:

  • 单点问题归因:首先需要对单个 ANR 问题实现精准的归因,这也是我们整个归因体系建设的重点和基础。

  • 聚合问题归因:其次是线上大数据的聚合问题归因,帮助我们聚焦 Top 重点问题。

  • 劣化问题归因:最后线上灰度以及全量版本劣化问题的自动归因,提升新增 / 激增问题的解决效率,目前正在建设中,本次分享就不展开介绍了。

单点归因思路

单点 ANR 问题的归因可以分为三个步骤,首先需要从原理出发明确 ANR 问题区间;接下来对问题进行粗归因,也就是一种定性的分析,比如说是主线程阻塞卡死、还是 CPU 抢占或是内存异常导致的问题;最后就是进一步进行细归因,也就是需要定位到具体的问题代码,能实际指导我们消费并解决问题。

问题区间

首先从 ANR 问题的原理出发,来分析一下如何大致确定 ANR 问题区间。我们同样还是以上面的广播消息超时引起的 ANR 为例,问题产生的时间顺序为:从系统 AMS 服务发送有序广播并启动超时监控开始,到应用进程将该广播消息加入到主线程消息队列,并按照队列中的先后顺序等待调度执行。当系统进程的超时时间结束前,对应的广播消息还没有执行完成并通知系统,系统就会判定响应超时并触发 ANR。这里我们可以以 ANR 实际发生时间为结束点,往前回溯对应的超时时间(这里不同的 ANR 原因会对应不同的超时时间设置),也就是后续需要诊断分析 ANR 问题区间范围。

9c6cde83c1538f7c30d5e0973a27bf28.png
粗归因

在明确 ANR 问题的时间范围后,我们需要从技术角度来拆解下,如何进行粗归因的定性分析。从上面的原理分析可以推导出,引起 ANR 的根本原因就是系统组件消息(包括 input 事件)在应用侧没有得到及时的执行。而我们知道这些关键目标消息都是在主线程中进行消费处理的,所以这里的关键点就是 ANR 区间内之前的这些消息为什么执行耗时 ?从系统的角度来看,所有代码逻辑的执行可以分为 On-CPUOff-CPU 两种情况:

  • On-CPU:对应 Running 状态,即当前任务正在占用 CPU 资源进行计算处理。已知 计算耗时 = 计算量 / 计算速度,这里计算速度会受到 CPU 硬件本身的限制,比如 CPU 核心频率以及当前运行在大核或小核上。另一个跟应用自身关系比较紧密的就是计算量,例如主线程在执行 CPU 密集型的操作,比如 JSON 序列化 / 反序列化,或是在处理大量的高频业务消息。

  • Off-CPU:包括 Runnable 和 Sleep 两种状态。Runnable 代表任务所需的资源已就绪,正在 CPU 运行队列上等待调度执行,这里除了受到系统本身的调度策略的影响之外,也跟当前同样已就绪并等待调度的任务数量有关。如果子线程或子进程有很多 CPU 耗时任务在等待执行的话,因为总的计算资源是有限的,互相之间频繁的抢占也会影响主线程的执行效率。Sleep 代表任务在阻塞等待资源,比如等待 Lock、IO、同步 Binder 以及内存 Block GC 等。通常情况下我们应该避免在主线程发生这类 Block 阻塞问题,同时这也是比较常见的一类解决卡顿或 ANR 的优化手段。

32e7779f51a9592be17dddbcc021c758.png

下面我们来看下第一种主线程异常消息直接引起的 ANR,它可能是由于当前消息严重耗时或卡死导致的,也可能是由于之前的一个或多个历史耗时消息引起的 ANR。

92ba695a1daabe0b8ee0703059d83d70.pngb0bfab73400a0b1781a6111d9cf9cca1.png

第二种就是后台任务 CPU 资源抢占引起的ANR,它会间接影响主线程的执行效率。从下图中可以看到在子线程 CPU 负载变高之后,主线程的整体性能开始下降变慢,这种情况下就会更容易发生 ANR。最典型的就是在冷启动的场景下,通过降级或打散 CPU 耗时的后台任务,我们已经验证可以有效的降低 ANR 率以及缩短启动首刷耗时。

618c885a6c57751e8d372281291f0ab6.png

最后一种内存等资源异常问题,例如虚拟机 Java 内存不足时,GC 线程就会开始变得活跃并进行频繁 GC,这同样也会抢占主线程 CPU 资源或 Block GC 等待,从而导致 ANR 问题的发生。对于抖音这样的视频类大型应用,线上内存问题导致的卡顿或 ANR 问题的占比较高,目前也在专项治理优化中。

59bfa2da9d6547b9a7eb487375d30b46.png

基于以上的演绎推理,总结一下我们的归因思路主要包括以下几类:第一,主线程本身的异常问题,例如存在严重的阻塞等待或者 CPU 繁忙等问题。第二,后台任务抢占 CPU 资源导致的异常问题。最后,内存 / IO 等系统资源不足导致的异常问题,目前正在探索中,本次分享就不展开介绍了。

细归因
主线程消息异常

首先来看主线程消息异常的归因思路:我们需要先对主线程消息进行监控,这里包括三种情况,已经执行完成正在执行中的消息以及消息队列中待执行的消息。对于已经或正在执行的消息,我们主要关注它们的耗时情况,通过分析系统源码我们可以知道,主线程消息队列里处理的消息一共包括三种:Java 消息、Native 消息和 Idle Handler。而对于待执行的消息,我们主要关注其中的数量,从而判断是否存在大量消息堆积的异常问题。

59244ecdfdc57366ddbc9042f2f7f571.jpeg

对于主线程异常消息的问题类型,第一类就是耗时消息,即在问题区间内存在一个或多个耗时大于阈值的慢消息。另一种是高频消息,也就是存在出现次数以及累计耗时超过一定阈值的高密度消息。这里通过对业务消息的 target、callback 和 what 等信息进行聚合分析,有时也可以协助定位到导致问题的业务方。

e22e2b5facfa7918a79c6955737a7413.pngd9de1058829dd9f8e18dfc35bdd5e3ff.png

但是仅仅找到异常消息并不能直接帮助我们解决问题,还需要对消息的耗时原因做进一步的归因分析,找到其中引起消息耗时的问题函数。接下来介绍一下线上 Trace 数据采集方案,这里我们采取类似 Matrix 方案,通过 ASM 字节码工具,在编译时对应用内的业务代码进行插桩,也就是在函数的入口和出口插入一行统计代码,来记录当前方法的运行耗时。为了降低采集时的性能损耗,将方法 begin / end 状态标识、当前方法 ID 以及时间戳的 Diff 相对值,合并使用一个 64 位的变量来记录。在 ANR 等异常问题发生时,再将 Ring Buffer 中记录的数据进行上报,在后端数据链路处理生成对应的 Trace 堆栈,并提供给后续的诊断算法进行自动化分析,以及 Perfetto 人工可视化分析的需求。

d65be46b15e83cbb049c64e3661b6dd2.png

但对于抖音这样的大型应用来说,插桩方案也会有一些弊端,当插桩的函数过多时,会对包体积以及性能产生负面的影响。为了尽可能降低监控工具对线上用户体验的影响,我们提出了精准插桩的方案!因为结合对于线上问题的分析诉求来看,我们重点关注的是上层执行的业务函数,比如页面生命周期、业务消息等入口方法,以及底层那些可能耗时的业务函数。所以我们基于静态代码分析的基础能力,分析提取出带有耗时特征的函数来进行插桩,例如下面表格中带有锁关键字的函数、存在 Native / IO 等调用的函数以及特别复杂的大方法等。在这个精准插桩的优化策略之下,大幅减少了约 90% 的插桩数量!

db8232416f8b87c1433f9b9b8c2526e5.png

在大幅精简插桩数量之后,我们在消费线上数据时又面临到一个问题,就是仅有插桩的堆栈信息太少,有时难以帮助我们实际定位到发生问题的代码。为了解决这一痛点问题,我们又设计了插桩和抓栈数据拟合的优化方案,其原理就是通过对耗时超过一定阈值的慢函数进行抓栈上报,然后在服务端再将插桩与抓栈数据根据时间点进行拟合,补齐其中缺失的业务和系统堆栈信息。如下图中所示,当插桩堆栈中连续两个节点能在抓栈数据中找到最小间距的数据并对齐时,抓栈数据中对应层之间的数据将会被补全到到插桩数据中,生成新的拟合堆栈数据,图中的 D 就是被补全的数据。

ec0c7c1fe5d4b38465354f8a9e595ab3.png6593bc56eae44ba9783b801b50b4f53b.png

在获取到线上问题发生时的详细 Trace 数据后,我们需要进一步找到其中引起耗时的问题函数,常见的问题函数类型包括以下两种:

  • 慢函数:是指函数的执行耗时超过一定的阈值;并且从实际可消费性的角度来看,我们预期是要能找到更靠近叶子节点的业务慢函数。所以需要根据实际调用堆栈的情况,进一步剔除底层的基础库或工具类方法,以及存在相同调用链路的亲缘父子节点,来找到最合适的慢函数问题。

  • 高频函数:对应就是单个虽然并不耗时,但是由于次数很多,累计执行耗时超过阈值的函数;根据我们以往的经验来看,对于高频函数的优化通常也能带来不错的收益。

e50b11152e8eb106392f5cb49cc497e0.png865e8e8a16ae41d94af230ea8b515999.png

当然仅仅知道函数慢也是不够的!我们结合一个线上实际的示例来看,通过 Trace 可以发现标记红框的这里有一个业务函数执行比较耗时,但是这里为什么会耗时呢?我们要如何进行优化呢?目前仅有的堆栈信息并不能满足我们的归因需求。之后通过分析业务代码并补齐了缺失的“关键”信息之后,我们就可以明确知道这里耗时的原因是由于锁竞争导致的,并且我们还进一步补充了当前持有锁的线程以及堆栈等重要信息。

9e25ffd17147f41f7dd0a9f08fa715ba.pngbc0980e68251d2d169e38715639624e7.png

为了更好的对慢函数的耗时进行归因,除了前面采集的 Trace 堆栈数据之外,我们还需要补充一些关键的上下文信息,这里就统称为精细化数据。比如上面提到的锁,还有函数的 CPU-Time、Binder 调用的名称、IO 读写的文件路径和大小、绘制渲染相关的 RenderNode,以及内存 Block GC 等相关信息。

dc5eb90197654ec706302d50334dc29c.png

所以回顾总结一下主线程消息异常的归因流程,首先需要明确当前 ANR 的问题区间,然后找到其中的异常消息(耗时消息或高频消息),进一步下钻找到其中引起耗时的问题函数(慢函数或高频函数),最后再结合精细化数据对其耗时原因进行归因。

a23da95b0ece6b60c9f28e8eba48e3d9.jpeg
后台任务异常

接下来再看下后台任务 CPU 异常的归因思路:首先我们需要明确是否存在后台任务对主线程 CPU 资源产生抢占的问题,这里可以结合主线程的非自愿上下文切换以及调度状态的信息,来观测主线程是否有较多的时间都花费在等待系统调度上。如果存在明显的异常情况,再结合系统和应用的 CPU 使用率信息,可以进一步先定位到是应用的子线程 / 子进程,或是关键系统进程(如 dex2oat 进程等),还是其他应用进程造成的 CPU 资源抢占。

对于应用自身造成的 CPU 抢占问题,我们需要进一步定位到具体的问题代码。所以我们在之前的 Trace 采集方案的基础上,进行了重大的升级改造,扩展支持了全线程的 Trace 数据采集。

66c033666c553602392257c6e38e24c8.png

单线程 Trace多线程 Trace说明
Flag 状态位2 bit2 bit代表函数开始/结束:3(二进制0b11)= catch, // 预留 2(二进制0b10)= throw,// 预留 1(二进制0b01)= begin, 0(二进制0b00)= end
Method ID20 bit20 bit代表插桩的方法 ID,最大支持 1048575 个函数
Thread ID-15 bit代表当前线程的 TID
Timestamp42 bit27 bit代表当前函数执行时与基准时间的相对时间,多线程模式下最大支持 134,217,727 ms = 约 1.5 天

由于后台任务我们重点关注的是 CPU-Time 耗时,所以在采集函数的 Wall-Time 执行耗时之外,同时也支持函数粒度的 CPU-Time 耗时采集,并在后端进行处理关联。这里出于性能损耗上的考虑,我们会进一步精简控制同时需要采集 CPU 时间的插桩函数数量,例如仅对系统的生命周期方法,以及子线程的 Runnable、Callable 以及二方 / 三方的任务框架入口方法,以及少量的关键特征方法才开启,并且会设置最小的采样间隔时间。

对于 CPU-Time 的获取一般有两种方式:一种是通过定期读取 proc 文件系统下的文件来解析获取,这种方式如果想要精确到方法级别需要相当高的读取频率,这种高频率读取文件并解析的性能损耗很高,不适合在线上方法级别的 CPU-Time 采集;另一种则是通过 Android 提供的 SystemClock.currentThreadTimeMillis() 方法或者 Native 层的 clock_gettime(CLOCK_THREAD_CPUTIME_ID) 方法获取当前线程的 CPU-Time,这种方式比较适合采集方法级别的 CPU 耗时,在方法开始和结束时分别调用前述方法再计算差值即可,因此我们线上采集选择的也是这个方案。

同样回顾总结一下后台任务异常的归因流程,在 ANR 的问题区间内,首先需要明确是否存在对主线程执行效率产生明显影响的 CPU 资源抢占,如果是应用自身的问题,先找到应用内 CPU 负载较高的线程或进程,进一步定位到对应异常阶段里的后台任务代码,最后再结合精细化数据对其 CPU 耗时原因进行归因。

aea19f7cc3f2a838951bcdc195c25059.jpeg

聚合归因思路

基于以上对 ANR 单点问题进行诊断分析后产出的归因结论,我们可以进一步结合线上大数据进行聚合归因,从而帮助我们更好的聚焦到 Top 重点问题的优化上。

归因标签

首先是对归因标签的聚合分析,主要包括以下几类:

  • 粗归因标签:针对 ANR 问题定性的归因分类标签,包括主线程阻塞、高频消息、CPU 抢占、堆内存不足等。

  • 细归因标签:针对细归因定位到的问题代码的精细化归因标签,包括主线程锁、IO、Binder 或者 Block GC 阻塞耗时等。

  • 业务归因特征:发生 ANR 时用户所在场景页面等业务维度的特征标签,有时也可以辅助快速定位到问题相关的业务方。

如下图所示,通过对以上不同归因标签的多维聚合分析,可以帮助我们对线上 ANR 问题的特征分布有一个全局的了解和认知,同时也能指导我们在归因能力上下一步需要重点攻坚的方向。

650439e6f3958040b6690769e97164f7.png
异常问题

其次是对细归因产出的异常问题进行聚合分析, 目前主要包括主线程异常函数后台任务以及内存这三个维度。聚合后的问题列表支持渗透率、耗时均值、PCT 50 / 90 耗时以及场景等维度的统计数据,可以帮助我们识别出线上整体占比较高或耗时特别严重的这类问题。

bc747844606adf36f6825523782c46ca.png

在进入异常函数的归因详情页之后,可以查看当前问题函数在线上大数据聚合后的火焰图,其中 Caller 堆栈代表上层不同业务方的调用次数分布情况,而 Callee 堆栈则是所有子函数的耗时分布情况。

c56442d7da2cf31ff28712b26bd0845b.pnga1378ff79bd2ebc045f974911fe25507.png

最后,基于以上的归因标签、异常问题以及业务归因信息,平台会产出一个对 ANR 问题最终的归因结论以及对应的综合置信度评分。

a8c56a8251db26524238181d17809b47.png

落地效果

接下来再介绍一下平台目前的落地效果:首先这个案例是一个启动阶段的 ANR 问题,我们从主线程 Trace 中可以分析定位到主线程的耗时函数,并且通过细归因标签的结果,可以明确知道是一个锁耗时的问题。进一步结合锁的详情信息进行下钻分析,通过当前子线程持有锁的聚合堆栈,发现是由于某个后台任务的执行时机变更提前了,从而与主线程某个任务产生了锁竞争冲突,导致主线程长时间的阻塞等待引起了 ANR。

37c0ab15350f719210c2007b3fd6a0a8.png

36071a4666d0b71bbd0bc2310c66469c.png9fb4e85bf70535ff680505564e3068d2.png

第二个案例是一个主线程高频消息问题,从定位到的问题函数可以发现其调用的非常高频,平均在一次 ANR 里会出现了上千次!通过进一步分析发现是由于某个业务的逻辑 Bug,导致在特定场景下会发送大量的重复消息,导致主线程消息队列堵塞引起的 ANR 劣化。

4fc30a206949862a558741c90cfa3a33.png0a962f493e5812a263fceeec36f49fff.png

第三个案例是一个子线程高频任务问题,通过定位到的后台任务可以发现其在多个子线程的出现次数都非常高频,并且累计的 CPU 耗时也比较高。进一步分析发现也是某个业务的 Bug 问题,在特定场景下会向子线程发送大量的重复任务,并且由于这些异步任务内部还会给主线程 Handler 发送或删除消息,所以除了会抢占 CPU 资源之外,还会间接导致主线程消息队列在遍历取消息时会发生高频的锁竞争耗时,两个因素叠加之下引起的 ANR。

2ef17bba30395c10dc4ca662601903b8.pngdbab7ff4447ddbf529fbb876d45d1745.png

最后总结下平台过去一年的阶段性成果,总共累计发现了有效问题 88 个,修复并优化其中 56 个,同时协助抖音 / 抖极的大盘 ANR 率分别下降了 -13.06%-8.70% ,并取得了不错的业务收益。

总结展望

抖音 ANR 自动归因平台未来的规划主要包括以下三个方面:

  • 归因体系:持续打磨监控能力和归因算法,包括探索完善 Java / Native 内存、绘制渲染以及 Native Trace 等方向上的精细化归因能力。

  • 防劣化体系:持续优化线上劣化归因和消费流程,提升线上自动归因准确率,以及劣化问题的消费解决效率。

  • 专家系统:沉淀专家经验,并尝试结合大模型等新技术,通过对技术特征和业务特征进行精细化聚合分析,进一步提升问题发现和解决效率。

加入我们

抖音基础技术客户端团队是一个深度追求极致的团队,我们专注于 Android / iOS 的体验、稳定性、架构、编译构建、工程效率等方向的深耕,保障超大规模团队的研发效率和数亿用户的使用体验。目前北京、上海、深圳等地都有人才需要,欢迎有志之士与我们共同建设亿级用户全球化 APP!你可以进入字节跳动招聘官网查询「抖音基础技术客户端」相关职位,也可邮件联系 chenjiawei.kisson@bytedance.com 咨询相关信息或者直接发送简历内推!

相关推荐

2024 抖音欢笑中国年(五):Wasm、WebGL 在互动技术中的创新应用

前言随着 Web 前端技术的不断发展,越来越多的新兴技术方案被引入到 Web 开发中,其中 Wasm 和 WebGL 作为前端领域的两大利器,为开发者带来了更多的可能性。本文将结合2024 年抖音欢笑中国年的部分项目,重点介绍如何利用 Wasm 和 WebGL 对目前流行的一些前端互动技术(比如 Lottie、渲染引擎、动画图片等)进行创新和实践,利用 Wasm 和 WebGL 等新技术方案的特性...

字节跳动技术团队官方博客 2万+

2024 抖音欢笑中国年(四):渲染技术实践与探索

作者:陈瑞、欧阳浩铸、王武俊、倪梵云前言抖音在2024年春节期间推出了欢笑中国年系列活动,为用户带来了全新的体验和乐趣。而SAR Creator则为该项目研发工作提供了重要的技术支持。SAR Creator是一款基于 Typescript 的高性能、轻量化的互动解决方案,目前支持了浏览器和跨端框架平台,服务于字节内部的各种互动业务。这些绚烂多彩的互动场景当然也离不开实时渲染技术的支持,因此本文将专...

字节跳动技术团队官方博客 2万+

2024 抖音欢笑中国年(三):编辑器技巧与实践

前言本次春节活动中,我们大部分场景使用内部的 SAR Creator互动方案来实现。SAR Creator 是一款基于 TypeScript 的高性能、轻量化的互动解决方案,目前支持了Web和字节内部跨端框架平台,服务于字节内部的各种互动业务,包括但不限于抖音春节、抖音直播礼物、抖音UG活动等。SAR Creator 编辑器支持了图形化界面,提供了各类完善的系统(光照、动画、脚本等)供用户快速便捷...

字节跳动技术团队官方博客 1万+

2024 抖音欢笑中国年(二):AnnieX互动容器创新玩法解析

本文基于24年抖音春节活动业务背景,介绍了字节跨端容器AnnieX在游戏互动套件上的探索,致力于提升容器在游戏互动场景的优化能力。业务背景AnnieX作为字节一方游戏统一容器,服务字节内部电商、直播、UG等跨端场景业务。在字节一方游戏互动场景,有大量的一方游戏业务对容器有特定的流量、端能力和游戏优化的诉求。因此我们不断深入互动游戏业务特点,为字节游戏提供完善游戏端能力和流量运营能力,同时提供游戏互...

字节跳动技术团队官方博客 1万+

2024 抖音欢笑中国年(一):招财神龙互动技术揭秘

字节跳动旗下的抖音等 App 在 2024 年春节期间推出了欢笑中国年系列活动,在实现增长业务目标的同时,为用户带来了全新的体验和乐趣。「招财神龙」是其中的一个重要玩法。前言本次春节活动,使用到了字节内的主要前端、跨端、互动技术产品。主要涉及:跨端框架提供了首屏直出的方案使其具有较短的首屏时间,能够大大提升业务加载成功率。跨端框架也提供了 Canvas 作为 SAR Creator 等渲染引擎的...

字节跳动技术团队官方博客 1万+

Monorepo 解决方案 — 基于 Bazel 的 Xcode 性能优化实践

背景介绍书接上回《Monorepo 解决方案 — Bazel 在头条 iOS 的实践》,在头条工程切换至 Bazel 构建系统后,为了支持用户使用 Xcode 开发的习惯,我们使用了开源项目 Tulsi 作为生成工具,用于将 Bazel 工程转换为 Xcode 工程。但是在使用的过程中,我们发现了一些问题,其中影响较大的是,Xcode 工程卡顿:对于头条这种大型项目来说,Xcode 卡顿一直是本地...

字节跳动技术团队官方博客 1万+

CVPR 2024 | CAMixerSR 动态注意力分配的超分辨率加速框架

背景随着相关技术和应用的发展,比如超高清屏幕、虚拟现实(VR)等沉浸式体验的增加,用户对超高分辨率图像和视频的需求变得越来越强烈。在这些场景中,图像的质量和清晰度对于提供最佳的用户体验至关重要。超高分辨率不仅能提供更清晰、更真实的视觉效果,还能在一定程度上增强人们的互动和沉浸感,在一些VR场景中我们需要8K甚至16K的才可以满足需求。然而要生成或者处理这些超高分辨率的内容,对算力的要求也是与日增长...

字节跳动技术团队官方博客 1万+

CVPR 2024 | Modular Blind Video Quality Assessment:模块化无参视频质量评估

无参视频质量评估 (Blind Video Quality Assessment,BVQA) 在评估和改善各种视频平台并服务用户的观看体验方面发挥着关键作用。当前基于深度学习的模型主要以下采样/局部块采样的形式分析视频内容,而忽视了实际空域分辨率和时域帧率对视频质量的影响,随着高分辨率和高帧率视频投稿逐渐普及,特别是跨分辨率/帧率视频转码档位画质评估场景中,这种影响变得更加不可忽视。在本文中,我们...

字节跳动技术团队官方博客 1万+

2024 AI & 前端:回首展望,光芒未至,破晓之前!

前言回望 2023 年,ChatGPT 的突然爆火,让 AI 无疑成为最为值得注目的新兴领域之一,我们也一起见证了生成式 AI 的寒武纪大爆发。这一年来,国内外的生成式 AI 、大模型和相关产品以令人眼花缭乱的速度更新迭代,新的创业浪潮风起云涌。在这 AI 浪潮下,也让我们有了新的开发思考,探索着在各个环节中“前端 & AI”的应用场景。勇于探索的前端开发者们已经开始挥舞着 AI 的“魔法...

字节跳动技术团队官方博客 1万+

Kotlin 云端差分缓存技术

本文由字节跳动 Buildinfra 团队出品。在我们的工程上线 Monorepo 全源码后,Kotlin 编译成了整个编译中最耗时的步骤,全源码过程中大量的 BuildCache Miss 导致我们的编译数据落后原来多仓二进制时代很多,且业界没有相关的解决方案。本篇文章我们来具体阐述下 BuildInfra 团队自研的解决方案 - Kotlin 云端差分方案的原理和技术实现。一、Monorepo...

字节跳动技术团队官方博客 1万+

字节跳动基础架构SRE-Copilot获得2023 CCF国际AIOps挑战赛冠军

近日,2023 CCF国际AIOps挑战赛决赛暨“大模型时代的AIOps”研讨会在北京成功举办,活动吸引了来自互联网、运营商、科研院所、高校、软硬件厂商等领域多名专家学者参与,为智能运维的前沿学术研究、落地生产实践打开了新思路。决赛中,从初赛两百多支队伍中脱颖而出的十支入围队伍分别展示了各自的方案,并进行了现场答辩,评审专家从选题方向、创新性、实用性、完整度和实验复现结果等多角度进行了综合评定,最...

字节跳动技术团队官方博客 2万+

字节跳动百万级Metrics Agent性能优化的探索与实践

背景metricserver2 (以下简称Agent)是与字节内场时序数据库 ByteTSD 配套使用的用户指标打点 Agent,用于在物理机粒度收集用户的指标打点数据,在字节内几乎所有的服务节点上均有部署集成,装机量达到百万以上。此外Agent需要负责打点数据的解析、聚合、压缩、协议转换和发送,属于CPU和Mem密集的服务。两者结合,使得Agent在监控全链路服务成本中占比达到70%以上,对Ag...

字节跳动技术团队官方博客 1万+

西瓜视频RenderThread引起的闪退问题攻坚历程

背景影响西瓜之前存在过一类RenderThread闪退,从堆栈上看,全部都是系统so调用,给人的第一印象像是一个系统bug,无从下手。闪退集中在Android 5~6上,表现为打开直播间立即闪退。该问题在2022年占据Native Crash Top5,2023年更是上升到到Top1。因此有必要投入时间和精力再重新审视一下这个问题。在历经多周的源码分析和排查后,逐步明确了问题根因并修复,最终取得了...

字节跳动技术团队官方博客 2万+

字节电商双11 大促容量保障是如何做的?

前言Rhino 简介Rhino是字节自研全链路容量评估产品,致力于构建完整的全链路容量评估解决方案(覆盖:容量预估->资源准备->数据准备->容量验证->监控->分析->决策->处理反馈);围绕容量在稳定性、成本、效率 三方面提供业务全方位基础支撑。Rhino 目前已经成为字节各业务容量评估主流解决方案,并且历年来在业务大型活动稳定性保障中(抖音春节项目、...

字节跳动技术团队官方博客 9万+

使用火山引擎 APMPlus 解决抖音Top 1 Java 崩溃的通用优化方案

背景近3个月,抖音 Android 版面临一个多次触发线上报警的崩溃问题,全量版本和灰度版本的异常数据激增,该问题不仅容易触发报警,更成为了 Java Top 1 崩溃问题,带来巨大困扰,急需攻坚解决。本文展现了具体的分析过程、优化思路和解决方案,同时提供了已集成该方案的实用工具。初步分析多维特征我们以某发版期间数据为例进行分析:机型方面:比较分散,有聚集部分samsung sm-s9180 占比...

字节跳动技术团队官方博客 1万+

用 Addon 增强 Node.js 和 Electron 应用的原生能力

前言Node.js Addon 是 Node.js 中为 JavaScript 环境提供 C/C++ 交互能力的机制。其形态十分类似 Java 的 JNI,都是通过提供一套 C/C++ SDK,用于在 C/C++ 中创建函数方法、进行数据转换,以便 JavaScript / Java 等语言进行调用。这样编写的代码通常叫做 Bindings。此外还有基于 C ABI Calling Convent...

字节跳动技术团队官方博客 2万+

火山引擎 ByteHouse 的增强型数据导入技术实践

作为企业数字化建设的必备要素,易用的数据引擎能帮助企业提升数据使用效率,更好提升数据应用价值,夯实数字化建设基础。数据导入是衡量OLAP引擎性能及易用性的重要标准之一,高效的数据导入能力能够加速数据实时处理和分析的效率。作为一款OLAP引擎,火山引擎云原生数据仓库ByteHouse源于开源ClickHouse,在字节跳动多年打磨下,提供更丰富的能力和更强性能,能为用户带来极速分析体验,支撑实时数据...

字节跳动技术团队官方博客 1万+

打造企业级智能问答系统的秘密:如何使用云数据库 PostgreSQL 版实现向量检索

本文就如何利用火山引擎云数据库 PostgreSQL 版和大语言模型技术(Large Language Model,简称 LLM),实现企业级智能交互式问答系统进行介绍。通过本文,你将会了解交互式问答系统的原理,学习 PostgreSQL 的向量化存储和检索技术,以及大语言模型交互技术等。背景在大数据的浪潮下,众多企业建立了自己的知识库,以便于信息检索和知识查询。然而,随着知识库内容的膨胀,传统的...

字节跳动技术团队官方博客 2万+

抖音大型直播的画质优化实践

面临挑战随着抖音内容生态的不断丰富,越来越多的大型赛事在抖音平台进行直播,世界杯/春晚/亚运会等各项赛事节目引来大量用户观看。卡塔尔世界杯期间,抖音提供的稳定高质直播画面为观众带来了完美的观赛体验,决赛的 PCU 高达 3700W+。不同赛事节目涉及链路众多,且不同赛事之间存在差异,如何保障各链路的画质稳定并进一步提升画质,是一个巨大的挑战。如何应对挑战?画质优化链路大型赛事直播涉及链路较长,不同...

字节跳动技术团队官方博客 2万+

抖音直播新一代BVC编码器正式亮相

面临挑战在直播行业发展如火如荼的今天,用户对视频体验的要求也水涨船高。视频基础体验的关键要素包括清晰度、流畅度、低延迟等,而这些要素的“第一性原理”,就是视频本身的编码效率,也就是压缩率。视频编码是整个技术体系的基座,编码效率的显著提升,能够在同等码率下极大提高画质,从而改善用户体验。视频编码效率的重要性不言而喻,但进一步地提升也并非易事,尤其在直播场景中,对编码速度、延迟、码率控制等方面都有很高...

字节跳动技术团队官方博客 7325

Go Metrics SDK Tag 校验性能优化实践

背景Metrics SDK 是与字节内场时序数据库 ByteTSD 配套的用户指标打点 SDK,在字节内数十万服务中集成,应用广泛,因此 SDK 的性能优化是个重要和持续性的话题。本文主要以 Go Metrics SDK 为例,讲述对打点 API 的 hot-path 优化的实践。用户在使用 SDK API 进行打点时,需要传入指标对应的 Tag:tags:=[]m.T{{Name:"foo...

字节跳动技术团队官方博客 1万+

云上智能驾驶三维重建最佳实践

智能驾驶技术的不断发展,正在改变着我们的出行方式和交通系统。作为其中的一个关键技术,三维重建在智能驾驶系统中起着重要的作用。除去车端本身的感知、重建算法,自动驾驶技术的落地与发展需要庞大的云端重建能力支撑,火山引擎多媒体实验室通过行业领先的自研三维重建技术,结合强大的云平台资源与能力,助力相关技术在云端大规模重建、自动标注、真实感仿真等场景的落地与应用。本文重点介绍火山引擎多媒体实验室三维重建技术...

字节跳动技术团队官方博客 6290

火山引擎实时、低延时拥塞控制算法的优化实践

摘要火山引擎智能拥塞控制算法 VICC(Volcano Intelligent Congestion Control)是一种自适应的拥塞控制算法,旨在解决全球不同网络环境下,不同音视频应用对带宽利用率和延时的差异化要求。它结合了传统拥塞控制算法(如 GCC 和 BBR)的优点,并且能够根据不同的网络条件、业务偏好和码率特征进行自适应调整,包括自适应拥塞响应速度、自适应带宽探测幅度、自适应丢包检测策...

字节跳动技术团队官方博客 6710

veImageX 演进之路:Web 图片加载提速50%

背景说明火山引擎veImageX演进之路主要介绍了veImageX在字节内部从2012年随着字节成长过程中逐步演进的过程,演进中包括V1、V2、V3版本并最终面向行业输出;整个演进过程中包括服务端、客户端、网络库、业务场景与优化等多个角度介绍在图像处理压缩、省成本与体验优化的经验与方案;本篇文章重点介绍在web端演进和提供的能力,图片是 Web 站点中的重要元素,图片体积、格式、分辨率以及渲染方式...

字节跳动技术团队官方博客 6564

自研多模态追踪算法 PICO 为「手柄小型化」找到新思路

作者:张韬、林泽一 、闻超 、赵洋研发背景作为头戴的追踪配件,VR手柄可以通过HMD(头戴显示设备)的inside-out光学追踪定位原理,计算出手柄的空间运动轨迹,同时结合6轴传感器实现6DoF空间定位。与此同时,结合手柄控制器的物理按键、马达反馈、摇杆等,用户还能获得逼真、细腻的触觉反馈,进一步增强虚拟现实人机交互的能力以及沉浸感,这也是目前无手柄方案所难以实现的。目前主流VR手柄的追踪技术方...

字节跳动技术团队官方博客 7693

如何利用播放器节省20%点播成本

点播成本节省的点其实涉及诸多部分,例如:CDN、转码、存储等,而利用播放器降本却是很多客户比较陌生的部分。火山引擎基于内部支撑抖音集团相关业务的实践,播放器恰恰是成本优化中最重要和最为依赖的部分。火山引擎的视频团队做了份数据统计,在一个很经典的视频业务中,我们在2022年至2023年大约1年半的时间里,针对这个业务进行了33次成本优化点,其中13次是播放器主导的优化,其余的有12次也是需要播放器强...

字节跳动技术团队官方博客 6159

火山引擎 ByteHouse:ClickHouse 如何保证海量数据一致性

背景ClickHouse是一个开源的OLAP引擎,不仅被全球开发者广泛使用,在字节各个应用场景中也可以看到它的身影。基于高性能、分布式特点,ClickHouse可以满足大规模数据的分析和查询需求,因此字节研发团队以开源ClickHouse为基础,推出火山引擎云原生数据仓库ByteHouse。在日常工作中,研发人员经常会遇到业务链路过长,导致流程稳定性和数据一致性难保障的问题,这在分布式、跨服务的场...

字节跳动技术团队官方博客 6883

抖音集团都在用的画质评估工具,确定不试试吗?

导读本文从抖音集团内部画质评估体系的建设历程着笔,主要分享了画质评测对于业务的重要性、主要应用场景和内部产品的一些典型实践案例。通过分享业务视角遇到的一些问题和我们的解决思路,希望能抛砖引玉,为遇到类似困扰的伙伴们提供有价值的参考。画质评估体系建设历程为何评测画质如此重要?我们通过线上业务大量实验发现,图片画质优劣对点击率、 停留时长等消费类指标有正相关影响,间接影响用户收益指标。因此,建设一套行...

字节跳动技术团队官方博客 7906

VLDB 2023 | CDSBen: 字节跳动 veDB 数据库存储系统性能测试模型

背景随着业务爆炸式增长与云原生技术的日渐成熟,大量云原生分布式数据库产品如雨后春笋般涌现,其中一部分主打 OLTP 场景的分布式数据库强调的是从计算-存储分离架构获得弹性收益;对于业界各种计算-存储分离架构的数据库而言,怎么用真实的端到端数据库 workload 去 benchmark 其底层存储系统一直存在以下难题:对于数据库专用存储系统,不存在如 fio 一样的“事实标准” benchmark...

字节跳动技术团队官方博客 5883

Interspeech 2023 | 火山引擎流媒体音频技术之语音增强和AI音频编码

背景介绍为了应对处理各类复杂音视频通信场景,如多设备、多人、多噪音场景,流媒体通信技术渐渐成为人们生活中不可或缺的技术。为达到更好的主观体验,使用户听得清、听得真,流媒体音频技术方案融合了传统机器学习和基于AI的语音增强方案,利用深度神经网络技术方案,在语音降噪、回声消除、干扰人声消除和音频编解码等方向,为实时通信中的音频质量保驾护航。作为语音信号处理研究领域的旗舰国际会议,Interspeech...

字节跳动技术团队官方博客 6168
上一篇: CVPR 2024 | Modular Blind Video Quality Assessment:模块化无参视频质量评估
下一篇: Monorepo 解决方案 — 基于 Bazel 的 Xcode 性能优化实践
 字节跳动技术团队
字节跳动技术团队 企业官方账号 企业官方账号
博客等级 码龄7年 8123粉丝 316原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值