[不辨不明]nodejs通过扩展pm2解决多核心利用问题是真解决问题了吗?Swoole为何没有这样去做的原因...

背景:今天在swoole群里贴了一个nodejs和swoole的形象区别,于是出现了两派互相不服的文字争论,nodejs高大上的部署方式-PM2和swoole自带的一个辩论。

下面3点摘自:http://blog.csdn.net/leftfist/article/details/41891407

1)CPU密集型任务存在短板

如上所述,nodejs的机制是单线程,这个线程里面,有一个事件循环机制,处理所有的请求。如图所示。在事件处理过程中,它会智能地将一些涉及到IO、网络通信等耗时比较长的操作,交由worker threads去执行,执行完了再回调,这就是所谓的异步IO非阻塞吧。但是,那些非IO操作,只用CPU计算的操作,它就自己扛了,比如算什么斐波那契数列之类。它是单线程,这些自己扛的任务要一个接着一个地完成,前面那个没完成,后面的只能干等。因此,对CPU要求比较高的CPU密集型任务多的话,就有可能会造成号称高性能,适合高并发的node.js服务器反应缓慢。结论是:NodeJS适合运用在高并发、I/O密集、少量业务逻辑的场景。

2)无法利用CPU的多核

最开始,线程只是用于分配单个处理器处理时间的一种机制。但假如操作系统本身支持多个CPU/内核,那么每个线程都可以得到一个不同自己的CPU/内核,实现真正的“并行运算”。在这种情况下,多线程程序可以提高资源使用效率。Node.js是单线程程序,它只有一个event loop,也只占用一个CPU/内核。现在大部分服务器都是多CPU或多核的,当Node.js程序的event loop被CPU密集型的任务占用,导致有其它任务被阻塞时,却还有CPU/内核处于闲置的状态,造成资源的浪费。

解决方案

利用原生模块或第三方模块,开辟进程或子进程,用于处理这些特殊的任务。

3)如果有异常抛出,因为是单线程,整个项目将不可用。但这归根到底是代码的问题,糟糕的代码,不管什么体系,都会有问题,即使不崩溃。解决办法是用pm2等工具来运行?

说到密集型计算:其实PHP也好不到哪儿去,这块还得c和c++,解释性的语言对于密集型计算都好不到哪去,这块即使是nginx也可能出现事件队列出现阻塞的情况,(见:http://justwinit.cn/post/8433/):

nodejs的机制是单线程,这个线程里面,有一个事件循环机制,处理所有的请求。如图所示。在事件处理过程中,它会智能地将一些涉及到IO、网络通信等耗时比较长的操作,交由worker threads去执行,执行完了再回调,这就是所谓的异步IO非阻塞吧。但是,那些非IO操作,只用CPU计算的操作,它就自己扛了,比如算什么斐波那契数列之类。它是单线程,这些自己扛的任务要一个接着一个地完成,前面那个没完成,后面的只能干等。因此,对CPU要求比较高的CPU密集型任务多的话,就有可能会造成号称高性能,适合高并发的node.js服务器反应缓慢。

=======================================================================================

附录,对话记录,QQ及Email均*替代,保留昵称:

回忆未来-向东-Jàck(********7693) 15:48:05

作为顾问,必须把这个swoole形象化,

swoole解决了nodejs的这样一个问题:

无聊咔咔(*******) 15:51:47

用swoole就不用部署啊

忘却浮生(********0660) 15:52:33

node怎样的问题哦

@PUPPY@<puppywang@vip.qq.com> 15:54:01

双击查看原图

小马哥[̲̅V̲̅I̲̅P̲̅]<******@qq.com> 15:54:02

无聊咔咔  15:51:47

用swoole就不用部署啊

不用部署是个什么意思?不用安装在机器上就能用吗?

小马哥[̲̅V̲̅I̲̅P̲̅]<******@qq.com> 15:55:07

@无聊咔咔 http://pm2.keymetrics.io/

无聊咔咔(********3145) 15:55:09

安装个扩展也算部署么

小马哥[̲̅V̲̅I̲̅P̲̅]<******@qq.com> 15:55:37

对啊,pm2 就是个启动命令,跟你启动 swoole 的程序一样。

无聊咔咔(********3145) 15:55:51

有点吊

小马哥[̲̅V̲̅I̲̅P̲̅]<******@qq.com> 15:55:54

pm2 不需要你特别改写你的程序,swoole 你要用扩展来写程序

小马哥[̲̅V̲̅I̲̅P̲̅]<******@qq.com> 15:56:19

还有强大的监控界面

@PUPPY@<puppywang@vip.qq.com> 15:57:07

strongloop也不错

小马哥[̲̅V̲̅I̲̅P̲̅]<******@qq.com> 15:57:43

嗯,所以不要随便黑nodejs,nodejs可用的东西实在是太多了

无聊咔咔(********3145) 15:59:18

哪敢啊,js除了回调蛋疼点

无聊咔咔(********3145) 15:59:21

其他其实都还好

回忆未来-向东-Jàck(********7693) 16:00:48

nodejs的兄弟,不要随便理解那个图的含义,我是想说这个:

作者:韩天峰

链接:http://www.zhihu.com/question/29453255/answer/44726099

摘录:

并行问题,node.js是单线程的,无法利用到服务器的所有CPU。想要解决只能自己用cluster/child_process扩展自行实现。如果不熟悉多进程/多线程编程,这会非常困难,很容易出现BUG。而swoole是内置多线程/多进程,完全不需要用户考虑,配置一下进程数即可。

小马哥[̲̅V̲̅I̲̅P̲̅]<******@qq.com> 16:05:03

@回忆未来-向东-Jàck 我说的就是这个,nodejs是单线程的,所以开发程序的时候不需要考虑并发产生的各种问题,而pm2又可以直接在部署的时候直接把多核多CPU利用起来,所以更不需要自己操心多线程编程问题,不用多线程,照样跑满所有CPU,这不是大家梦寐以求的吗?

无聊咔咔(********3145) 16:06:45

这么叼,Rango呢,快来力排众议双击查看原图

Mr.Gray<******@qq.com> 16:07:00

顾问顶住

小马哥[̲̅V̲̅I̲̅P̲̅]<******@qq.com> 16:07:05

所以 swoole 的最大优势是让php开发人员不需要学nodejs,也可以做 nodejs 能做的事情。

半桶水<shenzhe163@gmail.com> 16:07:44

pm2能解决进程间的通信么?

小马哥[̲̅V̲̅I̲̅P̲̅]<******@qq.com> 16:08:18

做nodejs编程不需要考虑进程间通讯啊

小马哥[̲̅V̲̅I̲̅P̲̅]<******@qq.com> 16:09:50

如果非要自己搞进程间通讯,有 process 模块,还是内置模块

有个鬼(********633) 16:12:36

es6标准让js 强大很多

Mr.Gray<******@qq.com> 16:13:45

没人护驾吗?

无聊咔咔(********3145) 16:14:25

我来护驾,js我不会写,所以我选择swoole,算一票么

无聊咔咔(********3145) 16:14:28

双击查看原图

Dean(********9726) 16:14:49

php还是最屌的

有个鬼(********633) 16:14:52

放心吧

小马哥[̲̅V̲̅I̲̅P̲̅]<******@qq.com> 16:14:54

算,因为这个理由就是我说的理由双击查看原图

有个鬼(********633) 16:15:07

php还是最容易的

无聊咔咔(********3145) 16:15:14

小马哥调转枪头

小马哥[̲̅V̲̅I̲̅P̲̅]<******@qq.com> 16:15:36

我前面说了,swoole的优势就是:swoole就是给不会nodejs的php开发人员准备的

Dean(********9726) 16:15:47

php也会有async的

小马哥[̲̅V̲̅I̲̅P̲̅]<******@qq.com> 16:16:36

不用跟 nodejs 比,会用 nodejs,爱用 nodejs 的人尽管取用 nodejs。不会 nodejs 只会 php 的,用 swoole 就是首选。

Dean(********9726) 16:19:30

所以swoole是牛逼的

Laruence(********15) 16:19:37

必须的!

回忆未来-向东-Jàck(********7693)  17:23:38

直接在部署的时候直接把多核多CPU利用起来,请看清楚,是直接,直接。

这是武功的最高境界,比如:那个《功夫》里面小弟遇到事情了,

他是这样处理的,一支穿云箭千军万马来相见,这说明他不直接:

这是一个哲学问题,也就是说在核心的地方必须高度耦合,

正所谓:高耦合,低内聚,这种思想是我一个物理都晓得。

最后,如果发现swoole出现bug啥的,产生了coredump或打开coredump获取到coredump怎么办?

打开coredump的办法:http://justwinit.cn/post/7627/

假如出现问题怎么办?当然是立马解决了,办法如下:

蓝天<******@qq.com>  17:34:02

就是产生core dump的时候你打开系统内核开关,会生成一个文件

http://wiki.swoole.com/wiki/page/10.html

:)看这个

然后把结果给天峰即可

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章