当前位置: 首页 > 后端技术 > PHP

Swoole服务端程序如何实现压力反馈

时间:2023-03-29 16:17:36 PHP

为什么要反馈压力服务端程序在遇到高并发请求时,一旦超过程序所能处理的极限,就可能导致崩溃,引发大规模的雪崩在线服务。BackPressure是服务端主动通知客户端自身资源不足,无法提供服务的一种手段。在web服务中,可以通过返回HTTP503(ServiceUnavailable)来告知客户端当前服务器处于较高负载状态。此时,客户端可以选择:等待一定时间,重试,切换到其他负载较低的节点或暂时停止在服务端使用该服务,并降级相关业务传统PHP-FPM如何反馈压力Nginx+PHP-FPM在server程序中,最下面有3个关键配置影响压力反馈:php-fpm.conf中pm.max_chindren配置的最大进程数,如果配置为200,则表示一个最多将启动200个进程。一旦超过最大进程数,新的请求将不会被接受,而是进入ListenBacklog队列进行排队。一个新的请求会从队列中弹出来处理,直到有一个空闲进程。php-fpm.conf中的listen.backlog配置ListenBacklog队列的长度,比如配置为512,表示如果没有空闲进程,最多允许512个请求排队,实际队列长度为min(listen.backlog,net.core.somaxconn),例如net.core.somaxconn=128,listen.backlog=512,实际队列长度为128而不是512,所以在Nginx+PHP-FPM程序其中,最大并发为pm.max_chindren+min(listen.backlog,net.core.somaxconn),一旦超过,将拒绝新的请求,返回502错误,压力会增加反馈给客户。在实际项目中,应该设置一个合适的值,不能太大也不能太小。否则会出现两个问题:客户端等待时间过长,请求在低负载下被拒绝。Nginx无法区分502和503错误。这是缺点。Swoole程序如何反馈压力?由于Swoole是完全异步的架构,并发能力更强,可以在机器资源不耗尽的前提下无限接受和处理请求。与Nginx+PHP-FPM相比,实现压力反馈并不容易。一般需要在框架层或者应用层代码抛出503错误。Swoole底层提供了多种配置来解决一些问题。max_connection限制最大连接数。超过最大连接数后,新的连接将被拒绝。向Gatewaymax_coroutine返回502错误以限制最大进程数。Swoole在收到客户端请求时,会新建一个协程进行处理。超过最大协程数后,会向客户端发送HTTP503错误。max_concurrency限制HTTP请求的最大并发数,当当前正在处理的请求数超过max_concurrency时,底层会立即向客户端发送HTTP503错误并关闭连接。使用Swoole\Http\Server;$http=newServer('127.0.0.1',9501);$http->set(['max_connection'=>10000,'max_coroutine'=>50000,'max_concurrency'=>500,]);$http->on('start',function($server){echo"Swoolehttp服务器启动于http://127.0.0.1:9501\n";});$http->on('request',function($request,$response){Co::sleep(0.1);//sleep100ms模拟请求处理的过程$response->header('Content-Type','text/plain');$response->end('HelloWorld');});$http->start();启动服务器后使用ab或wrk压测。wrk-c1000-d5shttp://127.0.0.1:9501/Running5stest@http://127.0.0.1:9501/2个线程和1000个连接线程统计AvgStdevMax+/-StdevLatency70.89ms132.48ms1.10s95.39%Req/Sec7.99k3.68k13.03k66.32%5.09s中有77521个请求,5.41MB读取套接字错误:连接0,读取55182,写入0,超时0非2xx或3xx.4que响应:545182响应:545182Transfer/sec:1.06MB可以看到5秒内一共发送了77521个请求,但是有55182个请求返回了503,这部分请求是超负荷后压力反馈的结果。