博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python+uwsgi导致redis无法长链接引起性能下降问题记录
阅读量:7081 次
发布时间:2019-06-28

本文共 1582 字,大约阅读时间需要 5 分钟。

  今天在部署python代码到预生产环境时,web站老是出现redis链接未初始化,无法连接到服务的提示,比对了一下开发环境与测试环境代码,完全一致,然后就是查看各种日志,排查了半天也没有查明是什么原因引起的。

  没有办法的情况下,直接登录服务器,从uwsgi与nginx中卸载掉这个web服务,然后暴力的在命令操作符下输入python main.py,执行访问发现又正常了......狂吐血400CC...然后是各种怀疑uwsgi和nginx,查看配置与其他服务正常,排除完后只能回归到检查代码。

  静下心来查看优化过后的代码,发现为了保持redis只有一个长链接,在web服务主程序启动时会对redis模块进行一次初始化,在代码中用global将redis链接设置为静态全局变量,redis链接只需要初始一次

# 初始化Redis缓存链接r = Nonedef set_redis_config(_redis):    """    设置redis配置参数    :param _redis: redis配置参数    """    global r    # 初始化Redis缓存链接    try:        if not r:            r = redis.Redis(host=_redis.get('server', ''), port=_redis.get('post', ''), db=_redis.get('db', ''),                            password=_redis.get('pwd', ''),                            socket_timeout=1, socket_connect_timeout=1)            log_helper.info('初始化redis缓存链接')    except:        pass

  然后将初始化代码改变地方,放在勾子里,再次启用uwsgi与nginx服务,运行终于正常了。

  找了朋友问问得知,原来uwsgi是多进程服务,听了后心里比较担心,会不会因为多进程关系使global失效,造成改造后长链接过多使redis服务崩溃了,马上使用jmeter进行了压力测试,压了300个并发跑了一段时间,连上redis服务输入client list命令,查看已链接的客户端列表,发现没几个,打开日志发现在高并发时,初始化代码执行的并不多,也就是说使用uwsgi虽然造成了redis长链接需要经常创建,但global还是起到了一定的作用,没有产生很差的结果。

  由于redis要经常重新创建链接,担心它会影响性能所以对其中一个接口进行改造,一个使用redis读取数据,另一个直接读取postgresql数据库,然后对两个接口通过手动刷新页面方式进行反复访问后,查看接口日志占用的时间,发现刷新慢时,使用redis方式会占用比较多时间,而访问非常频繁时,反复调用一个长链接的机会会多很多,影响不大,两种方式访问的效果差不多。

  当然和没有使用uwsgi的开发环境与测试环境对比来看,redis要经常创建新链接会占用一定的开销,影响了部分性能。暂时还没有想到好的解决办法,先记录一下,以后有时间再尝试用其他方式测试看看效果。

 

版权声明:

  本文由AllEmpty原创并发布于博客园,欢迎转载,未经本人同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。如有问题,可以通过1654937@qq.com 联系我,非常感谢。

     发表本编内容,是为了和大家共同学习共同进步,有兴趣的朋友可以加加Q群:669058475,大家一起探讨。

    更多内容,敬请观注博客:

 

你可能感兴趣的文章
在Ubuntu 桌面版 12.04 LTS安装并运行SSH
查看>>
Oracle EBS R12.1 版本各种开启及关闭操作
查看>>
公积金联名卡——提取公积金用,用身份证即可办理
查看>>
Java:类与继承
查看>>
.NET DLR 上的IronScheme 语言互操作&&IronScheme控制台输入中文的问题
查看>>
Digitize using Fusion Viewer API in MapGuide Enterprise 2011
查看>>
递归类型的排列组合来解决问题(一个、周期类排列组合)
查看>>
Jmeter组件执行顺序与作用域
查看>>
Linux 修改文件用户属性
查看>>
50款非常棒的 jQuery 插件分享
查看>>
我理解的OAuth 1.0a 的验证过程
查看>>
对 ar 命令的学习
查看>>
T-SQL:流程控制 3,While 语句
查看>>
数据结构~时间复杂度
查看>>
Dubbo架构设计详解
查看>>
释放:在Xamarin Native中嵌入Xamarin.Forms
查看>>
linux useradd 命令基本用法
查看>>
SQL Server利用数据库日志恢复数据到时间点的操作
查看>>
mpstat
查看>>
jQuery 2.0.3 源码分析 回溯魔法 end()和pushStack()
查看>>