# 多进程

多进程是除了 守护进程 外,pm2 的另一个核心价值。

# 为什么要用多进程

  • 内存来说:由于操作系统中同时会有多个进程的存在,而操作系统分配给每个进程的内存是有一定限制的。比如,nodeJS 的进程在 32 位的操作系统中内存只分配了 1.6G。但是如果此时机器的内存特别大,只能占用 1.6G就是一种赤裸裸的浪费。所以多进程可以实现内存的最大化使用。

  • CPU来说:4 核 CPU 就是可以同时处理 4 个进程的工作。于是乎,CPU 核数越多,处理事物的速度也就越快。使用多进程就可以最大化使用 CPU 资源

# 有哪些问题

多进程之间的内存是不共享的,比如你存在当前进程中的 session 数据 就是互相之间不同的。于是有了 redis 服务来解决多进程的存储问题。

# 配置文件添加多进程





 








{
  "apps": {
    "names": "pm2-test-server",
    "script": "app.js",
    "instances": 4, // 设置服务进程数
    "watch": true,
    "ignore_watch": ["node_modules", "logs"],
    "error_file": "logs/err.log",
    "out_file": "logs/out.log",
    "log_date_format": "YYYY-MM-DD HH:mm:ss"
  }
}

启动服务后,可以看到进程数列表如下,有四个进程:

┌─────┬────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id  │ name   │ namespace   │ version │ mode    │ pid      │ uptime │ ↺    │ status    │ cpu      │ mem      │ user     │ watching │
├─────┼────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0   │ app    │ default     │ 1.0.0   │ cluster │ 31134    │ 0s     │ 0    │ online    │ 0%       │ 31.1mb   │ han… │ enabled  │
│ 1   │ app    │ default     │ 1.0.0   │ cluster │ 31135    │ 0s     │ 0    │ online    │ 0%       │ 29.7mb   │ han… │ enabled  │
│ 2   │ app    │ default     │ 1.0.0   │ cluster │ 31136    │ 0s     │ 0    │ online    │ 0%       │ 29.7mb   │ han… │ enabled  │
│ 3   │ app    │ default     │ 1.0.0   │ cluster │ 31137    │ 0s     │ 0    │ online    │ 0%       │ 20.2mb   │ han… │ enabled  │
└─────┴────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘

开启四个进程,产生的日志目录也会变成多个,多次访问后会发现,每个日志的记录数据可能是不同的。这是因为开启多进程后,pm2 也开启了负载均衡

# 当前目录

  .
  ├── app.js
  ├── logs
  │   ├── err-0.log
  │   ├── err-1.log
  │   ├── err-2.log
  │   ├── err-3.log
  │   ├── err.log
  │   ├── out-0.log
  │   ├── out-1.log
  │   ├── out-2.log
  │   ├── out-3.log
  │   └── out.log
  ├── package.json
  └── pm2.conf.json