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

jackxiang 2016-2-18 17:49 | |
背景:今天在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://jackxiang.com/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://jackxiang.com/post/7627/
假如出现问题怎么办?当然是立马解决了,办法如下:
蓝天<******@qq.com>  17:34:02
就是产生core dump的时候你打开系统内核开关,会生成一个文件
http://wiki.swoole.com/wiki/page/10.html
:)看这个
然后把结果给天峰即可

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/8514/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2016-2-18 17:58
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]