1
julyclyde 2017-10-09 16:43:33 +08:00
给 nginx 设置超时时间和尝试下一个 upstream 的策略
|
2
tonghuashuai 2017-10-09 17:31:33 +08:00
这就是异步请求的应用场景了。
在请求中只负责分配任务,将耗时任务交给异步 worker 去执行,可以用 celery、gearman 或者自己写一个 |
3
wcsjtu 2017-10-09 17:32:00 +08:00
看起来不像是长请求导致的。
看看 nginx 的 uwsgi_read_timeout 配置项,还有 nginx 的 error log |
4
doubleflower 2017-10-09 17:34:40 +08:00 via Android
正在工作的话应该是不会分配到的。加到十个 worker 试试还有没有这个现象
|
5
timchou OP @julyclyde hi,想请问下「尝试下一个 upstream 的策略」是哪个参数控制呢?
@tonghuashuai 恩,明白,不过历史原因,没法立马解决。。 @wcsjtu 只有个别路径配置了 uwsgi_read_timeout=300,其他的都是默认。 |
6
troycheng 2017-10-09 20:26:01 +08:00 2
你 trace 后才发现还有两个 backend 可用,可是 nginx 怎么知道呢……默认的策略就是轮询呀
1. 你需要先解决那个长耗时请求的问题(合理设置超时,或者解决慢查询的问题),一共就 4 个 worker,hang 住了 2 个,50%的处理能力就没有了,这种严重影响吞吐的问题是根本问题 2. 如果认为这样的情况是符合你的预期的,那么处理一下 nginx 的超时,因为上一个从 nginx 来的请求可能已经因为超时断开了,nginx 认为后端已经是 idle 的状态,于是又把请求发给了这个 backend,调整一下超时,让 nginx 的超时大于你这个场景的处理时间 3. 如果还认为这种情况是符合你的预期的…… proxy 还有配置重试的指令,但不解决上面长耗时的问题,大概率的可能是把 4 个 worker 都变成 hang 住的状态,这个时候重启服务解决一切问题……最终还是要回到 1 简单看一下雪崩和吞吐量相关的介绍就大致明白这个模型了 |