"重"同时用户Nginx - Laravel - Google计算引擎

时间:2018-01-11 00:50:29

标签: php laravel nginx google-compute-engine

我使用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)给定配置文件的正常参数是什么?

欢迎任何其他帮助

2 个答案:

答案 0 :(得分:5)

TBH,你用这个测试试图达到的目标并不完全清楚,特别是将GCE纳入等式。

如果你的中等静态网络"网站正在为每个页面执行十几个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请求