请教 Python 大神关于 flask 压测 rps 掉到 0

23 天前
 Flourite
from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello_world():
    return "Hello, World!"

以上代码使用 wrk 压测(wrk -t2 -c100 -d10s http://localhost:5000/ ),第三次 rps 就会掉到 0 ,是什么原因导致的?是 GIL 锁导致的吗?

2288 次点击
所在节点    Python
27 条回复
scriptB0y
21 天前
@ctrlaltdeletel
@Kauruus
@ho121

应该就是 @Kauruus 和 @ctrlaltdeletel 说的 TCP TIME_WAIT 状态的问题。

我的 Linux (默认就是 tcp_tw_reuse = 2 ) 测试不能复现。

MAC 因为默认没有开启,所以在两次压测会把客户端发起 TCP 连接的可用端口全部消耗掉,第三次压测就没有端口可以用来建立和 5000 端口的连接了。

可以这么查看客户端可用的端口

sysctl net.inet.ip.portrange.first net.inet.ip.portrange.last
net.inet.ip.portrange.first: 49152
net.inet.ip.portrange.last: 65535

可以得到 65535 - 49152 = 16383, 16383 差不多可以用两次压测消耗完。

参考下这篇,就楼主说的问题一模一样: https://web.archive.org/web/20180129235834/http://danielmendel.github.io/blog/2013/04/07/benchmarkers-beware-the-ephemeral-port-limit/
Flourite
21 天前
@scriptB0y 这里还是有问题,那就是我换成 django 或其他语言的 web 框架压力测试却是正常的,至于 linux ,我记得几年前测试也有问题
scriptB0y
21 天前
@Flourite 这个和 Django 没关系。可能是 Django 性能差,用不完所有的客户端连接?

和 Linux MAC 其实也没关系,就是默认参数一个是开一个是关,可能你用的发行版 tcp_tw_reuse 是 0.
alex8
20 天前
Python 这种胶水语言运行效率本来就很低啊,纯 python 不适合互联网产品
julyclyde
20 天前
@alex8 这事跟语言就没啥关系
fzzff
19 天前
复现了, mark 一下等大佬
pyKane
11 天前
非异步方式没必要压力测试了,意义不大。
建议上异步+多进程,性能是真的很好很好。

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

https://tanronggui.xyz/t/1104209

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

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

© 2021 V2EX