(1)服务器模型
如何利用多核cpu服务器?
多线程:线程相对进程开销小,并且线程之间可以共享数据,且利用线程池可以减少创建和销毁线程的开销,时间片可以让线程较为均匀的使用cpu资源,线程数量过多时,事件会被浪费在上下文切换中。
事件驱动:node和nginx都是事件驱动的
事件驱动服务器的问题: cpu的利用率和进程的健壮性
(2)多进程架构
单进程 单线程 对多核使用不足的问题,创建进程,每个进程必须占用独立的cpu,以解决cpu占用不足的问题。
Master-Worker模式(主从模式):分布式架构用于并行处理业务的模式,具备较好的可伸缩性和稳定性,主进程不负责具体的业务处理,而是负责调度和管理工作进程。
const child_process = require('child_process');
const cpus = require('os').cpus();
const fork = child_process.fork;
console.log(cpus.length); // 4个cpu 开启4个工作
for(var i=0; i<cpus.length; i++) {
fork('./process_child');
}
通过fork复制的进程都是一个独立的进程,这个进程中有着独立而全新的v8实例,需要30ms的启动时间和10M的内存,所以fork是昂贵的。
尽量用事件驱动方式在单线程上解决高并发。
1)创建子进程
类型 回调/异常(获知子进程的状态) 进程类型 执行类型 可设置超时
spawn N 任意 命令 N
exec Y 任意 命令 Y
execFile Y 任意 可执行文件 Y
fork N Node js文件 N
linux中如果用execFile执行js文件,必须在shell文件 添加如下代码:
#!/usr/bin/env node
2)进程间通信
前端浏览器中,js主线程与UI共用一个线程,WebWorker允许创建工作线程在后台运行,使得阻塞严重的计算不影响UI渲染。