微信号:infoqchina

介绍:有内容的技术社区媒体

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

2014-04-02 22:58 InfoQ

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。不过像VMWareVirtualBox之类的虚拟机管理程序可能会对客户机操作系统隐藏CPU的真正能力,包括AES-NI

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


减少垃圾收集的应激反应

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

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

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

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

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


更好的集群性能

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

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


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

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

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


***********************************‍‍‍‍‍‍‍‍‍‍‍‍

本文来自InfoQ微信公众账号:infoqchina‍‍

1、回复“今日新闻”,查看今天更新的新闻;

2、回复“今日英文”,查看今天英文站的更新;

3、回复“文章 +关键词”,搜索关键词相关内容;

4、回复“QCon”,了解QCon大会相关信息;

5、回复“活动”,了解最近InfoQ组织的线下沙龙;

6、回复“架构师”,获取《架构师》下载地址;

7、回复“投稿”,了解投稿和加入编辑团队的流程。‍‍‍‍

***********************************


 
InfoQ 更多文章 Facebook如何实现PB级别数据库自动化备份 学术派Google软件工程师Matt Welsh谈移动开发趋势 Spotify为什么要使用一些“无聊”的技术? 妹纸们放假了,汉纸们做啥? 大多数重构可以避免
猜您喜欢 搭建数据驱动型Android架构 大数据能减少与天气相关的航班延误 互联网公司技术分享形式的探讨 产品经理的UX——搜索和登录 Android样式的开发:Property Animation篇