Flask SQL性能测试:使用flask-sqlalchemy检测慢SQL语句

Flask SQL性能测试:使用flask-sqlalchemy检测慢SQL语句,第1张

摘要: Flask , flask-sqlalchemy , SQL

flask-sqlalchemy 可以记录下在客户端请求应用的过程中,后台涉及的SQL语句,以及SQL语句执行的时长,主要基于flask-sqlalchemy下的 get_debug_queries 实现。在主视图脚本中加入一个 after_request 视图如下。

其中开启SQL Debug模式 app.config['SQLALCHEMY_RECORD_QUERIES'] = True , get_debug_queries 返回请求涉及的所有SQL语句,调用 duration 获得SQL执行时长,只要大于0.2就用logging模块记录到磁盘。

启动程序,点击应用功能,logging会把大于时间阈值的SQL写入本地文件query_log.log

直接搜索Slow query,得到以下几条记录

三张表pira_ent_alias,pira_score,pira_senti_stats都是简单的filter查询,没有复杂的逻辑,查看MySQL explain执行计划

explain结果解析

增加索引

三张表都进行了全表扫描,先加上索引再说,给pira_ent_alias增加ent_name和ent_shortname的普通索引

给pira_score,pira_senti_stats增加ent_name和datetime的复合索引,复合索引从字段组合的 最左边开始就要走 ,否则无效,因此如果filter条件只有datetime还是全表扫描,filter条件是ent_name或者ent_name和datetime有效。

给三张表增加索引之后,再次运行get_debug_queries,阈值降低为0,查看日志如下,执行时间都有很大降低

其实源码分析很难写好,关键要自己去阅读

先写一个测试程序

ctrl+左键点击进request源码

可以看到request是_request_ctx_stack.top的一个request属性。同时,_request_ctx_stack是一个全局对象。

那么什么时候会产生_request_ctx_stack.top对象呢,在处理请求前会构造并且赋值进去。

在RequestContext的push方法,有

此语句将RequestContextpush进_request_ctx_stack,这个语句所在的push函数会在处理请求前会构造并且赋值进去。

每一次ajax请求都建立新的tcp连接,flask dev版本的server是HTTP1.0。但是chrome并不会说只建立一个tcp连接,网上有人说一个网站最多会同时建立6个连接。

使用nginx的时候可以看到复用了连接

那么如果用独角兽和nginx一起部署,nginx代理本地独角兽端口,是不是nginx和Gunicorn之间是什么连接?性能上来说是做成长连接, 具体是怎么处理的还得看nginx和Gunicorn的实现。Flask只做了wsgi_app(),是在多进程还是多线程下执行的Flask由Gunicorn决定。每个进程之间数据隔离,线程共享数据,而Flask的经典设计,把请求上下文和当前请求线程关联(没有多线程那就是main线程),每一个线程的请求上下文放到stack里面,那么如果复用http请求的话,是不是会造成阻塞?

从Flask dev的server来看,里面使用的是tcpserver模块,这个是python内置模块,同时默认,flask的server是多线程的,每一个tcp请求都会在子线程处理

在BaseServer里面可以看到处理请求

get_request方法就是返回一个socket连接

具体的process_request是由ThreadingMixIn实现,

每一次请求完就shutdown_request, 并没有复用。如果需要复用,需要保存连接请求放在连接池,浏览器也不要关闭连接,服务端也不要关闭,继续监听这个tcp连接是否有数据接收,有就读取出来处理。

finish_request会创建BaseRequestHandler对象。

BaseRequestHandler里面会调用子类的handle方法

在flask更新到1.0之后的版本,官方推荐使用flask run的方式运行程序,可是作为开发,如果没有了pycharm的断点调试,这可太难受了。

所以,本篇博客主要讲述如何在pycharm中运行flask程序,并开启Debug模式。

首先你的使用pycharm创建你的第一个app。

然后,你会有一个基本的应用程序了。没错就是那个hello world。

接下来我们开始配置pycharm。

点击红色下拉框,选择“Edit Configurations”会d出一个配置窗口。

下图的配置窗口你需要注意三个地方。我在图中依次标注了出来。

这是我的应用的名字,这个名字是使用pycharm创建项目时根据项目名字自动生成,我们无需关系,但是要确定这个一个flask server就OK。

如果你创建项目的时候没有选择flask,这里不会出现这个flask server。

这里需要指定项目要运行的脚本,你可以理解为是整个项目的一个入口。

点击右侧的文件夹,找到你的刚才创建的应用程序所在的目录,并选择哪个app.py文件就行。

这里需要指定两个环境变量(分别是LC_ALL和LANG),否则pycharm会报错。

点击右侧的按钮会d出一个配置环境变量的列表,点击“+”添加环境变量,分别加上LC_ALL和LANG。

我们可以在项目的根目录,添加一个叫.flaskenv的文件。

其中写上如下内容:

然后打开pycharm的终端窗口。执行flask run即可。

写到这里我忍不住吐槽两句,原本简单粗暴的框架,非得整这些花里胡哨的玩意,java为什么市场占有率那么高?

我个人认为就是很多事情框架都帮你做好了,开发懂个屁啊,你让他配置?他能把语法写明白就不错了!!我呸!!


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11755596.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存