node.js如何充分利用多核cpu
概述
nodejs是基于chrome浏览器的v8引擎构建的,也就说明它的模型与浏览器是类似的。我们的javascript会运行在单个进程的单个线程上。
但是v8引擎的单进程单线程并不是完美的结构,现如今cpu基本上都是多核的。真正的服务器往往有好几个cpu(像我们的线上物理机有12个核),所以,这就将抛出nodejs实际应用中的一个问题:“如何充分利用多核cpu服务器?”
从严格意义上来讲,node其实并不是真正的单线程架构,因为node自身还有i/o线程存在(网络i/o、磁盘i/o),这些i/o线程是由更底层的libuv处理,这部分线程对于javascript开发者来说是透明的。javascript代码永远运行在v8上,是单线程的。所以表面上来看nodejs是单线程的。
node.js充分利用多核cpu的方法
面对单进程单线程对多核使用率不高的问题,按照之前的经验,每个进程各使用一个cpu即可,以此实现多核cpu的利用。node提供了child_process模块,并且也提供了fork()方法来实现进程的复制(只要是进程复制,都需要一定的资源和时间。node复制进程需要不小于10m的内存和不小于30ms的时间)。
这样的解决方案就是*nix系统上最经典的master-worker模式,又称为主从模式。
这种典型并行处理业务模式的分布式架构具备较好的可伸缩性(可伸缩性实际上是和并行算法以及并行计算机体系结构放在一起讨论的。某个算法在某个机器上的可扩放性反映该算法是否能有效利用不断增加的cpu。)和稳定性。
主进程不负责具体的业务处理,而是负责调度和管理工作进程,工作进程负责具体的业务处理,所以,工作进程的稳定性是开发人员需要关注的。
通过fork()复制的进程都是一个独立的进程,这个进程中有着独立而全新的v8实例。虽然node提供了fork()用来复制进程使每个cpu内核都使用上,但是依然要记住fork()进程代价是很大的。好在node通过事件驱动在单个线程上可以处理大并发的请求。
注意:这里启动多个进程只是为了充分将cpu资源利用起来,而不是为了解决并发问题。
node创建子进程的4种方式
1、spawn()
创建一个子进程来执行命令
2、exec()
创建一个子进程来执行命令,和spawn()不同的是方法参数不同,它可以传入回调函数来获取子进程的状态
3、execfile()
启动一个子进程来执行指定文件。注意,该文件的顶部必须声明shebang符号(#!)用来指定进程类型。
4、fork()
和spawn()类似,不同点在于它创建node的子进程只需要执定要执行的javascript文件模块即可。
注意:后面的3种方法都是spawn()的延伸应用。
以上就是node.js如何充分利用多核cpu的详细内容,更多关于node.js充分利用多核cpu的资料请关注其它相关文章!