《陈卓钰-Sonic设计原理以及字节跳动微服务场景的应用收益.pdf》由会员分享,可在线阅读,更多相关《陈卓钰-Sonic设计原理以及字节跳动微服务场景的应用收益.pdf(79页珍藏版)》请在三个皮匠报告上搜索。
1、Sonic 设计原理以及字节跳动微服务场景的应用收益主讲人:陈卓钰演讲嘉宾介绍陈卓钰字节跳动基础架构资深研发工程师 字节跳动服务框架 Serdes 团队核心成员 2018 年加入字节跳动,期间发起了 Sonic JSON 项目,目前主攻 JIT 编译器以及高性能服务端组件CONTENT目录2023K+01为什么要优化 JSON 编解码Sonic 初探Sonic 的优化思路0203浅谈底层架构的通用化演进04Part 01为什么要优化 JSON 编解码1.大幅改善服务性能2.节约大量机器成本3.提升终端响应速度4.改善终端用户体验JSON JavaScript Object Notation 一
2、种非常流行的数据交换格式 文本格式,独立于语言 易于阅读和处理 广泛应用于:Web API 接口 文档数据库 元数据存储*注:此处占比统计有重叠,因此相加超过 100%Part 02Sonic 初探 Benchmark 与压力测试 字节线上服务真实收益 应用场景以及与 Hertz 的集成4619.262301.99Benchmark 结果Intel(R)Core(TM)i9-9880H CPU 2.30GHz某服务压测结果 使用 json-iterator某服务压测结果 使用 Sonic线上某服务 CPU 指标部分核心服务收益汇总 API 网关 ETL 引擎 配置中心 文档数据库.API 网关
3、 ETL 引擎 配置中心 文档数据库.等几乎所有需要用到 JSON 的地方Sonic&Hertzhttps:/ Sonic 进行请求的序列化和反序列化 需要 Go 1.15 Linux|macOSPart 03Sonic 的优化思路 消除反射:JIT 编译缓存:RCU 优化算子:SIMD 能省则省:Lazy LoadJSON 编解码到底有多难?JSON 编解码到底有多难?很简单,但也不简单 JSON 只有四种基本类型 number string true/false null 以及两种组合类型 Array Objectuser:id:12345,name:example,entities:ur
4、ls: JSON 是一种文本编码 没有固定长度 基于分隔符,而不是长度前缀 难以预先分配内存 难以实现部分解析.retweeted:false,user:id:1021030416.JSON 是一种无范式(schema-less)编码 可以定义结构体类型 也可以泛型编解码(interface)难以在编译的时候确定类型 高度依赖反射func Unmarshal(data byte,v interface)error 反射是最大的瓶颈 编译期无法确定类型 需要做大量的校验 函数调用不是免费的 无法进行函数间的优化 传参需要额外的指令 函数调用本身需要时间 借助 SIMD 能更高效的处理字符串 JS
5、ON 编解码本质上是串处理 Go 代码难以借助 SIMD 的力量处理字符串 ASM 可以用 SIMD,但是又存在函数调用开销消除反射JIT神奇的黑科技 Just-In-Time 即时编译技术 一种能够在运行时生成代码的技术 适用于动态语言的运行时优化 无法在编译期间确定类型 一些常见的 JIT 实现 Java HotSpot V8 PyPy LuaJIT动态语言无法在编译期确定类型程序语法结构固定用户可能编写任意程序一旦运行就不会改变.JSON无法预知用户的类型结构体定义方法固定用户可以定义任意结构体类型一旦加载就不会改变.如何将任意结构体转换为 JSON?type User struct I
6、DintNamestringEmail stringID:1,Name:Tom,Email: 如何将任意结构体转换为 JSON?1.写下 2.写下字段名,以及 3.写下字段的值4.如果还有更多字段 写一个 然后转到第 2 步5.写下,结束:,type User struct IDintNamestringEmail stringID:1,Name:Tom,Email:type User struct IDintNamestringEmail stringID:1,Name:Tom,Email: 如何将任意结构体转换为 JSON?1.写下 2.写下字段名,以及 3.写下字段的值4.如果还有更多字