QCon全球软件开发大会8折优惠倒计时最后3天,购票立减¥1760!了解详情 >>> 了解详情
写点什么

Node.js V0.12 新特性之性能优化

2014 年 4 月 02 日

v0.12 悠长的开发周期 (已经过去九个月了,并且还在继续,是有史以来最长的一次) 让核心团队和贡献者们有充分的机会对性能做一些优化。本文会介绍其中最值得注意的几个。

支持塞住模式的可写流

现在可写流可以支持“塞住(corked)”模式,类似于你执行 man tcp时见到的 socket 选项TCP_CORKTCP_NOPUSH

当被塞住时,写到流中的数据会排队直到流被重新开塞 (uncorked)。这样 Node.js 可以将比较小的写操作合并成比较大的,从而减少系统调用和 TCP 往返。

http 模块已经升级了,在发送分块的请求或响应主体时透明地使用塞住模式。如果你经常看看 strace(1) 输出,就会发现 writev(2) 系统调用更多了,而 write(2) 变少了。

提升 TLS 性能

tls 模块在 Node.js v0.12 中做了相当大的重构。

在 Node.js v0.10 中,tls 模块在 net 模块之上,作为对网络流量透明地加密和解密的传输流。从工程角度来看,这样分层是有必要的,但会导致开销 - 更多的内存转移以及在 V8 VM 中超出绝对必要的调入调出–并妨碍优化。

所以在 node.js v0.12 中,直接用 libuv 重写了 tls 模块。现在它直接把接入的网络流量拉出来加密,无需通过中间层。

尽管这种评测不太科学,但用空密码时表明现在 TLS 一般要快 10%,并且用的内存更少。(我得说减少的内存占用可能部分是因为重构的内存管理,这是 v0.12 的另一项优化。)

(还有,如果你想知道,空密码时不会对负载加密的密码;它们可以用来测量架构和协议的开销。)

对于最终用户来说,tls 模块的大部分变化都是透明的。其中最显眼的一个是现在 TLS 连接是从 tls.TLSSocket,而不是 tls.CryptoStream中得到的。

提升 Crypto 性能

几种加解密算法现在应该更快了,有时是快 _ 很多 _。先介绍下背景:

Node.js 中的加解密使用 OpenSSL 库实现的。OpenSSL 中的算法有用 C 编写,并针对各种平台和架构的手动程序集版本。

Node.js v0.10 已经给一些东西用上了程序集版本,而 v0.12 又大范围扩充了这一范围。此外,现在在有 CPU 支持时用上了 AES-NI ,过去三四年生产的大多数 x86 处理器都支持。

在 Linux 上,如果执行grep ^flags /proc/cpuinfo | grep -w aes找到任何匹配结果,那就说明你的系统支持 AES-NI。不过像 VMWare 或 VirtualBox 之类的虚拟机管理程序可能会对客户机操作系统隐藏 CPU 的真正能力,包括 AES-NI。

启用 AES-NI 有个有趣的结果,即像 AES128-GCM-SHA256 这种工业强度的加解密现在比 NULL-MD5 这样的非加密密码还要快很多!

减少垃圾收集的应激反应

多情景重构的一个副作用是极大减少了Node.js 核心中的持久句柄的数量。

持久句柄是对V8 堆上对象的强引用,防止对象在引用再次移除之前被垃圾收集器回收(按GC 的说法,它是一个人造的GC 根。)

Node.js 用持久句柄缓存经常使用的值,比如 strings 或 object 原型。然而持久句柄在垃圾收集器中需要一个特殊的后处理步骤,并且根据句柄数量有一个线性增长的开销。

因为多情景清理的作用,大部分持久句柄或者被消掉,或者切换成一个更轻量的机制(被称为’永恒句柄’;这个名字在暗示什么呢?)

最终效果是你的程序在垃圾收集器内部所用时间更少了,把更多的时间用在了实际的工作上。现在在node –prof的输出中v8::internal::GlobalHandles::PostGarbageCollectionProcessing()出现的次数应该少了很多。

更好的集群性能

Node.js v0.10 的 cluster 模块要靠操作系统给工人进程均匀地分发接入连接。

事实证明,在 Solaris 和 Linux 上,有些工作负载在工人进程之间分散地非常不均衡。为了缓解这种状况,Node.js v0.12 已经改了,默认使用轮转法。这篇文章中有更详细的介绍。

更快的计时器, 更快的 setImmediate(), 更快的process.nextTick()

setTimeout()和它的朋友们现在用的时间源不仅更快,而且对时钟偏移免疫。这一优化在所有平台上都启用了,但在 Linux 上我们更进一步,直接从 VDSO 上读取当前时间,因此极大降低了 gettimeofday(2) clock_gettime(2)系统调用的次数。

setImmediate()process.nextTick()也给通常情况下的派发添加了快速的路径,可以见到性能上的调整。也就是说虽然这些函数已经相当快了,但它们现在更快了。

作者简介

本文最初由 Ben Noordhuis 发表在 StrongLoop 上。Ben Noordhuis 从 2010 年就跟着 Ryan Dahl 开发 Node.js 的核心代码。他一直在为改进 Node 核心代码而努力做着编码、调试和基准测试等工作。作为最高产的 Node 核心开发者之一,Ben 编写了 Node.js 和 libuv 中的很多代码。 StrongLoop 降低了在 Node 中开发APIs 的难度,还添加了监测、集群化以及私有注册的支持等DevOps 能力。

查看英文原文 What’s New in Node.js v0.12 – Performance Optimizations

2014 年 1 月 21 日

2014 年 4 月 02 日 06:196045
用户头像

发布了 45 篇内容, 共 22.8 次阅读, 收获喜欢 5 次。

关注

评论

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

释放数字化活力 高质量建设数字中国

CECBC区块链专委会

数字经济

架构师训练营 W05 作业

Geek_f06ede

AI技术在音乐类产品中的应用场景

HIFIVE嗨翻屋

人工智能 AI 音乐 音乐制作

MySQL 连接为什么挂死了?

华为云开发者社区

微服务 数据 存储

入坑 docsify,一款神奇的文档生成利器!

沉默王二

docsify

Scrum指南这么改,我看要完蛋!

华为云开发者社区

Scrum 敏捷 改版

架构师训练营 1 期 - 第九周 - 性能优化 3

三板斧

架构师训练营 1 期 -- 第九周作业

曾彪彪

极客大学架构师训练营

DataOps系列丨数据的「资产负债表」与「现状」

DataPipeline数见科技

大数据

6. 自定义容器类型元素验证,类级别验证(多字段联合验证)

YourBatman

Hibernate-Validator Bean Validation 多字段联合验证

【得物技术】浅谈分布式事务中间件Seata

得物技术

开源 分布式事务 中间件 解决方案 seata

DataPipeline 王睿:业务异常实时自动化检测 — 基于人工智能的系统实战

DataPipeline数见科技

大数据

DataPipeline CTO 陈肃:构建批流一体数据融合平台的一致性语义保证

DataPipeline数见科技

数据融合

京东T8Java架构师总结整理的15w字的Java面试手册,2021年金三银四不愁涨不了薪!

Java架构之路

Java 程序员 架构 面试 编程语言

《迅雷链精品课》第六课:主流区块链数据存储分析(一)

迅雷链

区块链

区块链+供应链,双链融合开启新时代

CECBC区块链专委会

区块链 供应链物流

DataOps系列丨DataOps理念与设计原则

DataPipeline数见科技

大数据

媲美物理机,裸金属云主机如何轻松应对11.11大促

京东科技开发者

云计算 服务器 云主机 裸金属容器

号外!5G+X联创营华为云官网上线,5G 创业春天来了!

华为云开发者社区

华为 程序员 AI 5G

企业工作流设计原则及多项目整合开发注意事项

Marilyn

敏捷开发 工作流 企业开发

3年Java开发经验从阿里、美团、滴滴面试回来,想和Java程序员谈一谈感悟及面经

Java架构之路

Java 程序员 架构 面试 编程语言

前嗅教你大数据——史上最全代理IP服务商对比

前嗅大数据

大数据 数据采集 动态代理 静态代理 代理IP

【JDD京智大咖说】AI 未来,路在何方?NLP、CV 技术的探索与展望

京东科技开发者

人工智能 CV nlp

一周信创舆情观察(11.9~11.15)

统小信uos

第九周学习性能优化 3 总结

三板斧

极客大学架构师训练营

数字人民币究竟是什么

CECBC区块链专委会

数字货币

Springboot过滤器和拦截器详解及使用场景

996小迁

Java 编程 架构 面试 springboot

阿里P8架构师吐血整理的《SpringBoot+Vue全栈开发实战》文档资料

Java架构之路

Java 程序员 架构 面试 编程语言

32核打赢AMD64核 英特尔Ice Lake为HPC提供强劲性能

新闻科技资讯

微服务手册:高速查询?除了Redis我们还有另外的选择

互联网应用架构

redis 微服务 springboot Caffeine 高速缓存

互联网券商系统搭建建议书

软件开发大鱼V15724971504

国际配售 港股交易系统开发 证券交易系统 IPO系统开发 金融平台搭建

移动应用开发的下一站

移动应用开发的下一站

Node.js V0.12新特性之性能优化-InfoQ