写点什么

Jane Street 构建低延迟 OCaml GC 的实践

  • 2015-04-16
  • 本文字数:1176 字

    阅读完需:约 4 分钟

Jane Street 是一家特别重视技术的贸易公司,同时也是目前世界上最大的 Caml 和 OCaml 用户。近日,该公司技术部门负责人 Yaron Minsky 撰文介绍了正在进行中的构建低延迟 OCaml GC 的工作。

在垃圾回收中,有一个众所周知的问题,就是它会导致不可预知的应用程序中断。虽然 OCaml GC 在延迟方面已经相当出色(一方面,“主堆(major heap)”回收增量进行,即可以“分片(slice)”完成;另一方面,“次堆(minor heap)”回收的速度也非常快),但它仍然存在一些问题:

  • 没有性能分析:现有的运行时无法知道不同部分回收工作所耗费的时间,难以优化。
  • 错误提升:在次堆回收时,如果对象恰巧出现短暂的不可达,那么它会被错误地提升到主堆中。
  • 触发:如果服务器需要在突发流量的情况下仍然保持低延迟,那么我们希望垃圾回收可以延后,在应用程序空闲时执行。但现有的运行时根据次堆分配触发垃圾回收,无法满足此类场景。
  • 增量回收不完善:主堆采用增量回收机制,但数组会一次性回收,所以当数组较大时会出现问题。
  • 即时计算:现有的运行时根据上次次堆回收时提升到主堆的对象的多少来确定主堆片的大小。如果提升的对象很多,那么会立即进行主堆回收。但这时,正在进行的任务可能尚未完成。而且,对于快速响应系统,我们同样希望垃圾回收可以延后执行。

为了解决上述问题,他们在 OCaml GC 作者 Damien Doligez 的帮助下做了如下工作:

  • 改进性能分析:为垃圾回收器增加了一组探针,详细记录垃圾回收过程的每个阶段。
  • “老化(Aging)”:为了减少错误提升,允许对象在次堆中停留多个次堆回收周期。
  • 完善增量回收:垃圾回收的多个阶段都改为可中断的,包括数组扫描。
  • 将主堆片回收与次堆回收分离:在现有的运行时中,主堆片回收与次堆回收总是一起完成。但在低延迟分支中,二者可以在任意时间单独执行。同时,该分支允许在应用程序层面调度垃圾回收。
  • 使工作计算更平滑:该低延迟分支由跟踪下次主堆片回收的工作量改为跟踪接下来 N 次主堆片回收的工作量,并将数值保存在一个环形缓冲区里。
  • 空闲列表分段:查找空闲块的开销占次堆回收开销的一大部分。在许多 OCaml 应用程序中,块都非常小。为了利用这一点,他们正在该低延迟分支中实现一组根据尺寸划分的空闲列表。

虽然许多工作还在进行之中,但已经取得的成果让他们觉得这项工作非常有前途。通过使用一个包含了上述大多数更改的编译器版本及应用程序驱动的垃圾回收作业,他们目前已经在一个真实的生产应用中将“尾延迟(tail latency)”降低到了原来的 1/3。不过,也有部分成果不尽人意。比如,老化机制节省了对象提升开销,但次堆回收本身的开销增加了,两者基本相互抵消了。

感谢徐川对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流。

2015-04-16 08:293144
用户头像

发布了 1008 篇内容, 共 431.0 次阅读, 收获喜欢 346 次。

关注

评论

发布
暂无评论
发现更多内容

构建智慧金融新引擎|DataPipeline与巨杉数据库完成产品兼容互认证

DataPipeline数见科技

维度数据模型建模过程(Kimball)

大数据技术指南

数据仓库 维度建模 4月日更

vue2的$refs在vue3组合式API中的替代方法

devpoint

Vue3 $refs vue2 this.$refs

我们真的可以使世界成为无密码的地方吗?

龙归科技

网络 安全性

合约量化交易机器人系统开发|合约量化交易机器人APP软件开发

使用transform制作书本翻页效果

空城机

JavaScript 大前端 4月日更 书本翻页

合约量化机器人系统开发|合约量化机器人软件APP开发

系统开发

5分钟教你学会GaussDB数据分布策略设计

华为云开发者联盟

数据库 分布式数据库 GaussDB GaussDB(for openGauss) 数据分布

Python基础之:struct和格式化字符

程序那些事

Python 数据分析 程序那些事

中国SaaS的终局:神仙打架,小鬼遭殃

ToB行业头条

深入浅出带你掌握线程、多线程和线程池

华为云开发者联盟

Java 线程 多线程 线程池 操作系统

MySQL性能监控与调优

Sakura

4月日更

Linux df 命令

一个大红包

linux命令 4月日更

量化合约机器人APP开发|量化合约机器人软件系统开发

系统开发

磁盘快照服务USnap:公有云连续数据保护(CDP)系统升级改造实践

UCloud技术

在有道 | L同学:一位十五年有道人的成长故事

有道技术团队

分享 访谈录 阅读 网易有道

一周信创舆情观察(4.5~4.11)

统小信uos

聪明人的训练(十六)

Changing Lin

4月日更

13年Java开发经验精华总结!29大核心知识模块,带你直达架构师!

Java架构追梦

Java 阿里巴巴 架构 全栈知识点

合约跟单系统开发|合约跟单APP软件开发

十大经典系统架构设计面试题

程序员石磊

架构 面试 架构设计

合约量化交易APP开发|合约量化交易系统软件开发

系统开发

很坑的Could not transfer artifact报错

01Running

maven Mac IDEA

征服耶鲁教授的算法大神程序媛,是如何践行“以人为本”开发智慧社区大脑的?

华为云开发者联盟

算法 音视频 智慧社区 华为智慧园区数字平台 数字平台

如何利用ipad随时随地开发代码

程序员石磊

ipad 编程 远程

HTTPS双向认证

上海派拉基础研发

https HTTP ssl SSL 连接

【有奖征文】WEB前端大作战,走在技术最前端!

华为云开发者联盟

node.js Vue 大前端 Web Web框架

借助 Serverless 容器服务Cube,筷子科技轻松打造 10 万+ 爆款短视频

UCloud技术

使用Python映射,过滤和缩减函数:所有您需要知道的

华为云开发者联盟

Python 函数 映射 内置函数

拍乐云入选 2021 爱分析·产业数字化厂商全景报告

拍乐云Pano

RTC

web简易视频聊天室+媒体流插入

anyRTC开发者

大前端 音视频 WebRTC RTC

Jane Street构建低延迟OCaml GC的实践_后端_谢丽_InfoQ精选文章