返回首页  设为首页  加入收藏  今天是:
网站首页电脑主板电脑cpu电脑内存电脑硬盘电脑显卡电脑电源显示器电脑配件电脑维修
相关文章
 比JDK最高快170倍蚂蚁集团开…
 为啥有很多中国人喜欢将手机…
 X86和ARM中的指令集支持原子…
 多设备连接出差也能用双屏关…
 便携显示器的用处究竟有多大…
 FS-3080C植物气孔计(新型)
 UPERFECT UStation Delta 双…
 三大产业集体暴跌!韩外长求…
 暑期笔记本选购必看!一文理…
 鲁大师PC半年报:AMD锐龙跑分…
 职场精英最强生产力工具全新…
 锐龙7 4700u
 华为数字系列笔记本电脑大更…
 华勤技术上交所主板IPO过会要…
 2023年cpu 排行榜天梯图
 白色高颜值18相供电轻松超频…
 技嘉主板固件被发现内置了后…
 白色高颜值18相供电轻松超频…
 16G+1T大内存骁龙8G2+144Hz屏…
 内存 - 站长百科
 信仰无价 威刚推出ROG专属DD…
 对存储的一些思考
 业界最低功耗 三星宣布量产汽…
 40系显卡架构是什么 40系显卡…
 百川智能发布Baichuan-13B开…
 机构研选 AI需求大增+技术变…
 参数量再加大百川智能发布13…
 亚马逊和英伟达也卷入“反性…
 优派爆款24吋Fast IPS电竞1m…
 轻薄移动办公利器 华硕灵耀1…
 优派爆款24吋Fast IPS电竞1m…
 2600nit超高亮屏硕腾HUGEROC…
 每天对着电脑十个小时如何科…
 Win11 23H2年度更新确认:四…
 优化风道是电脑散热的关键 风…
 14秒!中国人自己的CPU+操作…
 三款主流跑分软件对比:就CP…
 cpu散热器上的几根线分别是什…
 一文看懂显示器所有指标参数…
 笔记本电脑为什么要另外买显…
 不太懂装机近期想配一台电脑…
 55寸防爆电视防爆显示器电脑…
 北斗系统总设计师杨长风:北…
 一季度IPO过会率八成
 今日关注]从金融业年报内容看…
 遭泥石流反复“洗劫”的汶川…
 “在这里工作家人为我感到骄…
 内存条的作用
 dram是内存条吗
 DDR5
专题栏目
网络
您现在的位置: 电脑评测网 >> 电脑内存 >> 正文
高级搜索
比JDK最高快170倍蚂蚁集团开源高性能多语言序列化框架Fury
作者:佚名 文章来源:本站原创 点击数: 更新时间:2023/7/16 20:27:34 | 【字体:

  乳牛战车Fury 是一个基于 JIT 动态编译和零拷贝的多语言序列化框架,支持 Java/Python/Golang/JavaScript/C++ 等语言,提供全自动的对象多语言 / 跨语言序列化能力,和相比 JDK 最高 170 倍的性能。

  序列化是系统通信的基础组件,在大数据、AI 框架和云原生等分布式系统中广泛使用。当对象需要跨进程、跨语言、跨节点传输、持久化、状态读写、复制时,都需要进行序列化,其性能和易用性影响运行效率和开发效率。

  静态序列化框架protobuf/flatbuffer/thrift由于不支持对象引用和多态、需要提前生成代码等原因,无法作为领域对象直接面向应用进行跨语言开发。而动态序列化框架JDK序列化/Kryo/Fst/Hessian/Pickle等,尽管提供了易用性和动态性,但不支持跨语言,且性能存在显著不足,并不能满足高吞吐、低延迟和大规模数据传输场景需求。

  因此,我们开发了一个新的多语言序列化框架 Fury,并正式在 Github 开源。通过一套高度优化的序列化基础原语,结合JIT 动态编译和 Zero-Copy等技术,同时满足了性能、功能和易用性的需求,实现了任意对象自动跨语言序列化,并提供极致的性能。

  Fury 是一个基于 JIT 动态编译和零拷贝的多语言序列化框架,提供极致的性能和易用性:

  基于JIT 动态编技术在运行时异步多线程自动生成序列化代码优化性能,增加方法内联、代码缓存和消除死代码,减少虚方法调用 / 条件分支 /Hash 查找 / 元数据写入 / 内存读写等,提供相比别的序列化框架最高 170 倍的性能;

  多协议支持:兼顾动态序列化的灵活性和易用性,以及静态序列化的跨语言能力。

  无缝替代 JDK/Kryo/Hessian,无需修改任何代码,但提供最高 170x 的性能,可以大幅提升高性能场景RPC 调用、数据传输和对象持久化效率;

  多语言 / 跨语言自动序列化任意对象,无需创建 IDL 文件、手动编译 schema 生成代码以及将对象转换为中间格式;

  多语言 / 跨语言自动序列化共享引用和循环引用,不需要关心数据重复或者递归错误;

  提供缓存友好的二进制随机访问行存格式,支持跳过序列化和部分序列化,适合高性能计算和大规模数据传输场景;

  尽管不同的场景对序列化有需求,但序列化的底层操作都是类似的。因此 Fury 定义和实现了一套序列化的基础能力,基于这套能力能够快速构建不同的多语言序列化协议,并通过编译加速等优化具备高性能。同时针对一种协议在基础能力上的性能优化,也能够让所有的序列化协议都受益。

  Fury 针对这些操作在每种语言内部都做了大量的优化,结合 SIMD 指令和语言高级特性,将性能推到极致,从而方便不同协议使用。

  在大规模数据传输场景,一个对象图内部往往有多个 binary buffer,而序列化框架在序列化过程当中会把这些数据写入一个中间 buffer,引入多次耗时内存拷贝。Fury 借鉴了 pickle5、ray 以及 arrow 的零拷贝设计,实现了一套Out-Of-Band 序列化协议,能够把一个对象图当中的所有 binary buffer 直接抓取出来,避免掉这些 buffer 的中间拷贝,将序列化期间的内存拷贝开销降低到 0。

  下图是 Fury 关闭引用支持时 Zero-Copy 的大致序列化过程。

  对于要序列化的自定义类型对象,其中通常包含大量类型信息,Fury利用这些类型信息在运行时直接生成高效的序列化代码,将大量运行时的操作在动态编译阶段完成,从而增加方法内联和代码缓存,减少虚方法调用 / 条件分支 /Hash 查找 / 元数据写入 / 内存读写等,最终大幅加速了序列化性能。

  对于 Java 语言,Fury 实现了一套运行时代码生成框架,定义了一套序列化逻辑的算子表达式 IR,在运行时基于对象类型的泛型信息进行类型推断,然后构建一颗描述序列化代码逻辑的表达式树,根据表达式树生成高效的 Java 代码,再在运行时通过 Janino 编译成字节码,再加载到用户的 ClassLoader 里面或者 Fury 创建的 ClassLoader 里面,最终通过 Java JIT 编译成高效的汇编代码。

  由于 JVM JIT 会跳过大方法编译和内联,Fury 也实现了一套优化器,将大方法递归拆分成小方法,这样就保证了 Fury 生成的所有代码都可以被编译和内联,压榨 JVM 的性能到极致。

  同时 Fury 也支持异步多线程动态编译,将不同序列化器的代码生成任务提交到线程池执行,在编译完成之前使用解释模式执行,从而保证不会出现序列化毛刺,不需要提前预热所有类型的序列化。

  Python 和 JavaScript 场景也是采用的类似代码生成方式,这样的生成方式开发门槛低,更容易排查问题。

  由于序列化需要密切操作每种编程语言的对象,而编程语言并没有暴露内存模型的低阶 API,通过 Native 方法调用存在较大开销,因此我们并不能通过 LLVM 构建一个统一的序列化器 JIT 框架,而是需要在每种语言内部结合语言特性实现特定的代码生成框架以及序列化器构建逻辑。

  尽管 JIT 编译能够大幅提升序列化效率,并且在运行时能够根据数据的统计分布重新生成更优的序列化代码,但 C++/Rust 等语言不支持反射,没有虚拟机,也没有提供内存模型的低阶 API,因此我们无法针对这类语言通过 JIT 动态编译生成序列化代码。

  对于此类场景,Fury 正在实现一套 AOT 静态代码生成框架,在编译时根据对象的 schema 提前生成序列化代码,然后使用生成的代码进行自动序列化。对于 Rust,未来也会通过 Rust 的 macro 在编译时生成代码,提供更好的易用性。

  在序列化自定义类型时,会把字段进行重排序,保证相同接口类型的字段依次序列化,增加缓存命中的概率,同时也促进了CPU 指令缓存,实现了更加高效的序列化。对于基本类型字段将写入顺序按照字节字段大小降序排列,这样如果开始地址是对齐的,随后的读写都会发生在内存地址对齐的位置,CPU 执行起来更加高效。

  基于 Fury 提供的多语言序列化核心能力,我们在这之上构建了三种序列化协议,分别适用于不同的场景:

  Java 序列化:适合纯 Java 序列化场景,提供最高百倍以上的性能提升;

  后续我们也会针对一些核心场景添加新的协议,用户也可以基于 Fury 的序列化能力构建自己的协议。

  由于 Java 在大数据、云原生、微服务和企业级应用的广泛使用,对 Java 序列化的性能优化可以大幅降低系统延迟,提升吞吐率,降低服务器成本。

  因此 Fury 针对 Java 序列化进行了大量极致性能优化,我们的实现具备以下能力:

  类型前后兼容:在反序列化端和序列化端 Class Schema 不一致时,仍然可以正确反序列化,支持应用独立升级部署,独立增删字段。并且我们对元数据进行了极致的压缩和共享,类型兼容模式相比类型强一致模式做到了几乎没有任何性能损失。

  元数据共享:在某个上下文 (TCP 连接) 下多次序列化之间共享元数据(类名称、字段名称、Final 字段类型信息等),这些信息会在该上下文下第一次序列化时发送到对端,对端可以根据该类型信息重建相同的反序列化器,后续序列化可以避免传输元数据,减小网络流量压力,同时也自动支持类型前后兼容。

  跨语言对象图序列化主要用于对动态性和易用性有更高要求的场景。尽管 Protobuf/Flatbuffer 等框架提供了多语言序列化能力,但仍然存在一些不足:

  生成的类不符合面向对象设计也无法给类添加行为,并不能作为领域对象直接用于多语言应用开发。

  不支持子类序列化。面向对象编程的主要特点是通过接口调用子类方法。这类模式也无法得到很好的支持。尽管 Flatbuffer 提供了 Union,Protobuf 提供了 OneOf/Any 特性,这类特性需要在序列化和反序列化时判断对象的类型,不符合面向对象编程的设计。

  不支持循环和共享引用,需要针对领域对象重新定义一套 IDL 并自己实现引用解析,然后在每种语言里面编写代码实现领域对象和协议对象之间的相互转换,如果对象图嵌套层数较深,则需要编写更多的代码。

  多语言 / 跨语言自动序列化任意对象:在序列化和反序列化端定义两个 Class,即可自动将一种语言的对象自动序列化为另一种语言的对象,无需创建 IDL 文件、编译 schema 生成代码以及手写转换代码;

  支持对象类型多态,符合面向对象编程范式,多个子类型对象可以同时被自动反序列化,无需用户手动处理;

  对于高性能计算和大规模数据传输场景,数据序列化和传输往往是整个系统的性能瓶颈。如果用户只需要读取部分数据,或者根据对象某个字段进行过滤,反序列化整个数据将带来额外开销。因此 Fury 也提供了一套二进制数据结构,在二进制数据上直读直写,避开序列化。

  Apache arrow 是一个成熟的列存格式,支持二进制读写。但列存并不能满足所有场景需求,在线链路和流式计算场景的数据天然就是行存结构,同时列式计算引擎内部在涉及到数据变更和 Hash/Join/Aggregation 操作时,也会使用到行存结构。

  而行存并没有一个统一标准实现,计算引擎如 Spark/Flink/Doris/Velox 等都定义了一套行存格式,这些格式不支持跨语言,且只能被自己引擎内部使用,无法用于其它框架。尽管 Flatbuffer 能够支持按需反序列化,但需要静态编译 Schema IDL 和管理 offset,无法满足复杂场景的动态性和易用性需求。

  因此 Fury 在早期借鉴了 spark tungsten 和 apache arrow 格式,实现了一套可以随机访问的二进制行存结构,目前实现了 Java/Python/C++ 版本,实现了在二进制数据上面直读直写,避免掉了所有序列化开销。

  该格式密集存储,数据对齐,缓存友好,读写更快。由于避免了反序列化,能够减少 Java GC 压力。同时降低 Python 开销,同时由于 Python 的动态性,Fury 的数据结构实现了 _getattr__/getitem/slice/ 和其它特殊方法,保证了行为跟 python dataclass/list/object 的一致性,用户没有任何感知。

  这里给出部分 Java 序列化性能数据,其中标题包含 compatible 的图表是支持类型前后兼容下的性能数据,标题不包含 compatible 的图表是不支持类型前后兼容下的性能数据。为了公平起见,所有测试 Fury 关闭了零拷贝特性。

  我们致力于将 Fury 打造为一个开放中立、追求极致与创新的社区项目,后续的研发与讨论等工作都会在社区以开源透明的方式进行。欢迎任何形式的参与,包括但不限于提问、代码贡献、技术讨论等。非常期待收到大家的想法和反馈,一起参与到项目的建设中来,推动项目向前发展,打造最先进的序列化框架。

  杨朝坤,蚂蚁集团技术专家,Fury 框架作者。2018 年加入蚂蚁集团,先后从事流计算框架、在线学习框架、科学计算框架和 Ray 等分布式计算框架开发,对批计算、流计算、Tensor 计算、高性能计算、AI 框架、张量编译等有深入的理解。

  以「启航·AIGC 软件工程变革」为主题的 QCon 全球软件开发大会·北京站将于 9 月 3-5 日在北京•富力万丽酒店举办,此次大会策划了构建未来软件的编程语言、大模型应用落地、面向 AI 的存储、AIGC 浪潮下的研发效能提升、大前端融合提效、LLMOps、异构算力、微服务架构治理、业务安全技术、FinOps 等近 30 个精彩专题。

电脑内存录入:admin    责任编辑:admin 
  • 上一个电脑内存:

  • 下一个电脑内存: 没有了
  •  
     栏目文章
    普通电脑内存 比JDK最高快170倍蚂蚁集团开源高性能多语言序… (07-16)
    普通电脑内存 为啥有很多中国人喜欢将手机设置为英文界面展… (07-16)
    普通电脑内存 X86和ARM中的指令集支持原子操作 (07-16)
    普通电脑内存 16G+1T大内存骁龙8G2+144Hz屏+200W快充这才是… (07-16)
    普通电脑内存 内存 - 站长百科 (07-16)
    普通电脑内存 信仰无价 威刚推出ROG专属DDR5内存 (07-16)
    普通电脑内存 对存储的一些思考 (07-16)
    普通电脑内存 业界最低功耗 三星宣布量产汽车UFS 31内存解决… (07-16)
    普通电脑内存 内存条的作用 (07-15)
    普通电脑内存 dram是内存条吗 (07-15)
    普通电脑内存 DDR5 (07-15)
    普通电脑内存 微机中的内存条指的是什么 (07-15)
    普通电脑内存 数码专业网站头条PK - 网易数码 (07-15)
    普通电脑内存 优米手机维修培训学校-难得一见内存96MB和176… (07-15)
    普通电脑内存 涨价更应该认准了选 值得选购的内存推荐 (07-15)
    普通电脑内存 电脑cpu温度过高怎么解决 电脑cpu内存占用过高… (07-15)
    普通电脑内存 DDR5内存时代来了!英睿达DDR5 16GB内存图赏 (07-15)
    普通电脑内存 难得一见!内存仅96MB和176MB的电脑:运行Win… (07-15)
    普通电脑内存 苹果手机升内存好不好?有风险吗?苹果手机升… (07-14)
    普通电脑内存 内存是什么 内存解释 (07-14)