我使用Laravel(中等静态网络)在nginx中运行服务器,并且我在1分钟内同时做500 constant load个用户(在那一分钟内不是分布式用户)。
收到此错误:
unix:/var/run/php/php7.1-fpm.sock失败 - 资源暂时 不可用
cginx.conf
worker_processes auto;
events {
use epoll;
worker_connections 1524; #in my case it should be 1024, but well..
multi_accept on;
}
http {
#with this I reduce disk usage a lot
client_body_buffer_size 10K;
client_header_buffer_size 1k;
large_client_header_buffers 2 1k;
reset_timedout_connection on;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
www.conf
pm.max_children = 500
pm.start_servers = 20
pm.min_spare_servers = 20
pm.max_spare_servers = 64
Google计算引擎的结果:
f1-micro (1 vCPU, 0,6 GB) - Is supporting 40 - 60 requests per second
g1-small (1 vCPU, 1,7 GB) - Is maintaining 80 request per second
n1-standard (1vCPU, 3,75 GB) - - Is maintaining 130 request per second
n1-standard-2 (2vCPU, 7,5 GB) - Is maintaining 250 request per second
.
.
n1-standard-16 (16 vCPU, 60 GB) - Is maintaining 840 request per second
最后一个是第一个通过测试,其余的是将Bad Gateways错误从200个用户丢失到400个
例如,如果我测试的是没有使用微实例在30秒内分发的2.000个用户那么可以,但不能同时发送请求。
从2个核心开始,CPU级别显示完全正常,与磁盘操作等相同。
因此,经过一系列测试后,我有一些问题:
1)这是正常的吗?对我来说,运行一个简单的网络需要16个核心是不正常的..或者压力测试太重而且它是正常的?
2)然后,我错过了什么? Google会以某种方式每秒限制请求吗?
3)给定配置文件的正常参数是什么?
欢迎任何其他帮助
答案 0 :(得分:5)
如果你的中等静态网络"网站正在为每个页面执行十几个SQL查询,每个页面可能只有几个JOIN
,以及各种其他资源密集型操作,那么您远离实现{很远就不足为奇了{3}}
您在各种GCE实例中的测试结果看起来相当一致,证明您的代码应该归咎于您。如果你想排除GCE是导致性能问题的原因,那么下一个合乎逻辑的步骤就是测试它之外的性能。
您似乎最关心的是在较便宜的实例上收到Bad Gateway
错误,所以,让我们弄清楚为什么会这样。
您的后端只能在给定的时间内处理一定数量的请求,在最便宜的计划上每秒几十次。
配置时没有明确规定资源耗尽后应该发生什么。使用手头的配置,你只能在最便宜的实例上每秒推送40个请求,但是,配置设置为同时具有Laravel进程500请求,在1个vCPU w / 0.6GB总RAM上,每个请求大约1MB RAM,这是一种较低规模的中等静态网络"由动态框架驱动,导致阻抗不匹配。
因此,您会收到错误,这显然是由于 背压 累积时阻抗不匹配所致,并且后端可能会耗尽RAM,试图处理永无止境的请求。
那么,解决方案是什么?
解决方案是清楚地了解在后端生成每个页面需要多少资源,然后限制从反向代理到后端的同时连接数量,从不超过这样一定数量的连接,适当时使用C10K和/或http://nginx.org/r/limit_req。这样,您就可以捕获并监控过载情况,并向用户提供相应的错误消息,和/或脚本自动动态调整基础架构的大小。
除了上述内容之外,另一个好主意是缓存后端的结果,只要它实际上是静态的"生成的内容,没有每个用户的自定义,这可以让您考虑在Slashdot / Reddit / Twitter上发布到您的网站的链接的实际情况,导致单个流量的大量流量#34;静态"页面,然后可以在整个事件的持续时间内缓存。否则,如果内容实际上不是静态的,那么由您来决定走哪条路以及采取哪种妥协方式 - 我建议您查看是否按请求实际上有必要进行自定义,以及非自定义版本是否合适,尤其是对于类似Slashdot的场景。
答案 1 :(得分:1)
在具有2vcpu和7gb RAM的机器上,我可以处理更多1000个请求/秒 你没有提到你需要的ram每个请求,我建议将php socket更改为tcp连接,它允许我处理10x请求