生产环境是2台16核32G的配置,按照手册分布式部署,配置gateway进程16个,和worker进程数100个,
使用压力测试系统并发2000个链接,只链接,不发送业务处理。在压力测试下,gateway进程cpu个别跑满,其他的也大都在70%,压力测试关掉后很长一段时间,有一个gateway进程cpu始终100%,其他gateway进程cpu基本回落到0,该状态下,业务系统可以正常链接上gateway,但是发送数据无法被接收到。该状态一直持续很长时间。我们之所以做这个压力测试,是为了复现我们业务异常并发下,也同样导致了gateway的某个进程cpu跑满,而其他进程都很空闲,不知道是什么原因,而业务系统处于无法收发的状态下。gateway框架也没有任何异常报错,服务器整体cpu还低于20%。
Workerman version:3.4.7 PHP version:7.1.8-2+ubuntu16.04.1+deb.sury.org+4
start time:2024-02-29 16:14:16 run 0 days 1 hours
load average: 0.38, 0, 0 event-loop:\Workerman\Events\Event
cpu100%的时候执行 php start.php status 贴下
找到cpu100%的进程pid,利用命令
strace -ttp pid
看下进程在做什么,截图下麻烦大神再帮忙看一下,需要的截图已经回复
GatewayWorker系统内部有个缓冲区,如果businessWorker进程处理不过来客户端发来的请求,请求会放在缓冲区排队,压测过程中这个排队可能越来越多,即使停止压测后,缓冲区里的请求数据仍然存在,所以进程还在一直工作。
这个缓冲区可以设置大小,默认10M,start_gateway.php里设置
$gateway->sendToWorkerBufferSize = 10240; // 字节
这样超过缓冲区的数据会被丢弃,压测停止后缓冲区的请求由于数量变少会马上处理完,cpu就恢复了
谢谢