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能力。

Node.js V0.12新特性之性能优化的更多相关文章

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

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

  2. 【译】 Node.js v0.12的新特性 -- 性能优化

    原文: https://strongloop.com/strongblog/performance-node-js-v-0-12-whats-new/ January 21, 2014/in Comm ...

  3. 【译】 Node.js v0.12的新特性 -- Cluster模式采用Round-Robin负载均衡

    原文:https://strongloop.com/strongblog/whats-new-in-node-js-v0-12-cluster-round-robin-load-balancing 本 ...

  4. php8.0正式版新特性和性能优化学习

    前言 PHP团队宣布PHP8正式GA(链接).php的发展又开启了新的篇章,PHP8.0.0版本引入了一些重大变更及许多新特性和性能优化机制.火速学习下~ JIT(Just in Time Compi ...

  5. php7和PHP5对比的新特性和性能优化

    1  抽象语法树( AST) 1)在 PHP5中,从 php 脚本到 opcodes 的执行的过程是: Lexing:词法扫描分析,将源文件转换成 token 流:    Parsing:语法分析,在 ...

  6. Node.js v0.10.31API手冊-控制台

    Node.js v0.10.31API手冊-文件夹 控制台 Object 用于向 stdout 和 stderr 打印字符.类似于大部分 Web 浏览器提供的 console 对象函数,在这里则是输出 ...

  7. Node.js v0.10.31API手冊-事件

    Node.js v0.10.31API手冊-文件夹 Events(事件) Node里面的很多对象都会分发事件:一个net.Server对象会在每次有新连接时分发一个事件, 一个fs.readStrea ...

  8. atitit.Oracle 9 10 11 12新特性attilax总结

    atitit.Oracle 9  10 11  12新特性 1. ORACLE 11G新特性 1 1.1. oracle11G新特性 1 1.2. 审计 1 1.3. 1.   审计简介 1 1.4. ...

  9. UFT\QTP 12 新特性

    UFT\QTP 12 新特性 http://blog.csdn.net/testing_is_believing/article/details/22310297

随机推荐

  1. MySQL源码:索引相关的数据结构

    http://www.orczhou.com/index.php/2012/11/mysql-source-code-data-structure-about-index/ 本文将尝试介绍MySQL索 ...

  2. C#_ 项目打包附加数据库

    C#_ 项目打包附加数据库 2010-07-11 23:22:45|  分类: Winfrom|举报|字号 订阅     实现效果:安装项目时直接附加数据库. 1.首先在需要部 署的项目的解决方案资源 ...

  3. mysql的limit、order by和group by的用法

    程序执行会重复 用mysql很长时间,limit是分页的一个好工具, select * from table_a where num = 4 limit 1,10, select * from tab ...

  4. HttpModule,HttpHandler,HttpHandlerFactory

    HttpModule:Http模块,可以在页面处理前后.应用程序初始化.出错等时候加入自己的事件处理程序. HttpHandler:Http处理程序,处理页面请求 HttpHandlerFactory ...

  5. JVM体系结构

    为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/SJQ. http://www.cnblogs.com/shijiaqi1066/p/5187049.html ...

  6. final----这篇文章是我收获很大

    final 用于声明属性.方法和类,分别表示属性不可变,方法不可重写,类不可继承. [转]Java final 修饰符知识点总结 final从字面上理解含义为“最后的,最终的”.在Java中也同样表示 ...

  7. PL/SQL 访问网页(get or post方式)

    在我们开发plsql程序的过程中,有时候难免要访问一些外部网站的数据.这个时候我们就要用到utl_http包. 使用utl_http包前需要注意的是,当前的用户下是否有访问外部网络的权限. 如下是自己 ...

  8. 简单的完全背包HDU1114

    今天广州下雨啦,不过没关系啦,反正我最近也都在刷题学习算法. 昨天做了五题01背包,今天还是背包,不过是完全背包,估计做动态规划要持续好一段时间,一开始选了一道简单题目啦. HDU1114,看了小一段 ...

  9. ACM HDU 2674 N! Again(数论)

    继续数论.. Problem Description WhereIsHeroFrom:            Zty,what are you doing ? Zty:                 ...

  10. Fedora 21 设置开机启动脚本

    sudo touch /etc/rc.d/rc.localsudo vim /etc/rc.d/rc.local 在/etc/rc.d/rc.local文件中写入, 然后使用:wq命令 保存并退出. ...