请教用 uwsgi listen queue 满了就无响应的问题

2019-03-31 18:41:49 +08:00
 xing393939
api 接口项目使用 uwsgi,开始队列设为 1024,运行几个小时后服务就挂了。

用 uwsgitop 查看,lq=1025,uwsgi 日志也在报 listen queue of socket (fd 3) full (1025/1024)

网上查了资料,说是 uwsgi 有过载保护,listen queue 超过阈值就罢工(实在不能理解),于是修改 listen queue 为 9999,运行几个小时依旧会挂。

用 uwsgitop 查看,lq=8000 多,而且不断变大,预计又是要到了 10000 再罢工。

我就疑惑了,为什么 listen queue 没有达到阈值就开始罢工了,难道踩了其他的坑?

这个项目正常运行时,用 uwsgitop 查看 rqs 大概是 30,并发并不高,接口响应一般在 10ms,最慢也是 300ms,不知道有没有碰到类似问题的朋友?
2841 次点击
所在节点    Python
7 条回复
est
2019-03-31 19:07:38 +08:00
listen 一般 200 就够用了。你这是堵了多少没处理过来的请求。。。还是贵站业务特别繁忙?

举个例子,

workers = 144
listen = 100

这个配置我 4 个物理机抗过 4w qps 的的峰值。
jianjian001
2019-03-31 20:48:24 +08:00
有阻塞,没释放链接?贴个 简化的 代码看看。
arrow8899
2019-03-31 20:56:55 +08:00
没有遇到过。
检查下代码吧,应该是哪里 hang 住了
xing393939
2019-03-31 20:59:08 +08:00
@est 如果 listen 设 100 都没问题,那大概是程序容易卡了,关键是这个问题不好排查和定位。
xing393939
2019-03-31 21:03:35 +08:00
@jianjian001 我简单说下程序吧,用的 flask+pymongo+redis,这三个都是单独的机器环境,从 zabbix 上看机器状态没有异常。接口逻辑也是比较简单的,先查 redis,没有则查 mongo。
Lax
2019-03-31 21:07:54 +08:00
queue 就是个水管子,出水口(程序处理能力)太小就容易堵。
看看为什么处理能力不行吧
est
2019-03-31 21:11:02 +08:00
@xing393939 设置 100 其实很夸张了。

假如你一个请求 10ms 完成(实际肯定不止这个数),那么 100 个 queue,最后一个请求也得 1s 之后才能开始处理。。。对用户而言这就是灾难吧。。你 1025 长度的 queue,最后一个请求就是 10s 之后才会处理了。。

看下接口平均响应时间呢。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/550566

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX