TrO*_*nNe 10 php nginx laravel google-compute-engine
我正在使用Laravel(中等静态网络)在nginx中运行服务器,并且我正在做例如在1分钟内500个恒定负载的同时用户(在那一分钟内不是分布式用户).
并收到此错误:
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;
Run Code Online (Sandbox Code Playgroud)
www.conf
pm.max_children = 500
pm.start_servers = 20
pm.min_spare_servers = 20
pm.max_spare_servers = 64
Run Code Online (Sandbox Code Playgroud)
使用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
Run Code Online (Sandbox Code Playgroud)
最后一个是第一个通过测试,其余的是将Bad Gateways错误从200个用户丢失到400个
例如,如果我测试的是没有使用微实例在30秒内分发的2.000个用户那么很好,但不能同时发送请求.
从2个核心开始,CPU级别显示完全正常,与磁盘操作等相同.
所以经过一系列的测试我有一些问题:
1)这是正常的吗?不适合我,需要16个内核来运行一个简单的网络是不正常的..或者压力测试太重而且这是正常的?
2)然后,我错过了什么?Google会以某种方式每秒限制请求吗?
3)给定配置文件的正常参数是什么?
任何其他帮助都非常受欢迎
TBH,目前还不完全清楚你试图通过这个测试实现什么,尤其是将GCE纳入等式.
如果您的"中等静态网站"网站正在为每个页面执行十几个SQL查询(可能每个页面都有几个JOIN,以及各种其他资源密集型操作),那么您远离实现C10K就不足为奇了.
您在各种GCE实例中的测试结果看起来相当一致,证明您的代码是值得责备的.如果您想排除GCE是导致性能问题的原因,那么下一个合乎逻辑的步骤似乎是测试其外部的性能.
看起来你最关心的Bad Gateway是在更便宜的实例上接收错误,所以,让我们弄清楚为什么会发生这种情况.
您的后端只能在给定的时间内处理一定数量的请求,在最便宜的计划上每秒几十个数量级.
它的配置没有明确规定资源耗尽后应该发生什么.使用手头的配置,您只能在最便宜的实例上每秒推送40个请求,但是,配置设置为同时具有Laravel进程500请求,在1个vCPU w/0.6GB总RAM上,每个请求大约1MB RAM,在动态框架驱动的"中等静态网"的较低规模上,导致阻抗不匹配.
然而,当你得到错误时,这并不奇怪,这显然是由于背压建立时阻抗不匹配,后端可能耗尽RAM试图处理永无止境的请求.
那么,解决方案是什么?
解决方案是清楚地了解在后端生成每个页面需要多少资源,然后限制从反向代理到后端的同时连接数,从不超过这样一定数量的连接,http: //nginx.org/r/limit_req和/或http://nginx.org/r/limit_conn,视情况而定.这样,您可以捕获并监视过载情况,并向用户提供相应的错误消息,和/或脚本自动动态调整基础结构的大小.
除了上述内容之外,另一个好主意是缓存后端的结果,前提是它实际上是生成的"静态"内容,没有按用户自定义,这可以让您考虑到链接到您的链接时的实际情况网站发布在Slashdot/Reddit/Twitter上,导致单个"静态"页面的流量大幅增加,然后可以在整个事件期间缓存.否则,如果内容实际上不是"静态的",那么由您来决定采用哪种方式以及采取哪种妥协方式 - 我建议查看每个请求的自定义是否真的有必要,以及是否有未定制的版本可能适当,特别是对于像Slashdot一样的场景.