from:http://faylai.iteye.com/blog/1293194

1、避免使用同步的方法

nodejs 是基于单线程。为了让单线程能够处理高并发的请求,我们尽量要避免让线程等待,阻塞,同步,和长时间运行某项操作。nodejs 一个显著的特点就是彻头彻尾的异步。这个特性在基于事件驱动的应用上表现的非常的出色。

不幸的是在nodejs 中仍然存在可以同步或者阻塞调用方法。例如,许多的文件系统操作既有异步的方法也有同步的方法,像 fs.writeFile 和 fs.writeFileSync。尽管你避免在代码中使用同步的方法,但你引用的外部库中可能包含致使阻塞的方法调用。一旦这种情况出现,将会对性能产生显著的影响。

// 正确写法: 异步的写文件
fs.writeFile('message.txt', 'Hello Node', function (err) {
console.log("It's saved and the server remains responsive!");
});
 
// 音响性能的写法: 同步的写文件
fs.writeFileSync('message.txt', 'Hello Node');
console.log("It's saved, but you just blocked ALL requests!");
2、关闭 socket 连接池

nodejs http client 自动使用socket 连接池,默认情况下每个主机将socket per 限制到五个。当socket 被回收重用后资源的增长将会无法控制,特别是你要处理从同一主机发送大量并发请求数据时候将会导致严重的性能瓶颈。这种情况下,最好的解决办法是增加 maxSockets 或者禁用 socket 连接池:

var http = require('http');
var options = {.....};
options.agent = false;
var req = http.request(options)
3、不要用nodejs 来管理静态资源
静态资源像css文化和图片文件,可以使用其他的web服务器来管理,比如 nginx ,或者你把你的文件上传到CDNs.
这样做有两个好处:(1)减少nodejs 的负载(2)CDNs可选择最近的服务器然投递静态内容减少了传输延迟。
4、渲染放到客户端
让我们快速比较下页面在服务端渲染和客户端渲染区别。如果我们用nodejs 渲染,每次请求我们返回的html如下:
<html>
<head>
<title>LinkedIn Mobile</title>
</head>
<body>
<div class="header">
<img src="http://mobile-cdn.linkedin.com/images/linkedin.png" alt="LinkedIn"/>
</div>
<div class="body">
Hello John!
</div>
</body>
</html>
显然的除了用户的名字是动态,其他都是静态。也就是说相同东西每次都要加载一遍。更有效的方法就是直接让
nodejs 返回动态的json数据:
{"name": "John"}
剩下的静态标签可以使用javascript 模版引擎
<html>
<head>
<title>LinkedIn Mobile</title>
</head>
<body>
<div class="header">
<img src="http://mobile-cdn.linkedin.com/images/linkedin.png" alt="LinkedIn"/>
</div>
<div class="body">
Hello <%= name %>!
</div>
</body>
</html>
静态javascript 模版可以用nginx 代理,其实如果放到CDN就更好了。
另外你可以在模版第一次时保存到浏览器缓存中或者存放到 本地存储中。之后页面初始化完毕,
就剩下动态的json数据 的交互。大大减小了cpu 时间和io 负载。
 
5、开启gzip
越来越多的web服务器和客户端支持gzip 压缩。
这个好处真的不要放过哦,不管是响应客户端或者请求服务都可以采用。
6、使用并行
试着把请求远程服务,数据库调用,文件系统访问这些操作并行起来运行。如果按照线性的步骤来运行这些费时
的操作延迟总量等于每个操作延时总和。推荐使用Step 来管理你的callback 流程。
7、尽量不要使用session
Express framework 管理request/response 的生命周期,许多 express 的例子包含下面的配置:
app.use(express.session({ secret: "keyboard cat" }));
 
默认情况下,seesion 是存储在内存中的,这个会增加服务器的额外开销,特别用户量增加时候。
你可以把session 存储到数据库,例如MongoDB 或者Redis ,
但是每个请求的都会从数据库查询session 信息这样也增加了额外的性能开销。
如果可以,最好的选择不要在服务端存储状态信息。express 中没这样的配置,但是性能提升是显然。
8、使用二进制模块
如果可以,使二进制模块来取代javascript 的模块,
例如当我们从用javascript 写SHA 的模块切换到编译成二进制模块时,我们发现很大性能提升空间。
// 使用本地内置的二进制模块
var crypto = require('crypto');
var hash = crypto.createHmac("sha1",key).update(signatureBase).digest("base64");
9、使用标准v8 javascript 而不是客户端库
许多的javacript 库专门用于web浏览器,
这些浏览器的javascript 引擎不一致:有些浏览器支持某些方法像 forEach,map 和reduce,
但是其他的浏览器没有这些方法。
结果导致,客户端库含有许多有损性能的代码来保证方法的兼容。
话说回来,你要准确的知道nodejs 哪些方法是可以用的:nodejs 使用v8 引擎 ,v8 实现了 ECMA-262, 5th edition. 直接使用v8标准函数将会获得大的性能提升。
 
10、 保持代码简洁
 
保持的你的代码的清洁不管是客户端或者服务端。不断的审视自己:"我们真需要这个模块吗?","为什么需要这个框架","性能的消耗值得吗?","是否有更简单的方法?"。简洁的代码往往更加的高效。

极速Node.js:来自LinkedIn的10个性能提升秘籍的更多相关文章

  1. 成为优秀 Node.js 程序员的10个习惯

    JavaScript出现近二十年了,但由于其有些问题不能解决,使得像Python和Ruby这一类的语言很吸引人,这些问题包括命令行接口.交互式开发环境.包的管理和没有一个有组织开源社区等.幸亏Node ...

  2. 编写 Node.js Rest API 的 10 个最佳实践

    Node.js 除了用来编写 WEB 应用之外,还可以用来编写 API 服务,我们在本文中会介绍编写 Node.js Rest API 的最佳实践,包括如何命名路由.进行认证和测试等话题,内容摘要如下 ...

  3. Practical Node.js (2018版) 第10章:Getting Node.js Apps Production Ready

    Getting Node.js Apps Production Ready 部署程序需要知道的方面: Environment variables Express.js in production So ...

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

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

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

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

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

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

  7. Mac下配置node.js环境(Mac 10.12)

    有安装就有卸载,卸载教程参考:http://www.cnblogs.com/EasonJim/p/6287141.html 一.官方下载pkg安装包 1.安装 到官网https://nodejs.or ...

  8. 你不知道的Node.js性能优化,读了之后水平直线上升

    本文由云+社区发表 "当我第一次知道要这篇文章的时候,其实我是拒绝的,因为我觉得,你不能叫我写马上就写,我要有干货才行,写一些老生常谈的然后加上好多特技,那个 Node.js 性能啊好像 D ...

  9. 10个最佳Node.js企业应用案例:从Uber到LinkedIn

    译者按: Node.js 8已经发布了,NPM模块每周下载量早已超过10亿,从Uber到LinkedIn都在使用Node.js,谁说JavaScript不能写后台? - 原文: 10 best Nod ...

随机推荐

  1. 657. Judge Route Circle【easy】

    657. Judge Route Circle[easy] Initially, there is a Robot at position (0, 0). Given a sequence of it ...

  2. 使用nmap 验证多种漏洞

    0x00 前言 大家都知道在平时的漏扫中,AWVS.APPSCAN.Netspark.webspectort等漏扫工具扫描出来的漏洞问题往往存在误报,这时我们就需要进行人工手动验证漏洞,这里我们有两种 ...

  3. shell脚本中多命令单行执行_转

    多命令一起执行 如果希望把几个命令合在一起执行, shell提供了两种方法.既可以在当前shell也可以在子shell中执行一组命令. 对{}和()而言, 括号中的重定向符只影响该条命令, 而括号外的 ...

  4. 个人博客开发之 ueditor 安装

  5. Manjaro折腾笔记:我的数据科学环境搭建之路

    ss并且开机启动 0. 安装shadowsocks sudo pip install shadowsocks 1. 建立配置文件ss.json 我的位置是:/home/ray/Documents/sh ...

  6. Hibernate无主键配置文件编写

    1.       环境:jdk1.4+hibernate2.0+weblogic8 一般情况下,我们建的表都会有主键,然后根据hibernate的配置文件编写条件 有一个主键key,剩下的是Prope ...

  7. 第一百六十八节,jQuery,表单选择器

    jQuery,表单选择器 学习要点: 1.常规选择器 2.表单选择器 3.表单过滤器 表单作为 HTML 中一种特殊的元素,操作方法较为多样性和特殊性,开发者不但可以 使用之前的常规选择器或过滤器,也 ...

  8. CGI(Common Gateway Interface),通用网关接口

    通用网关接口,简称CGI,是一种根据请求信息动态产生回应内容的技术.通过CGI,Web 服务器可以将根据请求不同启动不同的外部程序,并将请求内容转发给该程序,在程序执行结束后,将执行结果作为回应返回给 ...

  9. Spring MVC 分离了控制器、模型对象、过滤器以及处理程序对象的角色

    通过策略接口,Spring 框架是高度可配置的,而且包含多种视图技术,例如 JavaServer Pages(JSP)技术.Velocity.Tiles.iText和POI.Spring MVC 框架 ...

  10. Spring学习笔记及资源

    极客学院团队出品 Spring 教程  http://wiki.jikexueyuan.com/project/spring/ Spring 提供了以下两种不同类型的容器. 序号 容器 & 描 ...