返回首页  设为首页  加入收藏  今天是:
网站首页电脑主板电脑cpu电脑内存电脑硬盘电脑显卡电脑电源显示器电脑配件电脑维修
相关文章
 蚂蚁集团开源高性能多语言序…
 2023-2028年中国内存卡行业竞…
 RTX 4060上市时间是什么时候…
 微星公布白色版 RTX 4060 万…
 RTX 4060显卡性能怎么样 显卡…
 NVIDIA RTX 4070显卡首测 年…
 RTX 4060显卡是什么水平档次…
 固态硬盘能有什么秘密呢?买…
 愉快买买买:报恩固态硬盘4T…
 雷克沙发布旗舰固态硬盘与内…
 微软XSX无优势仅两款固态可选…
 存储空间不够 金士顿XS2000移…
 联想原厂优质服务 + 硬件联想…
 联想率先在业界发布“上门服…
 联想拯救者刃9000上市:12代…
 专业工程师上门服务 联想百应…
 北京暴雨 暖心“邻居”为你守…
 SA-PD400拍击式无菌均质器调…
 极狐森林版新车自带森林氧吧…
 FPGA的可重构测控系统应用设…
 r76800h
 新能源轻越野如何提供情绪价…
 电脑批发商的进货渠道有哪些…
 电脑厂商提前肉搏销售渠道
 中关村PK京东 浅析买笔记本的…
 如何成为联想电脑渠道经销商…
 减租纾困扶助经营实体渡难关
 什么叫宽屏显示器
 HKC VG273QS电竞显示器 1199…
 43英寸的沉浸式快感 飞利浦超…
 2022年5款优秀的超宽游戏显示…
 HP Envy 34寸超宽曲屏 显示器…
 如何查看自己电脑的配置
 电脑配置在哪里查看
 查看电脑配置的几种方法(让小…
 51299元电脑主机引发争议 UP…
 怎么查询电脑配置?Windows系…
 cpu风扇怎么拆下来 教程
 CPU散热器(CPU风扇)的拆卸…
 拆cpu风扇(cpu风扇怎么拆图…
 手把手教你如何拆装CPU风扇
 cpu风扇怎么拆小猪教您cpu风…
 DDR3内存: DDR4 正式再见!
 不同场景下的 C++ 对象内存布…
 原神40内存条不能为read怎么…
 随机存储器俗称“内存条”它…
 电脑开机显示蓝屏英文怎么处…
 电脑显卡有什么用呢 显卡有啥…
 千元价位高清高刷广色域Fast…
 电脑上的显卡有什么作用? 跟…
专题栏目
网络
您现在的位置: 电脑评测网 >> 电脑内存 >> 正文
高级搜索
蚂蚁集团开源高性能多语言序列化框架Fury解读
作者:佚名 文章来源:本站原创 点击数: 更新时间:2023/8/26 16:29:01 | 【字体:

  洪荒之太上剑圣笔趣阁Fury 是一个基于 JIT 动态编译和零拷贝的多语言序列化框架,支持等语言,提供全自动的对象多语言 / 跨语言序列化能力,和相比 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 框架、张量编译等有深入的理解。

  ,推荐的方案是使用@JsonSerialize注解,示例代码如下:@JsonSerialize

  的综合信息服务正成为信息服务领域的一个重要的发展方向。该文提出面向2010年上海世博会和城市信息服务的

  VIP(Verification IP)协同验证的需求不断增加,给验证工作带来了很大的挑战。为了解决

  漏洞 /

  预训练工作都建立在XLM的基础上,我们来详细看看XLM的整体训练过程。

  TAF(Total Application Framework),目前支持C++、Java、PHP、Nodejs、Go

  使用NIO进行网络编程的源码分析 /

  用Rust编写核心组件!独家揭露阿里云开源GraphScope如何成为全球最快图计算引擎

  无人机的GNSS导航系统高精度定位定向模组M20D实现应急救援技术原理

  #RTTstudio 实战篇:获取网络文件到本地文件系统 - 2.1外部 Flash 挂载虚拟文件系统

  陶瓷刀?到底是高科技还是鸡肋,和传统刀具对比后放大镜下看区别 #硬核拆解

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

  • 下一个电脑内存: 没有了
  •  
     栏目文章
    普通电脑内存 蚂蚁集团开源高性能多语言序列化框架Fury解读 (08-26)
    普通电脑内存 2023-2028年中国内存卡行业竞争格局及投资风险… (08-26)
    普通电脑内存 DDR3内存: DDR4 正式再见! (08-25)
    普通电脑内存 不同场景下的 C++ 对象内存布局(英文博客翻译… (08-25)
    普通电脑内存 原神40内存条不能为read怎么办40内存条不能为… (08-25)
    普通电脑内存 随机存储器俗称“内存条”它的英语缩写是:RA… (08-25)
    普通电脑内存 电脑开机显示蓝屏英文怎么处理 (08-25)
    普通电脑内存 Win10专业版系统C盘虚拟内存如何设置【详情】 (08-25)
    普通电脑内存 Windows11内存完整性无法打开怎么办 Windows1… (08-25)
    普通电脑内存 酷睿轻薄本也能运行大语言模型英特尔推动 PC … (08-25)
    普通电脑内存 Win7系统该内存不能为writtenread该怎么办【详… (08-25)
    普通电脑内存 《Gunner HEAT PC》配置要求是什么?steam配置… (08-25)
    普通电脑内存 “纯血鸿蒙”即将到来 (08-24)
    普通电脑内存 vdi_电子产品世界 (08-24)
    普通电脑内存 刺客信条大革命 游戏中突然卡住解决方法 760设… (08-24)
    普通电脑内存 暗黑破坏神4内存不足怎么办 暗黑4内存不足解决… (08-24)
    普通电脑内存 英伟达技术_电子发烧友网 (08-24)
    普通电脑内存 中报]纳芯微(688052):2023年半年度报告 (08-24)
    普通电脑内存 中报]金山办公(688111):金山办公2023年半年度… (08-24)
    普通电脑内存 消息称三星获得 AMD HBM3 内存订单为其 MI300… (08-24)