为什么要反馈压力服务端程序在遇到高并发请求时,一旦超过程序所能处理的极限,可能会导致崩溃,引发线上服务的大规模雪崩。压力反馈(Back Pressure)是一种由服务端主动告知客户端自身资源不足,无法
顺晟科技
2023-02-26 09:25:14
127
服务器端程序在发出高并发请求时,如果超出程序可以处理的限制,就会发生冲突,造成在线服务的大规模雪崩。压力反馈(Back Pressure)是服务端主动告知客户端自身资源不足,无法提供服务的手段。web服务返回HTTP 503 (Service Unavailable),使客户端知道服务器当前处于相对较高的加载状态。此时,客户端可以选择:
请等一段时间后再试一次。在负载较低的其他节点或服务器上暂时停止使用此服务,并降级相关业务。在
传统Nginx PHP-FPM服务器程序中,基本三大配置会影响压力反馈。
Php-fpm.conf中pm.max_chindren配置的最大进程数(例如,配置为200,表示最大开始200个进程)超过最大进程数时,新请求将不会被接受,而会进入Listen Backlog队列等待,直到存在闲置进程也就是说,如果没有空闲进程,最多允许512个请求队列内核参数net.core。根据内核参数net.core.somaxconn的设置,listen.backlog设置中的数值不一定有效。实际队列长度为min (listen.backlog,net.core.somaxconn)。例如,net.core.somaxconn=128,listen.backlog=512表示实际队列长度为128,而不是512,因此Nginx否则,客户端生成等时间过长,负载低,会出现拒绝请求的两个问题。
Nginx的缺点是无法区分502和503错误。
由于Swoole完全是异步体系结构,并发性很好,在机器资源没有耗尽的情况下,可以无限制地接受和处理请求。与Nginx PHP-FPM相比,压力反馈不是很好,而是框架级别或应用层代码经常出现503错误。Swoole的基本配置提供了多种配置,可解决某些问题。
如果限制最大连接数超过最大连接数,则新连接将被拒绝。向网关返回502错误
最大进程数限制,Swoole在收到客户端请求时创建要处理的新会话,如果超过最大会话数,则向客户端发送HTTP 503错误
限制最大并发HTTP请求数。如果当前正在处理的请求数超过max_concurrency,则会立即向客户端发送默认的HTTP 503错误,并关闭连接。
Use Swoole \ Http \ Server
$ http=new server(& amp;# 039;127 . 0 . 0 . 1 & AMP;# 039;9501);
$http-set([
Max _ connection & amp# 039;=10000,
Max _ coroutine & amp# 039;=50000,
Max _ concurrency & amp# 039;=500,
]);
$ http-on(& amp;# 039;start & amp# 039;function ($ server) {
Echo & amp# 039;swo ole http server is started at http://127 . 0 . 0 . 1:9501 \ n & amp;# 039;
});
$ http-on(& amp;# 039;request & amp# 039;function ($ request,$ response) {
COTRIA ONIL:滑(0.1);//sleep 100ms模拟请求处理过程
$ response-header(& amp;# 039;内容类型& amp# 039;& amp# 039;文本/计划& amp# 039;);
$ response-end(& amp;# 039;Hello World & amp# 039;);
});
$ http-start();启动服务器后,使用ab或wrk测试。
wrk-c 1000-d 5s 3358127 . 0 . 0 . 1:9501/
运行5stest @ http://127.0.0.1: 9501/
2 threads and 1000 connections
Thread Stats Avg Stdev Max /- Stdev
latency 70.89 ms 132.48 ms 1.10s 95.39%
Req/Sec 7.99k 3.68k 13.03k 66.32%
77521 requests in 5.09s,5.41mb read
插槽错误:连接0、read 55182、write 0、timeout 0
非2xx或3xxresponses: 55182
Requests/sec: 15242.49
Transfer/sec: 1.06MB表示,5秒内共发送了77521个请求,但55182个请求返回了503。这部分请求是超过负荷后压力反馈的结果。