陈智鹏的简历

18817337226   cuzperf@outlook.com

教育背景

工作经历

在 Agora 的收获

作为第一份工作


2021.07.07 ~ 2022.10.24 声网 Agora C++ SDK 开发工程师

这个统计模块每 2s 统计一次丢包率,抖动 jitterbuffer, 95% 延迟等一些信息。基本计算为把数据的 seq number 和 receive time 用 map 保存下来,然后根据 map 自带的排序搞定。后来发现接受的到的 seq number 虽然不一定有序,但是每次计算的时间间隔,它们总在一个很小的区间,于是就用 RingBuffer 存当前的 seq,然后在不改变原来逻辑(完善 UT,改完之后 UT 依然正常),优化了 CPU

通过火焰图分析,观察到这里 Location 的一些字符很不合理,然后发现里面有很多不必要的 copy 操作,实测用 shared_ptr(也会有性能消耗) 可以有效降低 CPU

trace perfetto 这一套 google 的方式,除了分析性能外,还可以检测 SDK 从初始化到结束过程中调用时序和调用关系。根据功能定制给出每个模块关心的过程图,协助分析问题

具体说来

总体性能改进了 3% 左右

借助 Agora 内部的 Mahatton 功能,聚类,可以快速在客户提供比较少的信息情况下分析问题,不细讲了

performance-move-const-arg
performance-inefficient-vector-operation
performance-move-constructor-init
performance-unnecessary-copy-initialization
performance-unnecessary-value-param
clang-analyzer-optin.cplusplus.VirtualCall
cppcoreguidelines-avoid-non-const-global-variables

这个属于通用技术: clang 有完整的文档: https://clang.llvm.org/docs/, DFsan 不了解(目前还在开发阶段)

Agora 当前策略: 两个 gn 变量 feature_enable_sanitizer(ci/cd 过 PR), feature_enable_lsanitizer(本地开发人员使用)

上行: 可以快速定位延迟高的原因。从采集开始,前处理,编码,webrtc 转到 sdk,发送到大网前。

下行(别人做的): 接收到大网数据,转到 webrtc 解码,后处理,准备渲染

通过 hook 的方式

主动添加延迟是通用场景
在比赛场景、主播打游戏防窥屏场景 delay 上限甚至可能达到 10 分钟

  1. 技术设计
    Delay 可以从三个地方设置:
    发送端(当前选择)
    服务器(服务端成本太高,用户量一大,内存直接撑不住)
    接收端(不可控 1. 对于不更新的观众端用户无效,更新了反而增加了 delay 并且更吃内存,会导致用户不愿意更新;2. 接收测的播放
    延迟由发送测控制也不合理;3. 高端用户能劫持流然后提前播放)
    发送端设置 delay存在一个较为无解的问题:例如设置 delay 1 分钟,主播要下播了(关闭直播软件),最后一分钟的流就没了。
    如果想要最后的 delay 时长的流,客户可以帮助主播用户根据设置的 delay 管理关闭直播软件的时机。主播自己也可以用其它设备作为观众端判
    断最佳下播时刻。
    实现策略(hook 方式):
    用一个 queue,里面存放 时间和包,取的时候检测头部 丢进来的时间 + delay 是否 大于 当前时间,若是,则把头部 push 出去(性能
    好,不改变线程模型)直到不满足检测条件
    用 libevent 进行 mute/unmute,丢给 libevent 去schedule( AgMajor 线程上),这里不用 queue 的做法是因为 mute/unmute 是单次
    行为(无法使用 push 方式)
    mute/unmute 跟着 delay 走
    delay 大于 1s 是就应该发送周期 I 帧
    如果用户设置的 delay 时间过长,会占用过高的内存,会有卡顿问题,目前建议 5 分钟以内,目前 hard code 最多只支持 10 分钟(超
    过了按照 10分钟设置)
    在有 delay 的情况下,主播用观众端的 app 不能实时预览,在 delay 主播会有不安全感(确保摄像头灯是暗的)
    delay 设置只能增加不能减少(中途减少 delay 是不合理行为,会有混音、视频也不知道应该怎么渲染),如果客户这么设置,此次设置
    会无效。
    muteLocalAudio/disableLocalAudio,video 同理
    会不会有多主播,主播之间是否要加延迟,看上去不需要,例如对于赛事解说类也观众,然后自己不加延迟即可
    广播包要不要发送延迟(ToDo:广播包里面到底有什么)
    要不要搞个 delayWorker 或者 队列
    leave channel 是否要推完,mute 的时候要不要关闭摄像头(跟这个关联的一个问题)
    采集的时候写到文件,然后直接读音频视频

当时 Agora 对于多主播有其它策略,也影响了此功能

荣誉证书

开源贡献

自我介绍

本科就读与华东理工大学数学系,大学期间参加过 acm 竞赛,拿了两次银奖,2015年本科毕业后报送直博去复旦读基础数学,6年后因个人对研究课题不报希望,与 2021.6 月结业,2021.7 月入职声网 Agora 作 C++ SDK 开发,边工作便学习计算机底层知识。

My name is ChenZhipeng, Graduated from Department of Mathematics, East China University of Science and Technology. I participated in the regional competition of acm-icpc and won two silver medals during college. After graduated in 2015, I went to Fudan University pursue a doctoral degree Pursue a PhD degree in mathematics, but quit 6 years later. I joined Agora in July 2021 as a C++ SDK developer, learning basic computer knowledge after working.

Now I’m similar with c99/C++17 and some clang compile options.

博客退学细节:前两年学基础知识,第三年读文章读专著找课题,第四,第五年专注于课题,但结果甚微,然后第六年自信心也崩塌了,也没有补助(没文章什么都不好申请,家里穷,没脸要钱,疫情也没法做家教),然后退了。以前本科的时候专业第一,比较顺比较膨胀,越难的问题也要做,然后才知道自己几斤几量。工作一年之后自信心慢慢的能找回了。

目前

自我评价

博客一直再更新,只是日期是按照写的来的,所以可以看不出来更新了

面试技巧:

面试官在的做题情况

微软这样的公司面试时候,有时候面试题会故意开始给的比较宽泛,细节不清晰,就等着面试者来反复询问,沟通清楚题目细节(考察实际工作中能对需求理解清楚后再coding balabala),这样如果一开始拿到题目没有沟通就做就会比较减分。。你后面可以多注意下这些,反正不管是遇到奇葩面试官还是遇到刻意考察这些的,提前沟通清楚都不吃亏。还有比如看到题目,先向面试官说自己的解题思路,得到肯定后,再下手coding这样的,就可以避免理解错意思。。忘记之前在哪里看到的,我面试就一直是这样做的。。反正就面试时候多保持沟通,有不清楚的地方就多问。比如我觉得还可以写完代码review没问题之后 告诉面试官一下,然后再说现在要写测试用例了之类的,就时刻保持着沟通。。感觉挺多时候面试官是不给测试的时间的,就只看下解法代码。。比如面试官或许只想简单看看你的解法代码,省下你写测试用例的时间,拿这些时间再和你聊聊其他的呢