pm2以cluster集群方式发布app,可以高效地利用多核cpu,有效提升吞吐量。在上周对公司的redmine服务器进行性能调优后,深感ruby on rails的性能低下,这次测试nodejs的sails框架,被其性能深深折服。

以下是使用pm2发布nodejs 应用的经历:

一:记录出现的问题记录。

1. pm2 start app.js -i 0

当使用以上指令时,出现提示说pm2 的cluster模式非常不稳定,建议不使用。但是官网上面却是推荐使用,为什么呢?

原来我的node版本过低,只有0.10.36,建议安装0.11.x以上的版本,然后再运行此命令,才能启动cluster模式。

2. 当我升级node到了0.12.13版之后,运行却发现依然是mode:fork模式。如下图:

──────────┬────┬──────┬───────┬────────┬─────────┬────────┬─────────────┬──────────┐
│ App name   │ id │ mode │ pid │ status │ restart │ uptime │ memory │ watching │
├──────────┼────┼──────┼───────┼────────┼─────────┼────────┼─────────────┼──────────┤
│ app            │ 0 │ fork    │ 15375 │ online │ 0 │ 0s │ 19.297 MB │ disabled │
└──────────┴────┴──────┴───────┴────────┴─────────┴────────┴─────────────┴──────────┘

原因是:pm2在问题一中启动之后并没有关闭,而是一直以deamon的形式运行着,而且会保持其启动模式,也就是说之前如果启动deamon是fork模式,那么之后你用pm2 start app.js -i 2时,即使指定了-i 也不再生效。

解决办法有两种:

1. 使用-f 参数强制其更换启动模式:pm2 start app.js -i 2 -f

2. 使用pm2 kill ,关闭deamon,然后重新使用pm2 start app.js开启。

二、nodejs性能

为了能够测试node在接近实际应用场景下地性能,我采用了一个sails框架,方便我快速搭建一个有sql数据访问的web app的性能。

然后在我买的一个ECS云服务器上测试,我云服务器的性能非常差,只有单核CPU+512内存,但是测试下来却发现,nodejs的异步特性使得其性能表现极为让人震惊。以下是用pm2以单进程形式发布的app, 请求一个包含sql查找操作的URL, ab测试结果如下:

ab -n  -c  http://localhost:1337/User/find/1
This is ApacheBench, Version 2.3 <$Revision: $>
Copyright Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking localhost (be patient)
Completed requests
Completed requests
Completed requests
Completed requests
Completed requests
Completed requests
Completed requests
Completed requests
Completed requests
Completed requests
Finished requests Server Software:
Server Hostname: localhost
Server Port: Document Path: /User/find/
Document Length: bytes Concurrency Level:
Time taken for tests: 3.724 seconds
Complete requests:
Failed requests:
Write errors:
Non-2xx responses:
Total transferred: bytes
HTML transferred: bytes
Requests per second: 268.52 [#/sec] (mean)
Time per request: 595.862 [ms] (mean)
Time per request: 3.724 [ms] (mean, across all concurrent requests)
Transfer rate: 121.82 [Kbytes/sec] received Connection Times (ms)
min mean[+/-sd] median max
Connect: 2.9
Processing: 112.2
Waiting: 112.2
Total: 112.2 Percentage of the requests served within a certain time (ms)
%
%
%
%
%
%
%
%
% (longest request)

可以看出,单进程情况下,抗住了将近270次请求,而且该请求还是包含sql操作的哦。

然后,换成用pm2 cluster模式,3个nodes, 性能反倒变成了120次,我想应该有两个原因,1是内存受限,2是单核CPU下,采用cluster只会增加cpu切换带来的负面影响,降低了cpu的有效利用率。

好了,如果各位对与node的性能感兴趣可以到我的github上clone sailsBench项目下来【参考1】,尝试下用pm2发布,然后用ab测试其性能。

参考:

1. https://github.com/todototry/sailsBench/

benchmark pm2的cluster模式发布web app的性能与相关问题解决方法的更多相关文章

  1. 【转】log4js在PM2的cluster模式下大坑

    请直接查看原文:https://blog.yourtion.com/fix-log4js-with-pm2-not-work.html 之前一直使用 debug 还有 console.log 去打日志 ...

  2. web项目中的跨域问题解决方法

    一种是JSONP 一种是 CORS. 在客户端Javascript调用服务端接口的时候,如果需要支持跨域的话,需要服务端支持. JSONP的方式就是服务端对返回的值进行回调函数包装,他的优点是支持众多 ...

  3. 【Visual Studio】VS发布应用未能创建默认证书的问题解决方法

    解决方法:点击你创建的项目 右键> 属性>签名>从存储区选择>选择证书这时候显示无可用证书 ,然后我从文件区选择了一个结果,又出现了第二个问题.提示我“签名时出错: 指定了无效 ...

  4. 菜鸟的Xamarin.Forms前行之路——从新建项目到APP上架各种报错问题解决方法合集(不定时更新)

    出自:博客园-半路独行 原文地址:http://www.cnblogs.com/banluduxing/p/7425791.html 本文出自于http://www.cnblogs.com/banlu ...

  5. WEB网站前端性能分析相关

    现在的网站分析工具,数据源主要有两种,分别是服务器日志(WebServer Log)和采集日志 买 优化要根据具体的业务和场景来分析 埋点:监控用户点击的每一步

  6. 12步创建高性能Web APP

    现在,Web App 日益重视用户的交互体验,了解性能优化的方式则可以有效提高用户体验.阅读和实践下面的性能优化技巧,可以帮你改善应用的流畅度.渲染时间和其他方面的性能表现. 概述 对 Web App ...

  7. 对Native App与Web App的一些思考

    前言 Native App:C/S架构,使用原生技术(Java/Objective-C/Swift)实现. Web App:B/S架构,使用浏览器技术来实现,广义上也包括phoneGap以及DP正在尝 ...

  8. socket.io搭配pm2(cluster)集群解决方案

    socket.io与cluster 在线上系统中,需要使用node的多进程模型,我们可以自己实现简易的基于cluster模式的socket分发模型,也可以使用比较稳定的pm2这样进程管理工具.在常规的 ...

  9. Web App时代的缓存机制新思路

    Web App常见架构 以WebQQ例,WebQQ这个站点的所有内容都是一个页面里面呈现的,我们看到的类似windows操作系统的框架,是它的顶级容器和框架,由AlloyOS的内核负责统筹和管理,然后 ...

随机推荐

  1. Web大文件上传控件-asp.net-bug修复-Xproer.HttpUploader6.2

    版权所有 2009-2016荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webapp/up6.2/in ...

  2. 今天在Mac机器上使用了Flex Builder编辑了一个源代码文件,保存后使用vim命令去打开时发现系统自动在每一行的结尾添加了^M符号,其实^M在Linux/Unix中是非常常见的,也就是我们在Win中见过的/r回车符号。由于编辑软件的编码问题,某些IDE的编辑器在编辑完文件之后会自动加上这个^M符号。看起来对我们的源代码没有任何影响,其实并不然,当我们把源代码文件Check In到svn之类

    今天在Mac机器上使用了Flex Builder编辑了一个源代码文件,保存后使用vim命令去打开时发现系统自动在每一行的结尾添加了^M符号,其实^M在Linux/Unix中是非常常见的,也就是我们在W ...

  3. 嵌入式linux自动登录

    最近又把同事的fl2440板子拿过来跑了起来,没有太大收获,就解决了一个自动登录的问题: ::respawn:/sbin/getty -L ttySAC0 115200 vt100 -n root - ...

  4. EJB到底是什么,真的那么神秘吗??

    1. 我们不禁要问,什么是"服务集群"?什么是"企业级开发"? 既然说了EJB 是为了"服务集群"和"企业级开发",那么 ...

  5. Android View 如何绘制

    上文说道了Android如何测量,但是一个漂亮的控件我只知道您长到哪儿,这当然不行.只需要简单重写OnDraw方法,并在Canvas(画布)对象上调用那根五颜六色的画笔就能够画出这控件"性感 ...

  6. 【Windows 10 IoT - 2】LED闪烁及动画绘制(树莓派 Pi2)

    在上一篇博文<Windows 10 IoT系统安装>中,我们实现了在树莓派2平台上运行Window 10 IoT,本篇文章将介绍在该平台上的程序开发. 在最初获得的资讯中,以为Window ...

  7. Xamarin.Android之动画

    Translate动画 这个动画是最常使用到的,主要就是将控件从一个位置移动到另一个位置,并且还可以在这其中增加一定的效果,下面我们将采用两种方式实现动画,首选的是利用XML来制作动画,其次就是利用代 ...

  8. solr与.net系列课程(三)solr连接数据库

     solr与.net系列课程(三)solr连接数据库 上一章直接讲述的配置文件把大部分人看的很迷惑,大家都想听的是solr到底是怎么用的,好,这一节我们就开始链接数据库,首先讲一下连接之前都要配置哪些 ...

  9. 一致性Hash算法在Redis分布式中的使用

    由于redis是单点,但是项目中不可避免的会使用多台Redis缓存服务器,那么怎么把缓存的Key均匀的映射到多台Redis服务器上,且随着缓存服务器的增加或减少时做到最小化的减少缓存Key的命中率呢? ...

  10. [ACM_搜索] POJ 1096 Space Station Shielding (搜索 + 洪泛算法Flood_Fill)

    Description Roger Wilco is in charge of the design of a low orbiting space station for the planet Ma ...