tornado中使用torndb,连接数过高的问题

问题背景

最近新的产品开发中,使用了到了Tornado和mysql数据库。但在基本框架完成之后,我在开发时候发现了一个很奇怪的现象,我在测试时,发现数据库返回不了结果,于是我在mysql中输入show processlist,发现连接数很高,我就将目标锁定在程序代码和torndb上了。

探索原因

当我kill掉tornado的进程时候,连接数就会被关闭,所以果断判断会不会是torndb的原因,导致我连接没有断开。于是我猜想会不会是在tornado服务挂掉的时候,mysql的连接没关。而且我想到我是在测试环境,开启了DEBUG模式,所以我利用的是tornado的autoreload的功能。

所以问题可能是tornado的autoreload出现了问题,这个时候mysql没有关闭所有连接,而autoreload 的时候又重新建立了连接,因为python是脚本语言,脚本没停,api重新加载,那么肯定是重新实例化了application的 时候重新建立了连接,而mysql的实例还在,所以就没有释放之前的连接,又叠加了连接。

验证猜想

为了验证我的猜想,我又做了以下的测试,同样开启两个终端,一个在tail -f mysqld.log的日志,另一个后台运行tornado,然后我随便修改了下一个文件,保存后退出,果然连接数翻倍。所以最终问题肯定就是因为mysql的连接没有释放了。接下来我做的修改就是在tornado中加了一个hook,在重启前add_reload_hook中增加了一个release的函数,如下:

def release():
    from lib.query import _mysql_server
    for key in _mysql_server:
        db = _mysql_server[key]
        db.close()

def run():
    application_settings = {
        ‘handlers‘: urls,
        ‘debug‘: DEBUG,
    }
    application = tornado.web.Application(**application_settings)
    options.parse_command_line()

    init_log(options.log_dir)
    application.listen(options.port)
    io_loop = tornado.ioloop.IOLoop.instance()

    # 这段代码是解决autoreload造成连接数没有断开的问题
    tornado.autoreload.add_reload_hook(release)
    tornado.autoreload.start(io_loop)

    io_loop.start()
时间: 2024-10-11 21:40:27

tornado中使用torndb,连接数过高的问题的相关文章

在tornado中使用celery实现异步任务处理之一

一.简介 tornado-celery是用于Tornado web框架的非阻塞 celery客户端. 通过tornado-celery可以将耗时任务加入到任务队列中处理, 在celery中创建任务,tornado中就可以像调用AsyncHttpClient一样调用这些任务. ? Celery中两个基本的概念:Broker.Backend Broker : 其实就是一开始说的 消息队列 ,用来发送和接受消息. Broker有几个方案可供选择:RabbitMQ,Redis,数据库等 Backend:

深入tornado中的TCPServer

1 梳理: 应用层的下一层是传输层,而http协议一般是使用tcp的,所以实现tcp的重要性就不言而喻. 由于tornado中实现了ioloop这个反应器以及iostream这个对连接的异步读写,所以tcp就很容易实现异步. 在tornado的tcpserver文件中,实现了TCPServer这个类,他是一个单线程的,非阻塞的tcp 服务. 为了与上层协议(在tornado中就是HTTPServer)交互,TCPServer提供了一个接口:handle_stream, 要求其子类必需实现该方法.

查看linux中的TCP连接数【转】

转自:http://blog.csdn.net/he_jian1/article/details/40787269 查看linux中的TCP连接数 本文章已收录于:  计算机网络知识库  分类: 安全测试总结(2)  性能经验总结(107)  版权声明:本文为博主原创文章,未经博主允许不得转载. 一.查看哪些IP连接本机 netstat -an 二.查看TCP连接数 1)统计80端口连接数netstat -nat|grep -i "80"|wc -l 2)统计httpd协议连接数ps

深入tornado中的协程

tornado使用了单进程(当然也可以多进程) + 协程 + I/O多路复用的机制,解决了C10K中因为过多的线程(进程)的上下文切换 而导致的cpu资源的浪费. tornado中的I/O多路复用前面已经讲过了.本文不做详细解释. 来看一下tornado中的协程模块:tornado.gen: tornado.gen是根据生成器(generator)实现的,用来更加简单的实现异步. 先来说一下tornado.gen.coroutine的实现思路: 我们知道generator中的yield语句可以使

连接数过高导致网络故障处理

前段时间,一连发现好几个用户的路由器里面的连接数过高,我仔细查看了一下,发现有一个通用的问题 就是: 用户有连接很多LAN口的连接,都是指向内网IP有些甚至是255.255.255.255的目标地址,这样直接导致用户连接数过高,无法正常访问其他的网络资源 我初步分析,有可能是以下几种情况,一种是病毒,另一种是内网软件通过P2p直接相连 不管三七二一,直接禁止内网互访,问题解决,哈哈,给大家一个参考 连接数过高导致网络故障处理,布布扣,bubuko.com

在 tornado 中异步无阻塞的执行耗时任务

在 linux 上 tornado 是基于 epoll 的事件驱动框架,在网络事件上是无阻塞的.但是因为 tornado 自身是单线程的,所以如果我们在某一个时刻执行了一个耗时的任务,那么就会阻塞在这里,无法响应其他的任务请求,这个和 tornado 的高性能服务器称号不符,所以我们要想办法把耗时的任务转换为不阻塞主线程,让耗时的任务不影响对其他请求的响应. 在 python 3.2 上,增加了一个并行库 concurrent.futures,这个库提供了更简单的异步执行函数的方法. 如果是在

AIX 中 Paging Space 使用率过高的分析与解决

AIX操作系统中Paging Space是很重要的设备,当系统中Paging Space使用率过高.系统内存不足时,将影响系统的整体性能,甚至会造成系统的挂起.针对这种情况,通常可以靠增加Paging Space来加以缓解:但是当Paging Space已经相当大,而Paging Space使用率仍旧居高不下时,则需要通过进一步的分析来找出原因并加以解决.文中分析了几种Paging Space使用率持续增长直至过高的常见原因,并给出了相应的解决方案,以确保Paging Space使用率被控制在安

针对Properties中实时性要求不高的配置参数,用Java缓存起来

Properties常用于项目中参数的配置,当项目中某段程序需要获取动态参数时,就从Properties中读取该参数,使程序是可配置的.灵活的. 有些配置参数要求立即生效,有些则未必: 一.实时性要求非常高.项目中,有些参数要求实时性非常高,即在系统运行中,IT人员修改了该参数值,该新参数值要求立即在程序中生效: 二.实时性要求不高.其实,并不是每个配置参数都要求实时性那么高,有些配置参数基本不会在项目运行当中修改,或即使在运行当中修改,也只要求其在下一次项目启动时生效. 针对第二种情况,鉴于程

伊顿在中端市场获得与高端一样的统治力

山特UPS曾经被称为UPS市场上的"机王",因为市场上每三台UPS中就有一台来自山特.中端UPS占中国UPS整体市场的40%,而山特在中端市场占有70%的份额.在云计算.大规模数据中心逐渐兴起的新时代,山特还能保持其原有的领先地位吗? 高端UPS市场向中端扩展,低端UPS市场向上延展,中端UPS市场面临新的增长机遇,让伊顿公司对山特的业务有了更高的期望.刚刚上任两个多月的伊顿电气电能质量中国区业务总经理曲颖将肩负起重建山特品牌的重任. 品牌重建 实现共赢 在云计算时代,数据中心正在向两