You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

双服务器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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 22:25:04