QCon 演讲火热征集中,快来分享技术实践与洞见! 了解详情
写点什么

在 Twitter,Netty 4 GC 开销降为五分之一

  • 2013-11-12
  • 本文字数:1966 字

    阅读完需:约 6 分钟

Netty 项目在 7 月份发布了 Netty 4 的第一个版本,其性能的显著提升主要来源于垃圾收集开销的降低。在 Twitter,Netty 4 经过完善已经获得了 5 倍的性能提升,但也有一些代价。

Netty 项目创始人和 Twitter 软件工程师 Trustin Lee 从 2003 年开始就一直编写网络应用程序框架。Netty 第一次公开发布是在 2004 年 6 月,其项目主页这样描述它,“一种异步事件驱动的网络应用程序框架,用于可维护的高性能协议服务器和客户端的快速开发。”

Lee 在博文“ Netty 4 在 Twitter:降低 GC 开销”中写道,Twitter 在许多地方使用 Netty 实现联网功能:

Netty 包含一个反应堆模式的实现,它同时也是 Play 框架的核心。Play、Grails 和许多其它 Web 框架都采用一种 WAR-less Web 应用程序模式,它允许与底层 HTTP 服务器更紧密地集成。使用内部包含像 Netty 这种框架的服务器,异步编程会简单很多。异步编程和非阻塞 I/O 是“响应宣言( The Reactive Manifesto )”的核心。InfoQ 在“新兴趋势:响应式编程”中报道了这一新兴模式。

Netty 3 使用 Java 对象表示 I/O 事件。Lee 谈道:

这样简单,但会产生大量的垃圾,尤其是在我们这样的规模下。Netty 4 在新版本中对此做出了更改,取代生存周期短的事件对象,而以定义在生存周期长的通道对象上的方法处理 I/O 事件。它还有一个使用池的专用缓冲区分配器。

……每当收到新信息或者用户发送信息到远程端,Netty 3 均会创建一个新的堆缓冲区。这意味着,对应每一个新的缓冲区,都会有一个‘new byte[capacity]’。这些缓冲区会导致 GC 压力,并消耗内存带宽:为了安全起见,新的字节数组分配时会用零填充,这会消耗内存带宽。然而,用零填充的数组很可能会再次用实际的数据填充,这又会消耗同样的内存带宽。如果 Java 虚拟机(JVM)提供了创建新字节数组而又无需用零填充的方式,那么我们本来就可以将内存带宽消耗减少 50%,但是目前没有那样一种方式。

在 Netty 4 中,代码定义了粒度更细的 API,用来处理不同的事件类型,而不是创建事件对象。它还实现了一个新缓冲池,那是一个纯 Java 版本的 jemalloc (Facebook 也在用)。现在,Netty 不会再因为用零填充缓冲区而浪费内存带宽了。不过,由于它不依赖于 GC,开发人员需要小心内存泄漏。如果忘记在处理程序中释放缓冲区,那么内存使用率会无限地增长。

这些变化没有向后兼容 Netty 3,但其垃圾生成速度是原来的 1/5,而垃圾清理速度快了 5 倍。

Lee 写道:

我们比较了两个分别建立在 Netty 3 和 4 基础上 echo 协议服务器。(Echo 非常简单,这样,任何垃圾的产生都是 Netty 的原因,而不是协议的原因)。我使它们服务于相同的分布式 echo 协议客户端,来自这些客户端的 16384 个并发连接重复发送 256 字节的随机负载,几乎使千兆以太网饱和。

根据测试结果,Netty 4:

  • GC 中断频率是原来的 1/5:45.5 vs. 9.2 次 / 分钟
  • 垃圾生成速度是原来的 1/5:207.11 vs 41.81 MiB/ 秒

Lee 提到,在 Twitter 中采用 Netty 4 还有一些障碍,那就是缓冲区泄漏和核心复杂。该项目希望增加更多功能,包括 HTTP/2、异步 DNS 解析以及客户端 HTTP 和 SOCKS 代理支持。

Yahoo 工程部门有一篇类似的文章,内容是关于 Netty 如何帮助他们成倍地提升 Storm 集群的速度。在名为“ Netty 让 Storm 飞速运行”的文章中,Bobby Evans 写道:

在雅虎,我们都是用自己的产品进行开发。在将 Netty 作为 Storm 集群的默认消息层之前,我需要一些数据来确认,它与当前的默认消息层 zeromq 相比怎么样。要做到这一点,我需要一个能够使 Storm 消息层达到极限的基准测试程序,因此,我写了一个。那是一个简单的高速测试,用于确认 Storm 在不同的 Bolt 和 Spout 之间推送消息有多快。它允许同时启动多个具有不同复杂度的 Topology 来发送定长消息。

Evans 指出,在小规模测试中(没有资源冲突),Netty 比 zeromq 更快(40-100%)。在大规模测试中,它也遇到了性能问题,但减少了解决问题的线程数。

对于大量短消息而言,Netty 的默认设置并不是很好,即使该节点上只有它自己在运行。但是,当把它限制在单线程上,我们每秒能够获得比 zeromq 多 85% 到 111% 的消息,之后网络再次饱和。

Evans 指出,Netty 现在是 Yahoo Storm 集群的默认消息层。

Netty 4 的改进对许多开源项目都大有益处。该框架有一个长长的相关项目列表,包括 Akka Apache James HornetQ Vert.x ,这里仅举这几例。要了解更多关于 Netty 4 的信息,请查看 netty.io Lee 的博文

查看英文原文: Netty 4 Reduces GC Overhead by 5x at Twitter

2013-11-12 07:408135
用户头像

发布了 256 篇内容, 共 88.0 次阅读, 收获喜欢 12 次。

关注

评论

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

高效存储的秘诀:bitmap 数据结构在标签中的应用

袋鼠云数栈

数据结构 BitMap 标签 用户画像 标签体系

成为海量数据管理支柱:天谋科技与中科驭数完成兼容性互认证

Apache IoTDB

2024年ONLYOFFICE插件开发大赛已启动!

科技汇

MobPush 安卓推送消息数据解析推荐实现

MobTech袤博科技

Java 开发者 产品动态

MobPush扩展业务功能设置

MobTech袤博科技

Java 开发者 产品动态

KES数据库实践指南:探索KES数据库的事务隔离级别

快乐非自愿限量之名

数据库 oracle

智能制造背景下的低代码平台助力企业生产流程优化

不在线第一只蜗牛

低代码 制造业 智能化

战略资讯 | TapData 牵手思想科技,开启数据管理新篇章!

tapdata

Tapdata 现代数据栈 思想科技 数字化解决方案

阿里云 SAE 助力修正商城 3 周内提升系统承载能力 20 倍,轻松应对春晚流量

阿里巴巴云原生

阿里云 Serverless 云原生

淘宝/天猫商品详情API接口在电商数据整合中的作用

技术冰糖葫芦

API Explorer API 编排 API 文档

开源即正义,3D软件Blender设计指南

inBuilder低代码平台

开源 体验

WAIC2024 | 澳鹏Appen期待与您共襄盛会!

澳鹏Appen

世界人工智能大会 WAIC

AR没前景?我不相信!

AR玩家

AR Rokid Vision pro 炬目AR

软工智库|低代码篇(二)——低代码开发平台内涵是什么?

电子标准院软工研究室

MobPush最佳实践——华为厂商离线消息排查

MobTech袤博科技

开发者,产品动态,java

代币怎么上头像logo图标?TP钱包怎么上头像?技术帖扫盲(ave头像tp头像)

区块链项目一站式包装孵化

一文读懂DNS解析原理、设置步骤、生效时间和常见问题

国科云

ai工具有哪些?国内外40款主流AI软件速览!

彭宏豪95

人工智能 职场 在线白板 AIGC AI生成PPT

TapData 医疗美容行业数字化白皮书上线

tapdata

医疗美容机构数字化 医疗美容运营数据分析 医疗美容白皮书 医疗美容大数据中心

区块链项目包装孵化都包含哪些东西,一站式了解不迷路!

区块链项目一站式包装孵化

数字政务信息系统的技术架构方案和发展趋势研究

EquatorCoco

架构 低代码 政务信息化

手把手教你玩转 Nginx 配置

伤感汤姆布利柏

公开课 | 提高测试用例编写效率,掌握经典用例设计技巧!

测吧(北京)科技有限公司

测试

败诉的爱奇艺,又引起了网友的不满?

趣解商业

优酷 爱奇艺 腾讯视频

内推失败!

王磊

项目

软件测试学习笔记丨JUnit5动态测试规则

测试人

软件测试

全过程的区块链项目包装孵化都包含啥?

区块链项目一站式包装孵化

区块链项目如何包装?点击查看详细流程

区块链项目一站式包装孵化

新能源汽车车载充电机仿真技术,实验误差5%以内

Altair RapidMiner

汽车 仿真 altair 人工智能、

服务端性能测试:行业流行性能监控工具介绍

测吧(北京)科技有限公司

测试

在Twitter,Netty 4 GC开销降为五分之一_Java_Matt Raible_InfoQ精选文章