博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python监控mysql连接数 批量杀进程 解决too many connections问题
阅读量:4301 次
发布时间:2019-05-27

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

线上django服务偶尔会因为机器访问mysql过多,造成too many connections 问题,导致服务挂掉。

之前调大了最大连接数,有点治标不治本。

所以今天抽空写个监控mysql连接数的服务,如果连接数超过某个阈值,就杀掉一部分连接。

核心代码。 

 

20191928更新:

之前直接time.sleep有点low,这回换了个Python定时任务的第三方框架——schedule,还挺好用的

参考:

更新后的核心代码如下:

# -*- coding: utf-8 -*-import getpassimport timeimport functoolsimport MySQLdbimport schedulefrom config import *from log_setup import set_logif getpass.getuser() == 'wangjinyu':    from loc_config import *logger = set_log(__name__)def catch_exceptions(cancel_on_failure=False):    def catch_exceptions_decorator(job_func):        @functools.wraps(job_func)        def wrapper(*args, **kwargs):            try:                return job_func(*args, **kwargs)            except:                import traceback                logger.info(traceback.format_exc())                if cancel_on_failure:                    return schedule.CancelJob        return wrapper    return catch_exceptions_decorator@catch_exceptions()def handle_process_num():    conn = MySQLdb.connect(host=MYSQL_HOST, port=MYSQL_PORT, user=MYSQL_USER, password=MYSQL_PASSWORD)    cur = conn.cursor()    cur.execute('show full processlist')    process_list = list(cur.fetchall())    cur_process_num = len(process_list)    cur.close()    if cur_process_num > MAX_CON_NUM:        logger.info('current process num: %d' % cur_process_num)        logger.info('start kill process')        try:            kill_process(process_list, cur_process_num)        except Exception:            logger.exception('process error ocurr')def kill_process(process_list, cur_process_num):    killed_num = 0    # order by connected time    process_list.sort(key=lambda x: x[5], reverse=True)    conn = MySQLdb.connect(host=MYSQL_HOST, port=MYSQL_PORT, user=MYSQL_USER, password=MYSQL_PASSWORD)    cur = conn.cursor()    # try to kill 1/3 of processes    for i in range(cur_process_num // 2):        command = process_list[i][4]        time = int(process_list[i][5])        # if command is Sleep and Sleep time over 600s then kill process        if command == 'Sleep' and time > MAX_SLEEP_TIME:            try:                cur.execute('kill %s' % process_list[i][0])            except Exception:                logger.exception('kill process %d fail' % process_list[i][0])                continue            killed_num += 1    cur.execute('show full processlist')    post_process_num = len(cur.fetchall())    cur.close()    logger.info('this time kill %d process' % killed_num)    logger.info('remain process num:%d' % post_process_num)if __name__ == '__main__':    # run job every 30 minutes    schedule.every(INTERVAL_TIME).seconds.do(handle_process_num)    logger.info('mysql monitor service startup success')    while True:        schedule.run_pending()        time.sleep(1)
# -*- coding: utf-8 -*-import timeimport MySQLdbimport getpassfrom config import *from log_setup import set_loglogger = set_log(__name__)def hanlde_process_num():    conn = MySQLdb.connect(host=MYSQL_HOST, port=MYSQL_PORT, user=MYSQL_USER, password=MYSQL_PASSWORD)    cur = conn.cursor()    cur.execute('show full processlist')    process_list = list(cur.fetchall())    cur_process_num = len(process_list)    cur.close()    if cur_process_num > MAX_CON_NUM:        logger.info('current process num: %d' % cur_process_num)        logger.info('start kill process')        try:            kill_process(process_list)        except Exception:            logger.exception('process error ocurr')def kill_process(process_list):    killed_num = 0    #order by connected time    process_list.sort(key=lambda x:x[5],reverse=True)    conn = MySQLdb.connect(host=MYSQL_HOST, port=MYSQL_PORT, user=MYSQL_USER, password=MYSQL_PASSWORD)    cur = conn.cursor()    #try to kill 1/3 of processes    for i in range(MAX_CON_NUM // 3):        Command = process_list[i][4]        Time = int(process_list[i][5])        #if command is Sleep and Sleep time over 600s then kill process        if Command == 'Sleep' and Time > MAX_SLEEP_TIME:            try:                cur.execute('kill %s' % process_list[i][0])            except Exception:                logger.exception('kill process %d fail'%process_list[i][0])                continue            killed_num += 1    cur.execute('show full processlist')    post_process_num = len(cur.fetchall())    cur.close()    logger.info('this time kill %d process' % killed_num)    logger.info('remain process num:%d' % post_process_num)def sever():    logger.info('mysql monitor startup success')    while True:        try:            hanlde_process_num()        except Exception:            logger.exception("hanlde process num error")            time.sleep(10)            continue        #check mysql connect num every an hour        time.sleep(3600)if __name__ == '__main__':    sever()

 

转载地址:http://rkxws.baihongyu.com/

你可能感兴趣的文章
TCP/UDP网络编程入门教程之二:TCP Server端——socket与文件描述符
查看>>
c++中默认32位int类型转换截取高位部分
查看>>
labview中的移位寄存器、循环隧道,自动索引隧道的区别
查看>>
labview中的移位寄存器、循环隧道,自动索引隧道的区别
查看>>
C# SerialPort 读写三菱FX系列PLC
查看>>
指针的好处
查看>>
c++中用new和不用new创建对象的本质区别
查看>>
浅谈跳槽
查看>>
c#如何跨线程调用窗体控件
查看>>
Action<T> 无参数委托详解
查看>>
WPF的binding
查看>>
c++的构造函数初始化列表
查看>>
在C++里,有两种方法创建对象:
查看>>
浅谈C/C++中的指针和数组(一)
查看>>
C++中引用(&)的用法和应用实例
查看>>
C++中重载与重写函数区别及虚函数(转载)
查看>>
指针作为函数形参
查看>>
c#中的静态构造函数
查看>>
用c#绘制曲线图
查看>>
C++中重写与覆写(虚函数virtual)的区别
查看>>