## Using node with fork(2)
> Node.js And ShadowNode
### Why we want them
1. Runtime 冷启动通常需要约 50~100ms
1. 嵌入式设备性能相当紧凑
1. 函数运行时请求响应时间敏感
## 嵌入式环境
1. 多进程适应多使用场景切换
1. 紧凑的设备性能、能耗限制
## 函数运行时
1. 需要良好的运行环境隔离
1. 需要控制每次执行资源使用
## 函数运行时
1. 单进程服务无法隔离运行环境
1. VM Contexts 无法隔离运行时操作
1. WorkerThreads 无法细分单次资源使用
### What we want
1. 更低的 CPU 时间使用
1. 更快到达进程可使用状态
1. 能够良好地隔离运行环境
1. 能够良好地控制运行资源
### What happens on launch
1. 初始化 uv/vm/platform
1. (code-cache/snapshot)
1. bootstrap loader/node/env
1. main/pre_execution
1. user scripts
1. libraries
### 启动时间都消耗在哪儿了
1. Parsing/Compiling
1. Interpreting
1. Repeat
### Alternatives
1. code cache
1. snapshot
1. fork(2)
Preloaded Modules List
- 嵌入式系统库
- 函数运行时库
### Recovering from fork(2)
1. 需要重新创建工作线程
1. 需要保护同步原语不被污染
1. 重新初始化 IPC 句柄
### fork(2) with node.js
1. 事件驱动范式
1. 单线程模型不代表单线程实现
1. Native Addon 访问系统 API
### Recover: uv_loop_fork
1. epoll backend fd
2. async backend fd
3. signals
### Recover: node platform
1. Threaded tasks from VM
1. Threaded tasks from JS land
1. Threaded tracing
1. 暂不支持 worker_threads
### Recover: node addons
1. 没有成标准 API 提供 addon 恢复线程工作
1. 同样 builtin 模块线程工作也无法恢复
### Limitations
1. 需要持续运行 seed 进程
1. seed 进程特性使用有较大限制
1. 需要有对系统的权限控制权限
using 'node' as runtime... (node v12.8.1)
fork/hive-fork-child-process.js n=100: 5.954ms
fork/node-fork-child-process.js n=100: 27.218ms
fork/node-spawn-child-process.js n=100: 24.239ms
using 'node' as runtime... (node v12.8.1)
require-lodash/hive-fork-child-process.js n=100: 5.872ms
require-lodash/node-fork-child-process.js n=100: 37.843ms
require-lodash/node-spawn-child-process.js n=100: 34.628ms
using 'iotjs' as runtime... (iotjs v0.11.7)
fork-child-process.js n=100: 2.863ms
node-fork-child-process.js n=100: 36.566ms
node-spawn-child-process.js n=100: 25.797ms
### What's next
1. Collect Usage Case
1. Standardize Fork API