python+uwsgi导致redis无法长链接引起性能下降问题记录

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

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

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

# 初始化Redis缓存链接
r = None

def 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原创并发布于博客园,欢迎转载,未经本人同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。如有问题,可以通过[email protected] 联系我,非常感谢。

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

 更多内容,敬请观注博客:http://www.cnblogs.com/EmptyFS/

时间: 2024-10-24 10:02:59

python+uwsgi导致redis无法长链接引起性能下降问题记录的相关文章

debian 系统python+uwsgi+nginx实现web环境

1,python web部署的实现: python+uwsgi+nginx实现web. 本文测试环境: 服务器:树莓派B+ 操作系统: [email protected]:~# cat /etc/issue Raspbian GNU/Linux 7 \n \l IP: [email protected]:~# ip ad s 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN      link/loopbac

iptables不小心把127.0.0.1封了,导致redis连不上

写了个脚本扫描apache日志,自动把恶意攻击者的ip交给iptables给封掉 谁知道一不小心把127.0.0.1也给封了... 直接导致redis无法链接. redis-server服务正常启动,端口也开着,日志全都正常,就是redis客户端(redis-cli和python api)连不上,报错timeout. 一查链接状态,发现客户端是SYN_SENT,也就是“客户端发出了连接请求,等待服务端响应”. iptabls把127.0.0.1给解封后,就恢复正常了.

微信公众号开发-长链接转短链接

主要使用场景: 开发者用于生成二维码的原链接(商品.支付二维码等)太长导致扫码速度和成功率下降,将原长链接通过此接口转成短链接再生成二维码将大大提升扫码速度和成功率. http请求方式: POST https://api.weixin.qq.com/cgi-bin/shorturl?access_token=ACCESS_TOKEN 参数说明 参数 是否必须 说明 access_token 是 调用接口凭证 action 是 此处填long2short,代表长链接转短链接 long_url 是

纯Socket(BIO)长链接编程的常见的坑和填坑套路

本文章纯属个人经验总结,伪代码也是写文章的时候顺便白板编码的,可能有逻辑问题,请帮忙指正,谢谢. Internet(全球互联网)是无数台机器基于TCP/IP协议族相互通信产生的.TCP/IP协议族分了四层实现,链路层.网络层.传输层.应用层. 与我们应用开发者接触最多的应该是应用层了,例如web应用普遍使用HTTP协议,HTTP协议帮助我们开发者做了非常多的事情,通过HTTP足以完成大部分的通信工作了,但是有时候会有一些特殊的场景出现,使得HTTP协议并不能得心应手的完成工作,这个时候就需要我们

长链接转短链接(短网址)

场景 ? 短链接服务就是将一段长的URL转换为短的URL,比如利用新浪微博的短链接生成器,可将一段长的URL(http://blog.csdn.net/poem_qianmo/article/details/52344732)转换为一段短的URL(http://t.cn/RtFFvic),用户通过访问短链接即可重定向到原始的URL. 整个交互流程如下: 用户访问短链接:http://t.cn/RtFFvic 短链接服务器t.cn收到请求,根据URL路径RtFFvic获取到原始的长链接:http:

关于python语言使用redis时,连接是否需要关闭的问题

python操作完redis,需要关闭连接的吧,怎么关闭呢 1人赞 回复 君惜丶: redis-server会关闭空闲超时的连接redis.conf中可以设置超时时间:timeout 300 2017.10.21 11:16 回复 君惜丶: 如果使用连接池就不需要关闭. 当我们用Redis和StrictRedis创建连接时,其实内部实现并没有主动给我创建一个连接,我们获得的连接是连接池提供的连接,这个连接由连接池管理,所以我们无需关注连接是否需要主动释放的问题.另外连接池有自己的关闭连接的接口,

python更新导致yum无法使用

问题: There was a problem importing one of the Python modulesrequired to run yum. The error leading to this problem was:   No module named yumPlease install a package which provides this module, orverify that the module is installed correctly.It's poss

获取长链接的域名

示例:长链接:https://www.baidu.com?a=1&b=2 域名:www.baidu.com static String getDomainUrl(String url) { String domainUrl = ""; Pattern p = Pattern.compile("(?<=//|)((\\w)+\\.)+\\w+"); Matcher m = p.matcher(url); if (m.find()) { domainUrl

php 微信接口API之长链接转短链接代码示例

[php] view plain copy <?php header("Content-Type: text/html; charset=utf-8"); $longurl; if(isset($_POST['longurl'])){ $longurl = $_POST['longurl']; }else{ die("没有post值进来"); } //echo $longurl; $id = "你的AppID"; $secret = &qu