win7下的flask开发环境(Python3.7 + Flask 1.1.1 + MariaDb 10.5.3)
自测一个查询数据库的接口,单次请求发送时,正常。
使用apache bench构建请求,设置为100并发,共10000次请求时,汇总结果出现大量的失败提示。
查看服务端日志,抛出大量异常信息,Packet sequence number wrong - got 1 expected 0
此时继续单次请求发送,仍然返回500,重启flask服务后恢复正常。
期间,查了下相关资料,有的说是session未加线程锁。加上后,故障依旧。
再次压测接口,情况照旧。此时尝试使用navicat连接到数据库,出现报错,提示连接数被占满了。
再次重启flask服务后,navicat可以正常访问。mysql命令行输入SHOW PROCESSLIST; 命令,查询当前连接数,仅有2个。当启动压测时,瞬间飙升至152个。
根据这个,定位到相关数据库获取session的语句,发现获取sqlalchemy连接池session的方法并不是单例,而是重新实例化了一个新的对象。
更改为连接池单例后,再次压测,可正常通过。