tornado+sqlalchemy+celery,数据库连接消耗在哪里
随着公司业务的发展,网站的日活数也逐渐增多,以前只需要考虑将所需要的功能实现就行了,当日活越来越大的时候,就需要考虑对服务器的资源使用消耗情况有一个清楚的认知。
最近老是发现数据库的连接数如果几天不重启服务器,就经常会发现有很多sleep很久的数据库连接,对数据库服务器的性能有较大的影响。所以需要知道我们的数据库连接到底是在哪里被创建的,什么时候会被复用,什么时候会被释放。
测试的时候使用的代码,适当进行调整,可帮助梳理清楚场景。
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import (sessionmaker)
from sqlalchemy import create_engine
import time ## []括起来的参数,这边就是做一个占位符
engine = create_engine("mysql+{driver}://{username}:{password}@{server}/{database}?charset={charset}"\
.format(
driver = [MYSQL_DRIVER],
username = [MYSQL_USERNAME],
password = [MYSQL_PASSWORD],
server = [MYSQL_MASTER_SERVER],
database = [DB_NAME],
charset = [DB_CHARSET]
),
pool_size = 20,
max_overflow = 100,
pool_recycle = 7200,
echo = False # 调试模式,开启后可输出所有查询语句
)
DBSession = sessionmaker(bind=engine)
session=DBSession()
engine.execute("select 1;")
time.sleep(10)
session.execute("select 1;")
engine.execute("select 1;")
# session.close()
time.sleep(10)
session1=DBSession()
session1.execute("select 1;")
# session1.execute("select 1;")
engine.execute("select 1;")
就是在上面的这一部分代码的测试,可以对以下的问题给出一些个人理解:
1.什么时候创建新的数据库连接的?
A.engine.excute
B.session.excute
C.session.query
2.什么时候关掉sqlachemy里面的连接(其实是将可用的数据库连接丢回到sqlachemy的连接池里面去):
A.engine的excute执行完成时
B.session.close()/session.commit()/session.rollback()
C.engine定义里面设置的pool_recycle时间到期,如果某一个session长期占有,没有close,在这个到期了之后就会被回收回去;
3.什么时候关掉数据库连接:
A.python3进程关掉,比如kill或者重启服务器的时候;
B.数据库连接的sleep时间超过wait_timeout的时候;比如在一个http请求里面,先用了一次session.query,然后休眠了10秒钟,这个时候我们的数据库的wait_timeout如果设置为5秒,在query执行完成之后,数据库就会显示连接进入sleep状态,超过5秒就会被关掉。这个时候,如果我们如果需要继续用这个session来进行查询的话,就会提示“MySQL connection not available”
所以,为了不产生比较多的数据库连接,导致无谓的资源消耗,就是一定要注意尽量少创建新的,使用完了以后,一定要注意丢回到连接池中;当然还要保证,数据库的wait_timeout时间不能低于engine的pool_recyle时间,否则会出现mysql连接不可用的提示。
在tornado里面,可以在base的on_finish方法里面将本次请求产生的session关掉;
使用celery的时候也需要注意,可以在函数执行的末尾关掉本次创建的session,也可以写装饰器;并且需要注意,对函数异常也要进行捕获。
本次的测试过程使用到的一些知识:
①.查询数据库的连接超时设置:show variables like '%wait_timeout%';
②.查询数据库的最大可用连接数:show variables like '%max_connections%';
③.设置数据库的连接超时:set wait_timeout=28800;||set global wait_timeout=5;(这个global参数待查)
④.查看当前连接的使用情况:show status like 'Threads%';
⑤.查看所有的数据库连接情况:show full processlist;
⑥.lsof -i :3306 查看数据库的端口[3306]现在运行的情况
不过,后续还是需要把sqlachemy 官网推荐的web如何使用session的英文撸一撸。。。http://docs.sqlalchemy.org/en/latest/orm/session_basics.html#session-faq-whentocreate
然后还有一个疑惑,是在使用⑥的时候,有发现有一些celery程序有出现closewait的状态。
tcp连接有3次握手,断开连接有4次握手。closewait状态的产生,其实就是如果A是主动断开的一方,那么在B这边显示就会是CloseWait状态。
所以celery出现closewait,那就说明是mysql先关闭了连接,但是,celery和MySQL的连接,也是,一个是使用的是db_config里面的engine,回收时间是7200,mysql的wait_timeout是28800,按道理不会出现数据库中关掉了,但是celery里面没关掉的情况。。。
可能是我还是有哪里没有弄的很透彻。。。
tornado+sqlalchemy+celery,数据库连接消耗在哪里的更多相关文章
- Tornado sqlalchemy
上篇文章提到了,最近在用 Python 做一个网站.除了 Tornado ,主要还用到了 SQLAlchemy.这篇就是介绍我在使用 SQLAlchemy 的过程中,学到的一些知识. 首先说下,由于最 ...
- 在tornado中使用celery实现异步任务处理之中的一个
一.简单介绍 tornado-celery是用于Tornado web框架的非堵塞 celeryclient. 通过tornado-celery能够将耗时任务增加到任务队列中处理, 在celery中创 ...
- Tornado开发技巧,简单了解tornado
tornado基础入门(一)——简单了解tornado 参考:http://demo.pythoner.com/itt2zh/ch1.html tornado是一个轻量级的web框架,是一个用pyth ...
- 在 tornado 中异步无阻塞的执行耗时任务
在 tornado 中异步无阻塞的执行耗时任务 在 linux 上 tornado 是基于 epoll 的事件驱动框架,在网络事件上是无阻塞的.但是因为 tornado 自身是单线程的,所以如果我们在 ...
- Java使用独立数据库连接池(DBCP为例)
目前,绝大多数的软件系统都会使用数据库,而在软件构建起来之后,访问数据库又成为软件系统性能的短板(I/O操作).一般来说一次访问数据库就需要一个数据库连接.而每次创建数据库连接都需要访问,分配空闲资源 ...
- Tornado异步阻塞解决方案
在 tornado 中异步无阻塞的执行耗时任务 在 linux 上 tornado 是基于 epoll 的事件驱动框架,在网络事件上是无阻塞的.但是因为 tornado 自身是单线程的,所以如果我们在 ...
- Python开发【Tornado】:异步Web服务(二)
真正的 Tornado 异步非阻塞 前言: 其中 Tornado 的定义是 Web 框架和异步网络库,其中他具备有异步非阻塞能力,能解决他两个框架请求阻塞的问题,在需要并发能力时候就应该使用 Torn ...
- 简单的数据库连接池实例(java语言)
1.概述 频繁的创建和销毁数据库连接消耗非常多的系统资源,创建一个池子, 管理一定数量的连接,用的时候去池中取,用完了放回池中,这时比较通用的做法. 2.关键字 LinkedList synchro ...
- Tornado + Bootstrap 快速搭建自己的web应用
前言 最近用 python tordado 框架, 整了一个模板页面, 用于接入与发布数据的展示, tornado 简单易用, bootstrap 比较流行, 用起来也省事, 配合起来做些小案例非常迅 ...
随机推荐
- 使用po模式读取豆瓣读书最受关注的书籍,取出标题、评分、评论、题材 按评分从小到大排序并输出到txt文件中
#coding=utf-8from time import sleepimport unittestfrom selenium import webdriverfrom selenium.webdri ...
- 【干货分享】流程DEMO-加班与调休
流程名: 加班.调休 业务描述: 加班: 工作日加班可以申请调休,也可以申请支付加班费.原则上都应申请调休:周末加班原则上申请调休:法定节假日加班支付加班费. 加班申请以半小时为单位. 当月加班不能 ...
- Android之Pull解析XML
一.Pull解析方法介绍 除了可以使用SAX和DOM解析XML文件,也可以使用Android内置的Pull解析器解析XML文件.Pull解析器的运行方式与SAX解析器相似.它也是事件触发的.Pull解 ...
- 1.Hibernate简介
1.框架简介: 定义:基于java语言开发的一套ORM框架: 优点:a.方便开发; b.大大减少代码量; c.性能稍高(不能与数据库高手相比,较一般数据库使用者 ...
- 烂泥:数据库管理之phpmyadmin免密码配置
本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb 其实这篇文章很早就想写了,但是一直没有时间.刚好今天下午稍微空了点,就把这篇文章整理出来 ...
- 08讲browse命令的使用技巧
.浏览所有parts ,使用技巧 .浏览所有 nets,使用技巧 在上图中选择nets .浏览所有 offpage connector,使用技巧 如上 .浏览所有 DRC makers,使用技巧 5. ...
- ASP.NET Linux部署(2) - MS Owin + WebApi + Mono + Jexus
ASP.NET Linux部署(2) - MS Owin + WebApi + Mono + Jexus 本文承接我的上一篇博文: ASP.NET 5 Linux部署,那篇文章主要是针对最新的ASP. ...
- Fedora 22中的用户和用户组管理
The control of users and groups is a core element of Fedora system administration. This chapter expl ...
- APUE fig 1.10示例代码的完善--对提示符及输入回车的优化
APUE 第3版第15页的shell2.c示例程序,运行效果如下: gcc ol.shell.c -o origin_shell ./origin_shell % date 2015年12月13日 星 ...
- UIApplication和OpenUrl的基于使用方法
UIApplication实用方法 前言: 本文介绍的方法每一个人在项目都应用过,只是有的时候容易忘记每次都要去百度.因为有些方法在整个项目中可能就只会写一次,基于此我只是做个笔记. 1. 每一个应用 ...