双服务器PHP 8 WebSocket性能差异排查请求(CPU差异)
问题诊断与解决方案
核心问题分析
你的WebSocket服务采用单进程阻塞模型,结合Intel双路Xeon的NUMA架构特性,加上代码中存在的socket标志位错误,导致低连接数下反而出现严重响应延迟——这类问题在单/少核心的AMD Epyc上影响被掩盖,但在多核心双路架构下会被放大。
1. 修复Socket服务器标志位错误
你在stream_socket_server中错误混用了客户端与服务器端标志位:STREAM_CLIENT_ASYNC_CONNECT和STREAM_CLIENT_PERSISTENT是客户端专用标志,服务器端仅需绑定与监听标志。
错误代码:
$socket = stream_socket_server("ssl://".$addrSocket.":".$port."", $errno, $errstr, STREAM_CLIENT_ASYNC_CONNECT| STREAM_SERVER_BIND | STREAM_CLIENT_PERSISTENT| STREAM_SERVER_LISTEN, $context);
修正后代码:
$socket = stream_socket_server("ssl://".$addrSocket.":".$port."", $errno, $errstr, STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, $context);
该错误会导致多核心架构下的socket调度异常,直接增加连接与响应延迟。
2. 解决NUMA架构的进程亲和性问题
双路Xeon属于NUMA架构,单进程可能被调度到远离网卡的NUMA节点,引发IO延迟飙升。需手动绑定进程到网卡所在的NUMA节点:
- 查看NUMA节点与网卡绑定关系:
numactl --hardware - 绑定进程到指定节点(示例绑定到节点0):
numactl --cpunodebind=0 --membind=0 php your-websocket-script.php
3. 优化SSL硬件加速与握手流程
Intel Xeon支持AES-NI硬件加速,需确保PHP的OpenSSL扩展启用该特性,并优化SSL套件配置:
- 检查AES-NI是否启用:
openssl engine -t,确认aesni引擎显示为available - 修改SSL上下文配置,启用高效加密套件与TLS版本:
'ssl' => [ 'local_cert' => "./certificate/a2699ad7df6c0f70bde860be9b807edd.crt", 'local_pk' => "./certificate/a2699ad7df6c0f70bde860be9b807edd.key", 'allow_self_signed' => true, 'verify_peer' => false, 'verify_peer_name' => false, 'enable_sslv3' => false, 'ciphers' => 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384', 'ssl_method' => STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT | STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT, ]
同时检查handshake函数是否存在同步阻塞的冗余操作,避免握手阶段放大延迟。
4. 替换单进程模型为多进程/异步模型
单进程stream_select模型无法利用双路Xeon的多核心优势,建议:
- 采用Swoole/Workerman等成熟异步WebSocket框架,原生支持协程/多进程,充分利用硬件资源
- 手动实现多进程模型(简化示例):
$workerNum = 8; // 根据CPU核心数设置 for ($i = 0; $i < $workerNum; $i++) { $pid = pcntl_fork(); if ($pid == -1) { die("进程创建失败"); } elseif ($pid == 0) { // 子进程处理连接逻辑(原accept+stream_select代码) while (1) { if (($c = stream_socket_accept($socket, empty($connections) ? -1 : 0, $peer)) && $info = handshake($c)) { $connections[$peer] = $c; // ... 其余原有逻辑 } } exit(); } } // 父进程等待子进程 while (pcntl_wait($status) != -1);
5. 调整系统TCP参数优化低延迟
针对双路服务器的低连接数低延迟场景,修改TCP内核参数:
# 优化TCP握手与关闭延迟 echo 1 > /proc/sys/net/ipv4/tcp_syncookies echo 5 > /proc/sys/net/ipv4/tcp_fin_timeout # 调整套接字缓冲区大小 echo 4096 > /proc/sys/net/core/rmem_default echo 8192 > /proc/sys/net/core/wmem_default
内容的提问来源于stack exchange,提问作者Antonio Sordellini
相关产品推荐
相关产品推荐

