“重”同时用户Nginx - Laravel - 谷歌计算引擎

问题描述 投票:10回答:2

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

任何其他帮助都非常受欢迎

php laravel nginx google-compute-engine
2个回答
5
投票

TBH,目前还不完全清楚你试图通过这个测试实现什么,特别是将GCE纳入等式。

如果您的“中等静态网站”网站正在为每个页面执行十几个SQL查询,可能每个页面都有几个JOINs,以及各种其他资源密集型操作,那么您距离实现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一样的场景。


1
投票

在一台2vcpu和7gb ram的机器上我可以处理更多的1000请求/秒您没有提到每个请求你需要的ram,我也建议将php socket更改为tcp连接,它允许我处理10x请求

© www.soinside.com 2019 - 2024. All rights reserved.