后端框架高并发测试
对 python 的 Flask、FastAPI 和 Spring Boot 集成的简单接口做速度对比,返回 json 格式的当前时间戳:
{
"timestamp":1584416801569
}
同时把某个11位时间戳 json string 写死在 index.html 里,测试 Nginx 的并发量。虽然一个静态资源一个动态计算没有可比性,但是为了体现性能差距,还是把 Nginx 的并发拿来做对比。
其他三种框架代码如下:
Spring Boot:
@RestController
public class MainController {
@RequestMapping("/")
public TimestampResult index() {
return new TimestampResult();
}
}
@Data
public class TimestampResult {
private long timestamp;
TimestampResult() {
this.timestamp = System.currentTimeMillis();
}
}
Flask:
@app.route('/')
def hello():
return ujson.dumps({
"timestamp": int(round(time.time() * 1000))
})
FastAPI:
@app.get("/")
async def index():
return ujson.dumps({
"timestamp": int(round(time.time() * 1000))
})
用 Docker 开一个 Ubuntu 系统的 Container,分配4核2G,安装好 python、jre 环境,部署上面四个程序,分别监听 18000、18001、18002、18003 这4个端口。
使用 jmeter 测试结果如下
Label | 平均值 | 最小值 | 最大值 | 吞吐量 |
---|---|---|---|---|
nginx_html | 31 | 1 | 223 | 3129.16597 |
flask_json | 1844 | 5 | 2450 | 53.66379 |
fastapi_json | 392 | 5 | 1212 | 252.50794 |
springboot_json | 38 | 1 | 224 | 2585.76591 |
总体 | 65 | 1 | 2450 | 5994.21573 |
从吞吐量的数据可以看到,对于简单的获取时间戳返回 json 的任务,SpringBoot 的性能相当好,甚至和 Nginx 托管静态文件相比差不了多少。而 Python 阵营的就要慢一些,新兴的 FastAPI 比老牌的 Flask 吞吐量要大上5倍左右,而 SpringBoot 的吞吐量差不多是 FastAPI 的10倍。从响应时间上来看 SpringBoot 则更是比 Python 系的要稳得多,和 Nginx 不分伯仲,相当令人惊讶。
当然这次测试是把4种服务放在同一个虚拟机下测试的,可能会涉及资源抢占、调度等等问题。设计上也可能会有没考虑到的地方有一些不合理之处。如果你有更好的想法或者有什么想说的,欢迎在下面评论。
博主您好,能向您请教一个问题吗?这个fastapi的并发请求时间是可以减少的吗?
你好,最近Python api写的很少了,吞吐量大的情况下看下具体什么资源紧张,CPU?内存?磁盘IO?网络IO?任务类型是啥样的?需要根据具体场景优化。可能的话向你安利下golang,Python作为解释型的语言这种场景下不会太快。或者可以考虑Cython
当并发请求数量增加,它那个时间就会特别久,这个是和那个任务完成时间有关的吗,可是单一个任务就是零点4到5秒这样
并发请求200,它就是使用了大概24秒这样
请问Python系列的api是否运用了多进程部署以利用多核呢?比如Fastapi用的gunicorn uvicorn使用多进程启动,-k 参数