Skip to content

Octane 内核参数调整 ​

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

适用范围

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

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

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

进程守护方式决定了生效路径

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