使用pm2以cluster mode 发布应用的方法

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 1000 -c 160 http://localhost:1337/User/find/1
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests

Server Software:
Server Hostname: localhost
Server Port: 1337

Document Path: /User/find/1
Document Length: 40 bytes

Concurrency Level: 160
Time taken for tests: 3.724 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Non-2xx responses: 1000
Total transferred: 464566 bytes
HTML transferred: 40000 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: 0 1 2.9 0 14
Processing: 213 579 112.2 588 959
Waiting: 213 578 112.2 587 958
Total: 213 580 112.2 588 961

Percentage of the requests served within a certain time (ms)
50% 588
66% 600
75% 611
80% 618
90% 633
95% 787
98% 898
99% 943
100% 961 (longest request)

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

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

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

参考:

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

时间: 2024-10-27 07:27:50

使用pm2以cluster mode 发布应用的方法的相关文章

iOS7.1 企业应用https发布的解决方法(opendrive云盘取代dropbox)

1. 注册前的准备工作 2. 注册 3. 注册成功后页面,点击下图红色标记的"设置",进入第4步 4. 按照红色标记的步骤进行操作即可,点击红色标记3"留下您的评论"进入第5步(一定要进行此步操作哦) 5. 记得点击红色标记"满意"哦,进入第6步页面 6. 也一定要在红色标记输入框内输入一个分享opendrive的博文或者日志链接哦,这个东东他们可能会去检测吧,保险起见还是照着做吧,具体分享内容参见:http://hi.baidu.com/qqp

Redis发布订阅使用方法

Redis发布订阅 发布订阅模式中发布消息的为publisher即发布者,接收消息的为subscriber即订阅者.在Redis中,所有的消息通过channel即频道进行发布,一个发布者可以向多个channel发布消息,一个订阅者也可以订阅多个channel.Redis不对消息进行持久化,如果消息发布时订阅者还没有进行订阅,则不会再收到此消息. 发布订阅命令 命令 格式 说明 PUBLISH PUBLISH channel message 发布message到指定的channel SUBSCRI

用AXIS2发布WebService的方法(转)

Axis2+tomcat6.0 实现webService 服务端发布与客户端的调用. 第一步:首先要下载开发所需要的jar包 下载:axis2-1.6.1-war.zip http://www.apache.org/dist//axis/axis2/java/core/1.6.1/ 下载完后解压至tomcat安装目录下的webapps文件夹下,启动tomcat后,在webapps目录下会生成axis2文件夹. 访问http://localhost:8080/axis2/能看到以下页面表示axis

不同网段无法加载ArcGIS Server发布服务解决方法

问题描述: ArcGIS Server 10发布的服务, (1)在相同网段的Desktop9.3和Engine 9.3程序下可以正常显示, (2)在不同网段Desktop9.3和Engine 9.3程序下都无法加载显示, (3)在相同或不同网段Desktop10.1和Engine 10.1程序下均可正常显示, 问题原因: ArcGIS Server 发布服务虚拟目录下用的是机器名,而不是IP地址,不同网段下无法识别服务器机器名. 解决方法: 修改ArcGIS Server 发布服务虚拟目录路径为

net发布的dll方法和类显示注释信息(字段说明信息)[图解]

自己发布的dll添加的另一个项目中突然没有字段说明信息了,给使用带来了很多的不便,原因是为了跨项目引用,所以导致不显示注释信息的,一下是解决这个问题的方法. 在要发布(被引用)的项目上右键 => 属性 => 生成 => xml文档文件勾中生成即可,如图: 使用: 1.把生成的dll文件添加到项目Bin中. 2.把生成的xml文件添加到项目Bin中(ex:上图的xml文件为 com.uuu9.api.XML). 到此大功告成.

Dedecms5.7修改文章,不改变发布时间的方法

今天使用dedecms 5.7在后台修改文章,发现了一个诡异的问题:就是当你文章修改完后,它的发布时间也会随之更新,这样就会导致前台的文章顺序发生变化,好多旧的文章被置 顶了.也许站长们比较喜欢这个功能,相当于自动更新了,但是有些朋友也许不想这样,懒鱼今天就教大家如何在Dedecms5.7中,能够保证修改文章后, 发布文章的时间仍然是老时间,而非修改文章后的时间,其实很简单:找到下面的文件和代码:dede/templets/article_edit.htm $nowtime = GetDateT

DedeCMS文章按发布时间排序方法

织梦 DEDECMS5.7 这个版本存在一个问题,修改文章的同时也修改了文章的发布时间,这种情况下,如果我们调用最新文章时使用按“发布日期排序”,就会打乱原来我们网站上的文章的顺序. 如何让我们发布的文章永远按照我们最初发布的日期来排序,即使我们去修改某个文章后,不影响这个排序呢?这就需要我们修改一下 DEDE 程序中的自动修改文章发表日期时间的代码.打开自已网站的 FTP 空间,找到以下文件:/dede/templets/article_edit.htm ,在 article_edit.htm

消息队列 ActiveMQ的简单了解以及点对点与发布订阅的方法实现ActiveMQ

Apache ActiveMQ是Apache软件基金会所研发的开放源代码消息中间件: 由于ActiveMQ是一个纯Java程序,因此只需要操作系统支持Java虚拟机,ActiveMQ便可执行. ActiveMQ是用来干什么的? 用来处理消息,也就是处理JMS的.消息队列在大型电子商务类网站,如京东.淘宝.去哪儿等网站有着深入的应用, 队列的主要作用是消除高并发访问高峰,加快网站的响应速度. 在不使用消息队列的情况下,用户的请求数据直接写入数据库,高发的情况下,会对数据库造成巨大的压力, 同时也使

Zend Studio 12.0.2正式版发布和破解方法,zend studio 12.0.1汉化,相式设置为Dreamweaver,空格缩进为4个, 代码默认不折叠的设置,Outline中使用的图形标志,代码颜色之eot设置。

背景:zend studio 12.0.2 修复了一个12.0.1的:  Fixed problem with referenced variables marked as undefined,我都说好像有问题,刚开始还以为是破解得有问题呢. AddTime:2015-4-5zend studio 12.0.2 破解&keygen:http://download.csdn.net/detail/wfstock/8418635 破解ZendStudio 10.1:刚才装了个ZendStudio 1