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 以上。
临时修改
ulimit -n 100000永久修改
编辑 /etc/security/limits.conf,加入:
* soft nofile 262140
* hard nofile 262140
root soft nofile 262140
root hard nofile 262140修改后需重新登录或重启系统生效。
进程守护方式决定了生效路径
Shell 中执行的 ulimit 不会影响由 systemd / Supervisor 启动的 Octane 进程,必须在守护配置中单独设置:
# systemd unit 文件(推荐)
[Service]
LimitNOFILE=262140; Supervisor 的 [program:octane] 段
minfds=2621402. 内核参数修改方式
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 接收时会在队列中等待,队列溢出会导致连接被拒绝或超时。
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,请求量大时建议调大:
net.unix.max_dgram_qlen = 100也可以增加 Worker / Task Worker 数量,分摊单个进程的请求量。
4. Socket 缓冲区
调大 Socket 缓冲区,提升大响应(如文件下载、AI 流式输出)场景下的吞吐:
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 = 167772165. TIME_WAIT 与端口回收
net.ipv4.tcp_tw_reuse
开启后允许快速复用处于 TIME_WAIT 状态的端口。对 Octane 有两个直接收益:
- 执行
php artisan octane:reload/ 重启服务时,监听端口能及时重新绑定,避免「Address already in use」 - Octane 作为客户端高频访问 MySQL / Redis / 外部 HTTP 服务时,缓解本地端口耗尽
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 = 200000net.ipv4.tcp_tw_recycle(不要开启)
Swoole 旧文档建议短连接服务开启此参数,但需注意:
- 该参数在 Linux 4.12 中已被移除,新内核上设置会直接报错
- 开启后会造成 NAT 后的用户连接不稳定
Octane 部署请保持关闭(0),用 tcp_tw_reuse 替代。
6. 其他推荐配置
# 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 = 3007. 消息队列(仅 Swoole IPC 场景)
仅当 Swoole 使用消息队列做进程间通信时才需要调整:
kernel.msgmnb = 4203520 # 单个消息队列的最大字节数
kernel.msgmni = 64 # 允许创建的消息队列数量
kernel.msgmax = 8192 # 单条消息的最大长度8. 开启 CoreDump
Swoole Worker 发生段错误等底层异常时,CoreDump 是定位问题的重要手段:
kernel.core_pattern = /data/core_files/core-%e-%p-%t通过 ulimit -c 查看 core 文件大小限制,若为 0,需在 /etc/security/limits.conf 中放开:
* soft core unlimited
* hard core unlimited注意提前创建 /data/core_files 目录并保证磁盘空间充足。
9. 完整示例
将以下内容保存为 /etc/sysctl.d/99-octane.conf,执行 sysctl --system 一次性加载:
# 连接队列
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 = 30010. 验证是否生效
# 单项检查
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:
php artisan octane:reload