# PM2 启动集群

URL: https://caijiao.org/pm2/cluster-mode/starting-cluster
Source: docs/pm2/cluster-mode/starting-cluster.md
Description: 学习如何通过 PM2 启动集群模式，以充分利用服务器的多核 CPU 提升 Node.js 应用的性能。PM2 集群模式提供了负载均衡、高可用性和自动恢复的功能，确保应用的稳定性与高效性。

在生产环境中，充分利用服务器的多核 CPU 是提升应用性能的关键。PM2 的集群模式（Cluster Mode）允许你启动多个 Node.js 进程，并通过负载均衡实现高并发处理。集群模式不仅能提高应用的吞吐量，还能确保应用在高负载下保持稳定。

## 1. 什么是集群模式？

集群模式是 PM2 提供的一种进程管理方式，允许你启动多个进程并均匀地分配请求负载。它通过 Node.js 的 `cluster` 模块来实现多进程管理，并自动平衡各个进程的负载，从而提高应用的性能和可扩展性。

在集群模式下，每个进程都在独立的 Node.js 进程中运行，但它们共享同一个端口。PM2 会将客户端的请求平均分配给每个进程，确保每个进程的负载相对均衡。

## 2. 如何启动集群模式

要启用 PM2 的集群模式，你可以使用 `-i` 参数指定实例数量，或者使用 `max` 自动根据机器的 CPU 核数启动进程。

### 启动集群模式

* **指定实例数**：启动指定数量的应用实例，例如启动 4 个进程。

  ```bash
  pm2 start app.js -i 4
  ```

* **自动根据 CPU 核数启动**：使用 `max` 参数让 PM2 自动根据服务器的 CPU 核数来启动进程。

  ```bash
  pm2 start app.js -i max
  ```

  该命令会启动与 CPU 核数相同的进程数。比如，如果服务器有 8 个 CPU 核心，PM2 会启动 8 个应用实例。

### 示例输出

```txt
[PM2] Starting /path/to/app.js in cluster mode (4 instances)
```

在集群模式下，PM2 会自动为每个进程分配不同的端口并进行负载均衡。

## 3. 集群模式的工作原理

PM2 集群模式的工作原理基于 Node.js 的 `cluster` 模块，它允许你创建多个进程，每个进程都有独立的事件循环。PM2 会通过以下方式管理集群：

* **多进程分配**：PM2 启动多个进程，每个进程独立运行并监听相同的端口。
* **负载均衡**：当客户端请求到达时，PM2 会自动将请求分发到不同的进程，确保负载均匀分配。
* **进程重启**：如果某个进程崩溃，PM2 会自动重启该进程，确保服务持续可用。

### 集群模式下的负载均衡

每个进程都会处理一定比例的请求，PM2 使用内部的负载均衡机制自动将请求分配到各个进程。例如，如果你启动了 4 个进程，PM2 会尽量确保每个进程处理相同数量的请求，从而避免某个进程过载。

## 4. 集群模式的优势

* **提高吞吐量**：通过启动多个进程，集群模式能够增加应用的处理能力，提升吞吐量，适合高并发环境。
* **高可用性**：集群模式增强了应用的容错能力。如果某个进程崩溃，PM2 会自动重启它，而其他进程仍然能够正常工作，避免整个应用宕机。
* **充分利用多核 CPU**：集群模式允许应用充分利用多核 CPU，提升整体计算能力和性能。

## 5. 集群模式中的进程管理

PM2 会自动管理集群中的每个进程，确保它们的稳定运行。如果一个进程崩溃或被意外停止，PM2 会自动重启该进程。你可以通过以下命令查看集群中所有进程的状态：

```bash
pm2 status
```

### 示例输出

```txt
┌─────┬──────────────┬────────┬───┬──────┬────────┬───┬─────────────┬─────────────┐
│ id  │ name         │ mode   │ ↺ │ status│ cpu    │ memory │ uptime     │
├─────┼──────────────┼────────┼───┼──────┼────────┼───┼─────────────┼─────────────┤
│ 0   │ my-app       │ cluster│ 3 │ online│ 0.5%   │ 50MB  │ 1h          │
│ 1   │ my-app       │ cluster│ 3 │ online│ 0.4%   │ 50MB  │ 1h          │
│ 2   │ my-app       │ cluster│ 3 │ online│ 0.5%   │ 50MB  │ 1h          │
│ 3   │ my-app       │ cluster│ 3 │ online│ 0.5%   │ 50MB  │ 1h          │
└─────┴──────────────┴────────┴───┴──────┴────────┴───┴─────────────┴─────────────┘
```

在集群模式下，PM2 会列出每个进程的详细信息，包括 CPU 使用率、内存占用和重启次数。

## 6. 进程监控和日志

PM2 提供了实时监控集群进程的功能，通过 `pm2 monit` 可以查看每个进程的资源占用情况：

```bash
pm2 monit
```

此外，你还可以查看各个进程的日志，以便快速定位问题：

```bash
pm2 logs my-app
```

## 7. 结语

PM2 的集群模式为 Node.js 应用提供了强大的负载均衡和高可用性功能。通过集群模式，你可以轻松启动多个进程，充分利用多核 CPU，并实现应用的高并发处理。无论是提高吞吐量，还是增强应用的容错性，PM2 都提供了一个简便的解决方案来帮助你在生产环境中管理应用。

集群模式不仅能提升应用性能，还能保障应用在高负载情况下的稳定运行。
