---
url: https://www.aiforge.cn/other/octane-sysctl.md
---
# Octane 内核参数调整

Laravel Octane 通过 Swoole / RoadRunner 让应用常驻内存，以少量长生命周期的 Worker 进程承接大量并发连接。默认的 Linux 内核参数面向通用场景，在高并发下容易成为瓶颈：文件描述符耗尽、端口不能及时回收、连接队列溢出等。本文参考 [Swoole 官方维基的内核参数调整](https://wiki.swoole.com/zh-cn/#/other/sysctl)，结合 Octane 的运行特点给出适配建议。

::: tip 适用范围

* 标注「仅 Swoole」的参数只在 Octane 使用 Swoole 驱动时生效，RoadRunner / FrankenPHP 驱动可忽略。
* 内核参数与 Octane 自身的 `workers`、`max_requests` 等配置是两层优化，应用层配置请参考[部署方案](/operations/deployment)。
  :::

## 1. 文件描述符（ulimit）

Octane 的每个 Worker 会同时持有大量连接（客户端连接、MySQL、Redis、Reverb WebSocket 等），`ulimit -n` 建议调整为 `100000` 以上。

### 临时修改

```bash
ulimit -n 100000
```

### 永久修改

编辑 `/etc/security/limits.conf`，加入：

```ini
* soft nofile 262140
* hard nofile 262140
root soft nofile 262140
root hard nofile 262140
```

修改后需重新登录或重启系统生效。

::: warning 进程守护方式决定了生效路径
Shell 中执行的 `ulimit` **不会影响**由 systemd / Supervisor 启动的 Octane 进程，必须在守护配置中单独设置：

```ini
# systemd unit 文件（推荐）
[Service]
LimitNOFILE=262140
```

```ini
; Supervisor 的 [program:octane] 段
minfds=262140
```

:::

## 2. 内核参数修改方式

Linux 下修改内核参数有三种方式：

* 修改 `/etc/sysctl.conf`（或新增 `/etc/sysctl.d/99-octane.conf`），保存后执行 `sysctl -p`（或 `sysctl --system`）加载，**重启后自动生效，推荐**
* 使用 `sysctl` 命令临时修改：`sysctl -w net.core.somaxconn=65535`
* 直接写 `/proc/sys/` 目录：`echo 65535 > /proc/sys/net/core/somaxconn`

后两种方式重启后失效，仅适合临时验证。

## 3. 连接队列

### net.core.somaxconn

Socket 监听队列（backlog）的最大长度，系统默认通常只有 `128` ~ `4096`。高并发下新连接来不及被 Worker 接收时会在队列中等待，队列溢出会导致连接被拒绝或超时。

```ini
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 81920
```

同时需要保证上层配置不超过该值：

* Octane（Swoole 驱动）的 `swoole.options.backlog` 不要超过 `somaxconn`
* 前置 Nginx 的 `listen ... backlog=` 指令同理

### net.unix.max_dgram_qlen（仅 Swoole）

Swoole 使用 Unix Socket Dgram 做进程间通信（如 Task 进程投递），系统默认为 `10`，请求量大时建议调大：

```ini
net.unix.max_dgram_qlen = 100
```

也可以增加 Worker / Task Worker 数量，分摊单个进程的请求量。

## 4. Socket 缓冲区

调大 Socket 缓冲区，提升大响应（如文件下载、AI 流式输出）场景下的吞吐：

```ini
net.ipv4.tcp_mem  = 379008  505344  758016
net.ipv4.tcp_wmem = 4096    16384   4194304
net.ipv4.tcp_rmem = 4096    87380   4194304
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.wmem_max = 16777216
net.core.rmem_max = 16777216
```

## 5. TIME_WAIT 与端口回收

### net.ipv4.tcp_tw_reuse

开启后允许快速复用处于 TIME_WAIT 状态的端口。对 Octane 有两个直接收益：

* 执行 `php artisan octane:reload` / 重启服务时，监听端口能及时重新绑定，避免「Address already in use」
* Octane 作为客户端高频访问 MySQL / Redis / 外部 HTTP 服务时，缓解本地端口耗尽

```ini
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.ip_local_port_range = 20000 65000
net.ipv4.tcp_max_tw_buckets = 200000
```

### net.ipv4.tcp_tw_recycle（不要开启）

Swoole 旧文档建议短连接服务开启此参数，但需注意：

* 该参数在 **Linux 4.12 中已被移除**，新内核上设置会直接报错
* 开启后会造成 NAT 后的用户连接不稳定

**Octane 部署请保持关闭（0），用 `tcp_tw_reuse` 替代。**

## 6. 其他推荐配置

```ini
# SYN 洪水防护
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_synack_retries = 3
net.ipv4.tcp_syn_retries = 3

# TCP 保活（配合 Reverb 等长连接场景）
net.ipv4.tcp_keepalive_time = 300
```

## 7. 消息队列（仅 Swoole IPC 场景）

仅当 Swoole 使用消息队列做进程间通信时才需要调整：

```ini
kernel.msgmnb = 4203520   # 单个消息队列的最大字节数
kernel.msgmni = 64        # 允许创建的消息队列数量
kernel.msgmax = 8192      # 单条消息的最大长度
```

## 8. 开启 CoreDump

Swoole Worker 发生段错误等底层异常时，CoreDump 是定位问题的重要手段：

```ini
kernel.core_pattern = /data/core_files/core-%e-%p-%t
```

通过 `ulimit -c` 查看 core 文件大小限制，若为 `0`，需在 `/etc/security/limits.conf` 中放开：

```ini
* soft core unlimited
* hard core unlimited
```

注意提前创建 `/data/core_files` 目录并保证磁盘空间充足。

## 9. 完整示例

将以下内容保存为 `/etc/sysctl.d/99-octane.conf`，执行 `sysctl --system` 一次性加载：

```ini
# 连接队列
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 81920
net.unix.max_dgram_qlen = 100

# Socket 缓冲区
net.ipv4.tcp_mem  = 379008  505344  758016
net.ipv4.tcp_wmem = 4096    16384   4194304
net.ipv4.tcp_rmem = 4096    87380   4194304
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.wmem_max = 16777216
net.core.rmem_max = 16777216

# TIME_WAIT 与端口回收
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.ip_local_port_range = 20000 65000
net.ipv4.tcp_max_tw_buckets = 200000

# 其他
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_synack_retries = 3
net.ipv4.tcp_syn_retries = 3
net.ipv4.tcp_keepalive_time = 300
```

## 10. 验证是否生效

```bash
# 单项检查
cat /proc/sys/net/core/somaxconn
cat /proc/sys/net/unix/max_dgram_qlen

# 或
sysctl net.core.somaxconn

# 查看当前进程的 nofile 限制（PID 为 Octane Master 进程）
cat /proc/<PID>/limits | grep 'open files'
```

修改生效后重启 Octane：

```bash
php artisan octane:reload
```
