阅读更多



【译注】:LinkedIn 最近从 Rails转移到 Node.js 获得了巨大的成功,它砍掉了之前90%的服务器,并使性能提升了20倍。这个消息令很多人把 Node.js 看成了葵花宝典一样的神功,可是练习神功也不是一朝一夕的事,光练招式没有内功也是不成的,更何况还得…那啥…总之不容易啊!那么除了Node.js,LinkedIn 的性能提升还有什么秘密?LinkedIn 的软件工程师 Shravya Garlapati 写的这篇文章可以给我们一些启示。

以下是译文:

在之前的文章里,我们讨论了我们如何测试LinkedIn的移动服务集群,包括我们的 Node.js 移动端服务器。今天,我们想给你们说说我们是如何让这个服务器快速运行的。这里就是我们在 Node.js 上的十大性能提升秘籍:

1. 避免同步的代码

Node.js 从一开始的设计就是单线程的。要让一个线程处理很多并发请求,你就永远不要让这个线程在阻塞、同步或运行时间很长的操作中等待。Node.js的一个超凡脱俗的特性就是它从上到下都是设计和实现为异步模式。这使它对事件驱动的应用是绝配。

不幸的是,在Node.js里进行同步/阻塞式的调用还是有可能的。例如,很多文件系统操作都提供了异步和同步版本,例如writeFile和writeFileSync。即便你在自己的代码里避免了同步方法,却有可能漫不经心地引入了一个外部库,而在该库中使用了阻塞式调用。当你这么做了之后,它对性能的影响是巨大的。

// Good: write files asynchronously
fs.writeFile('message.txt', 'Hello Node', function (err) {
  console.log("It's saved and the server remains responsive!");
});
 
// BAD: write files synchronously
fs.writeFileSync('message.txt', 'Hello Node');
console.log("It's saved, but you just blocked ALL requests!");


我们最初的日志实现就偶然性地引入了一个写入磁盘的同步调用。在我们进行性能测试之前,没人注意到它的存在。当我们在一台开发机上对比单个Node.js服务器性能的时候,这一个同步调用导致性能从每秒处理1000个请求下降到几十个!

2. 关闭socket池

Node.js的http模块会自动使用socket池,缺省是每台主机限制为5个socket。虽然这种socket复用方式可能对控制资源增长的速度有利,但如果你需要处理很多同时需要从同一台主机获取数据的并发请求,这个socket池会成为严重的性能瓶颈。在这种情况下,好的办法是增大maxSockets参数或者干脆把socket池disable掉。

// Disable socket pooling
 
var http = require('http');
var options = {.....};
options.agent = false;
var req = http.request(options)


3. 不要用Node.js处理静态资源

对于静态资源,例如CSS和图像,使用标准的web服务器而不是Node.js来处理。例如,LInkedIn mobile使用nginx。我们还利用内容分发网络(CDN),它能把静态资源复制到分布在全世界的很多服务器上。这样做有两大益处:①减少了Node.js服务器的负载,②CDN能让静态内容从离用户比较近的服务器上传输过去,这样减少了延迟。

4. 在客户端渲染页面

让我们快速比较一下服务器端渲染和客户端渲染页面。如果我们让Node.js在服务器端渲染,我们会对所有请求发回一个类似于本文的HTML页面。

<!-- An example of a simple webpage rendered entirely server side -->
 
<!DOCTYPE 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>


请注意,在这个页面上,除了用户名之外,所有内容都是静态的:也就是说,对于每个用户和每次刷新都是完全相同的。所以更有效率的方法是让Node.js只以JSON格式返回页面所需的动态数据。

{"name": "John"}


页面的其他部分,也就是所有的静态HTML标记,可以放到一个JavaScript模板里(例如一个underscore.js模板)。

<!-- An example of a JavaScript template that can be rendered client side -->
 
<!DOCTYPE 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 <%= name %>!
    </div>
  </body>
</html>


性能的受益是这么来的:根据秘籍3,静态JavaScript模板可以从你的web服务器(例如nginx)或者CDN获取。而且,JavaScript模板可以缓存在客户端或保存在本地存储,这样初始加载页面之后,唯一需要传给客户端的就是动态JSON数据,这是最高效率的做法。该方法极大地减少了Node.js服务器上占用的CPU, IO和负载。

5. 使用gzip压缩

大部分服务器和客户端都支持gzip压缩请求和响应的数据。一定要在对客户端发送响应和对远程服务器发送请求时利用它。



6. 并行

尽量让你所有的阻塞式操作(比如,对远程服务的请求,数据库调用,和文件系统访问)并发进行。这样会把总延迟减少为最慢的哪个阻塞式操作的时间,而不是每个操作顺序进行的延迟总和。为了保持回调函数和错误处理整洁清楚,我们使用了Step来进行流程控制。



7. 避免使用session

LinkedIn mobile使用Express框架来管理请求/响应循环。

app.use(express.session({ secret: "keyboard cat" }));


缺省情况下,session数据是保存在内存里的,这样会给服务器增加相当大的开销,特别是在用户数增长的情况下。你可以改用外部session存储,例如MongoDB或Redis,可是这样每个请求又增加了获取session数据的远程调用的开销。在可能的情况下,最好的办法是根本就不在服务器端保存状态信息。通过去掉Express里类似于 “app.use(express.session()); ” 的配置,实现无session后,你会看到更好的性能。(【译者注】原文缺了具体配置,这条是译者自己琢磨着加的)

8. 使用已编译的模块

尽可能使用已编译的模块而不是JavaScript模块。例如,当我们把SHA模块从一个用JavaScript写的版本转到一个包含在Node.js里的已编译版本,我们看到了一个巨大的性能飞跃。

// Use built in or binary modules
var crypto = require('crypto');
var hash = crypto.createHmac("sha1",key).update(signatureBase).digest("base64");


9. 使用标准V8 JavaScript而不是客户端的库

大部分JavaScript库是做出来用在web浏览器上的。而在浏览器上JavaScript环境真是千差万别:例如,某个浏览器可能支持类似于forEach, map/reduce这样的功能,而其他浏览器却不支持。结果,客户端的库通常包含了很多低效率的代码来克服浏览器带来的差别。另一方面,在Node.js里,你能明确知道有哪些JavaScript函数,因为支撑Node.js的V8 JavaScript引擎是按第5版 ECMA-262 标准描述的ECMAScript标准实现的。通过直接使用标准的V8函数而不是客户端库里的东西,你可以看到相当大的性能改进。

10. 保持你的代码小规模、轻量级

在设备慢、延迟高的移动客户端环境下工作,你会学着保持代码的小规模和轻量级。把这个思路也带到你服务器端的代码中去。经常重新思考你的决定,问自己一些问题,例如:“我们真的需要这个模块吗?”,“我们为啥要用这个框架?与其产生的开销相比它是否值得用?”,“我们能不能用更简单的方式来做这件事?”。更小,更轻量的代码总是会更有效率,也会更快。

英文原文:LinkedIn,编译:@老码农的自留地
译文链接:http://blog.jobbole.com/40135/
  • 大小: 9.6 KB
来自: 伯乐在线
3
0
评论 共 5 条 请登录后发表评论
5 楼 wangguo 2013-05-28 09:39
hantsy 写道
原文有大量的代码说明。

并且有配图说明其 Node.js server 和 Backend Servers 之间的交互。

已在文中添加上了
4 楼 hantsy 2013-05-28 07:48
原文有大量的代码说明。

并且有配图说明其 Node.js server 和 Backend Servers 之间的交互。
3 楼 hantsy 2013-05-28 07:41
文不对题,译注完全是误导读者。

原文是针对 Linkedin Mobile。。。http://engineering.linkedin.com/nodejs/blazing-fast-nodejs-10-performance-tips-linkedin-mobile

我个人记得 Linkedin 网站的技术架构是从 Rails 转换到 Java(Spring,Scala 等)。
2 楼 clxy 2013-05-27 18:01
引用
避免使用session

怎么做到的呢?
1 楼 elgs 2013-05-27 16:10
Good article!

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 【Antlr】Antlr API 简介

    antlr包结构介绍,以及简单的api解释

  • 自然语言理解的一套有用的ppt还有一些习题和答案

    这个是研究生的一门自言语言理解的课程资源。包括下面内容: 1,自然语言理解基本概念 2,句法和句法分析 3,特征和扩充文法 4,自然语言句法 5,词法 6,语义理解 7,统计语言模型 8,高效分析方法 还有一个关于范畴表达式的ppt。 希望对大家有帮助,欢迎大家加入自然语言处理的大家庭!

  • 2021年11月推荐阅读的10篇论文

    随着我们接近 2021 年底,arXiv 上的论文首次发表量增长似乎正在放缓:经过几年持续呈指数增长(每年 30-40%)后,看起来 2021 年的发表量 2020 年的排名仅略高于 2020 年(高出约 10%)。 我们会看到 NeurIPS 和 ICLR 的强劲增长吗? 或者人工智能研究已经成熟? 让我们先从过去几周的一些热门新闻开始: EMNLP将于 11 月 7 日至 11 日以线上线下混合形式举行:同时在线和在多米尼加共和国蓬塔卡纳举行(这个地方你都没听说过吧,它可是海滩度假的最佳选择之一,所以

  • NLP | 自然语言处理 - 语法解析(Parsing, and Context-Free Grammars)

    在自然语言学习过程中,每个人一定都学过语法,例如句子可以用主语、谓语、宾语来表示。在自然语言的处理过程中,有许多应用场景都需要考虑句子的语法,因此研究语法解析变得非常重要。语法解析有两个主要的问题,其一是句子语法在计算机中的表达与存储方法,以及语料数据集;其二是语法解析的算法。这也是本章将要讨论的内容。

  • eclipse注释xml文档模板

    该文件是本人在eclipse中写好的注释模板,然后导出来的,希望对大家有用

  • 2021_02_22_星期二_第一章_Java概述

    第一章 Java概述 DOS常用命令 dir directory 列出目录下的文件及文件夹 md make directory 创建一个目录 rd remove directory 删除一个目录 exit 退出 cls clean sreen 清屏 cd change directory 进入指定目录 Java语言平台版本 标准版 J2SE Java 2 Platform Standard Edition 开发普通桌面和商务应用程序提供的解决方案,是其他两个版本的基础,可以完成一些桌面应用程序的开发

  • 【总结】自然语言处理(NLP)算法:概述与分类

    摘要:最近在准备面试NLP的一个岗位,因此先提前准备一些知识点防止被问到。主要参考自然语言处理(NLP)知识结构总结和知乎上的一些问答。 目录 NLP界神级人物 NLP知识结构 1.概述 2.形式语言与自动机 3.语言模型 4.概率图模型,生成模型与判别模型,贝叶斯网络,马尔科夫链与隐马尔科夫模型(HMM) 5.马尔科夫网,最大熵模型,条件随机场(CRF) 6.命名实体 识别,词性标注,...

  • Java必备常见单词

    资源共享学习交流群号:769674658(快满) qq交流二群(296389054) (一)Java 基础 public 公有的 private 私有的 protected 保护的 ...

  • 华为诺亚方舟实验室主任李航:迎接自然语言处理新时代

    作者简介:李航,华为技术有限公司诺亚方舟实验室主任。主要研究方向为信息检索、自然语言处理、机器学习等。 本文经李航博士授权发布,未经作者允许不得转载。 欢迎人工智能领域技术投稿、约稿、给文章纠错,请发送邮件至heyc@csdn.net 人类的语言具有什么特性?下面是几位最权威学者的看法。语言是草根现象,它像是维基百科,聚集了数以十万计的人的贡献。当人们要找到更好的表达自己思想方式...

  • 自然语言处理(NLP)知识结构总结

    作者简介:小郭,计算机专业在读硕士研究生,AI学习与爱好者,欢迎交流,留言或者邮箱guo_jc5@163.com。本文选自CSDN博客。自然语言处理知识太庞大了,网上也都...

  • 自然语言理解笔记

    这个是看宗成庆老师的讲义做的一个笔记,以便

  • 自然语言处理(NLP)入门指南资料

    作者:Melanie Tosik  翻译:闵黎  校对:丁楠雅 Melanie Tosik目前就职于旅游搜索公司WayBlazer,她的工作内容是通过自然语言请求来生产个性化旅游推荐路线。回顾她的学习历程,她为期望入门自然语言处理的初学者列出了一份学习资源清单。 displaCy网站上的可视化依赖解析树 https://demos.explosion.ai/d

  • 自然语言处理NLP(7)——句法分析a:Chomsky(乔姆斯基)形式文法

    在上一部分中,我们介绍了NLP领域最基本的问题:词法分析,现阶段解决该问题最常用的方法就是将其转化为序列标注问题,根据解决序列标注问题的方法对其进行解决。 在这一部分中,我们将在词法分析的基础上介绍句法分析。 句法分析的任务是确定句子的句法结构或句子中词汇之间的依存关系,主要包括三种:完全句法分析、局部句法分析、依存关系分析。 其中,前两种句法分析是对句子的句法结构进行分析(也称为短语结构分析),...

  • 自然语言处理(NLP)相关资料汇总

    自然语言处理怎么最快入门? - 刘知远的回答 - 知乎 https://www.zhihu.com/question/19895141/answer/24710071 刘老师主要是从ACL等著名NLP相关会议的角度来介绍如何跟进NLP领域的研究 ...

  • 自然语言处理-哈工大笔记

    自然语言处理(计算机语言学、自然语言理解) 涉及:字处理,词处理,语句处理,篇章处理词处理分词、词性标注、实体识别、词义消歧语句处理句法分析(Syntactic Analysis)、语义分析(Senmantic Analysis)、机器翻译、语音合成篇章处理自动文摘当前热点信息抽取、文本分类、问答系统统计语言模型分词字串均分为词串。难点:未登录词 最大匹配法/逆向最大匹配法/双向匹配法/最佳匹配

  • SQuAD,斯坦福在自然语言处理的野心

    本文将详细叙述今年目前为止自然语言处理界最重量级的数据集 SQuad 。 SQuAD 是斯坦福大学于2016年推出的数据集,一个阅读理解数据集,给定一篇文章,准备相应问题,需要算法给出问题的答案。此数据集所有文章选自维基百科,数据集的量为当今其他数据集(例如,WikiQA)的几十倍之多。一共有107,785问题,以及配套的 536 篇文章。数据集的贡献者为斯坦福Percy Liang等人,Percy Liang是自然语言处理界的一位全才,在Semantic Parsing, QA, Optimization

  • 《自然语言计算机形式分析的理论与方法》读书笔记(3-1)

    第三章 基于短语结构语法的形式模型(一)最为广泛的是短语结构语法PSG大佬合影!(http://blog.sina.com.cn/s/blog_72d083c70100o8m8.html) (左:冯志伟;右:乔姆斯基;图源冯志伟文化博客)3.1 语法的Chomsky层级形式语法: G=(Vn,Vt,S,P)G=(V_n,V_t,S,P),其生成的语言为L(G)L(G) VnV_n:非终结符

  • Stanford深度学习与自然语言处理讲义下载(CS224)

    BAT直通车提供了Stanford大学计算机课程CS224——深度学习与NLP相关的讲义,有需要的小伙伴可以直接下载。下载链接——CS224课件下载链接

  • Chu-Ren Huang 黃 居 仁(computational linguistics)

    http://cwn.ling.sinica.edu.tw/huang/huang.htmAffiliation / 現職中央研究院語言學研究所 研究員Research Fellow, Institute of Linguistics, Academia Sinica.   計算語言學與中文語言處理國際研究生學程 召集人 Director, CLCL

Global site tag (gtag.js) - Google Analytics