Swoole有两个关键缓冲区参数:socket_buffer_size控制每个TCP连接的底层收发缓存大小,影响内存占用与系统调用频率;buffer_output_size限制单次send/end/push的最大响应长度,防止单次发送塞爆内存。二者作用不同、不可混用,需按场景分别配置。

直接结论:Swoole 有两个关键缓冲区参数,socket_buffer_size 和 buffer_output_size,作用完全不同,混用会导致发送失败、响应截断或内存暴涨,必须分开配置。
socket_buffer_size 控制连接级收发缓存
它决定每个 TCP 连接的底层 socket 缓冲区大小(含读+写),影响系统调用频率和单连接内存占用。不是“越大越好”,尤其在高并发长连接场景下。
- 默认值通常是
65536(64KB)或131072(128KB),可用$server->setting['socket_buffer_size']查看 - 小包高频通信(如心跳、RPC):设为
8192~32768(8K~32K),减少内存浪费 - 大文件/流式传输:可设到
1048576(1MB),但需确认系统限制:net.core.rmem_max和net.core.wmem_max - 上万连接的网关/WS 服务:建议 ≤
65536,否则总内存 =max_connection × socket_buffer_size × 2(双向) - Client 端也要配,比如
$client->set(['socket_buffer_size' => 262144])
buffer_output_size 控制单次响应最大长度
这是 HTTP / WebSocket / TCP Server 发送数据时的“单次上限”,和 socket_buffer_size 没有换算关系,专用于防止单次 send() 或 end() 塞爆内存。
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
- 默认
2097152(2MB),对普通 JSON 接口够用;返回 10MB PDF 就得设成12582912 - 设太小会触发
ERR_EMPTY_RESPONSE或响应体被静默截断,且无明确报错 - 不能设为 0 或负数,否则启动直接报
Fatal error: invalid buffer_output_size - 该值是 per-request 的,不共享,但极端并发下仍要按
并发数 × 峰值响应体积预估内存 - 配合
$response->sendfile()时完全不生效——走内核零拷贝路径
常见错误现象与对应参数
遇到问题先看日志和现象,再锁定是哪个缓冲区惹的祸:
-
swFactoryProcess_finish:send failed,session#1 output buffer has been overflowed→socket_buffer_size不足,客户端接收慢导致服务端堆积 - HTTP 接口返回空白或只有一半 JSON →
buffer_output_size太小,响应被截断 - 响应明显延迟(比如 echo 后等 2 秒才收到)→ 不是缓冲区问题,是没调
$response->end(),或误用了 PHP 的ob_flush()/flush() - QPS 下降严重 + CPU 升高 → 可能
socket_buffer_size设得太小,引发高频系统调用 - 内存持续上涨、OOM → 检查是否
buffer_output_size被设到几十 MB 且并发高,或socket_buffer_size× 连接数远超物理内存
调优时容易忽略的点
真正上线前,这几个细节常被跳过,但一出问题就难定位:
-
socket_buffer_size必须 ≤ 系统net.core.rmem_max和net.core.wmem_max,否则 Swoole 会静默降级为系统默认值 - 调整后必须压测验证,尤其是连接数从几百涨到几千时,内存增长是否线性可控
- WebSocket 场景下,
socket_buffer_size影响onMessage接收大消息的能力,而buffer_output_size影响push()的单次上限 - Client 端如果用
swoole_http_client请求大响应,也要配buffer_output_size,否则$client->body可能为空

















