python监控mysql连接数 批量杀进程 解决too many connections问题

2023-10-30

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

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

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

核心代码。 

 

20191928更新:

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

参考:

https://schedule.readthedocs.io/en/stable/

https://schedule.readthedocs.io/en/stable/faq.html#what-if-my-task-throws-an-exception

更新后的核心代码如下:

# -*- coding: utf-8 -*-
import getpass
import time
import functools

import MySQLdb
import schedule

from config import *
from log_setup import set_log

if 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 time

import MySQLdb
import getpass

from config import *
from log_setup import set_log


logger = 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()

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python监控mysql连接数 批量杀进程 解决too many connections问题 的相关文章

  • 如何使用 Python boto3 获取 redshift 中的列名称

    我想使用 python boto3 获取 redshift 中的列名称 创建Redshift集群 将数据插入其中 配置的机密管理器 配置 SageMaker 笔记本 打开Jupyter Notebook写入以下代码 import boto3
  • 从 pyspark.sql 中的列表创建数据框

    我完全陷入了有线的境地 现在我有一个清单li li example data map lambda x get labeled prediction w x collect print li type li 输出就像 0 0 59 0 0
  • 将 pandas 剪切操作转换为常规字符串

    我明白了 pandas cut 操作的输出 0 0 20 1 0 20 2 0 20 3 0 20 4 0 20 5 0 20 6 0 20 7 0 20 8 0 20 9 0 20 如何将 0 20 转换为 0 20 我正在这样做 str
  • 是否有一个包可以维护所有带有符号的货币列表?

    是否有一个 python 包提供所有 或相当完整 货币的列表与符号 如美元的 有优秀的pycountry 贪财的 https github com limist py moneyed and ccy http code google com
  • 如何将 sql 数据输出到 QCalendarWidget

    我希望能够在日历小部件上突出显示 SQL 数据库中的一天 就像启动程序时突出显示当前日期一样 在我的示例中 它是红色突出显示 我想要发生的是 当用户按下突出显示的日期时 数据库中日期旁边的文本将显示在日历下方的标签上 这是我使用 QT De
  • 在Python中读取tiff标签

    我正在尝试用 Python 读取 tiff 文件的标签 该文件是 RGB 的uint16每个通道的值 我目前正在使用tifffile import tifffile img tifffile imread file tif 然而 img是一
  • 在 Mac OSX 上从 Python 3.6 运行 wine 命令

    我正在尝试用 Python 编写一个打开的脚本wine然后发送代码到wine终端打开一个 exe程序 这 exe程序也是命令驱动的 我可以打开wine 但我无法进一步 import shlex subprocess line usr bin
  • 在 Mac OS X 上安装 libxml2 时出现问题

    我正在尝试在我的 Mac 操作系统 10 6 4 上安装 libxml2 我实际上正在尝试在 Python 中运行 Scrapy 脚本 这需要我安装 Twisted Zope 现在还需要安装 libxml2 我已经下载了最新版本 2 7 7
  • 如何在 Django Rest 框架中编写“删除”操作的测试

    我正在为 Django Rest Framework API 编写测试 我一直在测试 删除 我对 创建 的测试工作正常 这是我的测试代码 import json from django urls import reverse from re
  • 时间序列数据预处理 - numpy strides 技巧以节省内存

    我正在预处理一个时间序列数据集 将其形状从二维 数据点 特征 更改为三维 数据点 时间窗口 特征 在这样的视角中 时间窗口 有时也称为回顾 指示作为输入变量来预测下一个时间段的先前时间步长 数据点的数量 换句话说 时间窗口是机器学习算法在对
  • 为什么在Python解释器中输入_会返回True? [复制]

    这个问题在这里已经有答案了 我的翻译行为非常奇怪 gt gt gt True gt gt gt type True
  • NumPy 相当于 Keras 函数 utils.to_categorical

    我有一个使用 Keras 进行机器学习的 Python 脚本 我正在构建 X 和 Y 它们分别是特征和标签 标签的构建方式如下 def main depth 10 nclass 101 skip True output True video
  • 使 Django 内置 send_mail 函数默认使用 html

    我想替换内置发送邮件功能 仅适用于纯文本电子邮件 用我自己的智能发送邮件函数 自动生成 html 和纯文本版本 一切都按我自己的电子邮件的预期进行 在我自己的应用程序中定义 我可以在views py中以这种方式做到这一点 from djan
  • 检索 geodjango 多边形对象的边界框

    如何在 geodjango 中获取 MultiPolygon 对象的边界框 在 API 中找不到任何内容http geodjango org docs geos html http geodjango org docs geos html
  • 使用seaborn绘制简单线图

    我正在尝试使用seaborn python 绘制ROC曲线 对于 matplotlib 我只需使用该函数plot plt plot one minus specificity sensitivity bs where one minus s
  • pygame:使用 sprite.RenderPlain 绘制精灵组的顺序

    我有一个精灵组 需要按一定的顺序绘制 以便其精灵按应有的方式重叠 然而 即使使用运算符模块函数 sorted self sprites key attrgetter y x 对组进行排序 顺序也是错误的 我该如何解决这个问题 直截了当地说
  • Python守护进程:保持日志记录

    我有一个将一些数据记录到磁盘的脚本 logging basicConfig filename davis debug log level logging DEBUG logging basicConfig filename davis er
  • 如何更改 Django allauth 中的“帐户已存在”消息?

    当尝试使用社交帐户登录且已存在使用该电子邮件的帐户时 会显示以下消息 An account already exists with this e mail address Please sign in to that account fir
  • Heroku 与 django 通道的正确 procfile/要求是什么?

    tl dr django 频道应用程序在本地使用 manage py runserver 运行 但不在 heroku 上运行 我是 django 通道的新手 尝试使用 heroku 通道部署一个非常基本的 django 应用程序 我最初使用
  • django jet 中的自定义徽标

    我目前正在尝试对 django 管理面板的皮肤进行一些定制 以使其更符合我们的品牌 目前我们使用 django jet 来美化管理面板 django jet 可以自定义 css html 吗 所有评论都说我应该更改一些 html 文件 但我

随机推荐

  • 怎么利用数据库做分布式共享锁

    一 适用环境 1 数据库集群模式 1主多从 2 单机数据库 3 数据库必须提供行级锁功能 二 原理 cas算法 代码 更新当前值为new updateCurrentValue id new old old 通过id 查到的值 new 期望的
  • 变量交换的四种方式

    可以使用以下方法对两个变量进行交换 方法一 定义一个中间量 define CRT SECURE NO WARNINGS include
  • VUE 项目文件夹上传下载解决方案

    原理 js将大文件分成多分 全部上传成功之后 调用合并接口合成文件 如果传输中断 下次上传的时候过滤掉已经上传成功的分片 将剩余的分片上传 成功之后合并文件 前置条件 获取uoloadId接口 用于标记分片 分片上传接口 合成文件接口 后端
  • matplotlib画图间隔范围等设置

    import matplotlib pyplot as plt from matplotlib pyplot import MultipleLocator 从pyplot导入MultipleLocator类 这个类用于设置刻度间隔 x va
  • Burpsuite教程(一)Burpsuite 火狐谷歌浏览器抓包教程

    文章目录 Web抓包 火狐抓包 谷歌抓包 小技巧 结束 Web抓包 火狐抓包 环境需求 火狐浏览器 代理插件 1 打开测试工具BurpSuite 默认工具拦截功能是开启的 颜色较深 我们点击取消拦截 下图取消拦截状态 数据包可以自由通过 2
  • vue3.0中全局注册组件版本1-官方

    前言 在对vue3 0的使用和学习中 发现了很多和以前不一样的方法 这里聊一聊vue3 0中给我们提供的全局的注册组件方法 官方文档 入口 目录 具体方法介绍 1 前提 返回一个提供应用上下文的应用实例 应用实例挂载的整个组件树共享同一个上
  • iOS字典转成JSON换行符问题

    问题 使用系统框架将字典转成压缩转义后的JSON字符串 发现字符串中带有多个换行符 系统转JSON的方法如下 let json try JSONSerialization jsonObject with validData options
  • 嵌入式开发笔记—关于>>和<<、&和&&和指针

    1 gt gt 和 lt lt 符号 gt gt 可以理解为除以2的几次方 例如a gt gt b相当于a除以2 b 相反 符号 lt lt 可以理解为乘2的几次方 上面描述的只是它们的数字意义 实际上 gt gt 为右移运算符 其运算规则
  • 架构师之我见

    架构师是一个项目组的灵魂人物 他决定着整个系统的技术选型 整体架构以及模块划分 同时还可能担当与领导层的沟通角色 从某种意义上来说 架构师在很大程度上决定着项目的成败与否 正所谓火车跑得快 全靠车头带 很多优秀的架构师都是从一个优秀的开发人
  • C模拟C++静态断言

    百度百科 C 11新特性 静态断言 Static assertions Static assert 在解释 if 和 error 之后被处理 简单的说就是检测代码 不可能 事件的发生 如果真的发生了 在编译期间编译器会报错 表示代码的逻辑存
  • vector数组最大、小值及所在坐标

    在普通数组中 例 a 1 2 3 4 5 6 int maxValue max element a a 6 最大值 int minValue min element a a 6 最小值 int maxPosition max element
  • 学创客机器人编程材料费贵吗_创客教育只是学编程、机器人和3D打印?

    创客 Mak er 创 指创造 客 指从事某种活动的人 创客 本指勇于创新 努力将自己的创意变为现实的人 这个词译自英文单词 Mak er 源于美国麻省理工学院微观装配实验室的实验课题 此课题以创新为理念 以客户为中心 以个人设计 个人制造
  • cavans 详解

    Canvas Color Styles Shadows 属性 fillStyle 设置或者返回填充的颜色 渐进色 strokeStyle 设置或者返回描边的颜色 渐进色 shadowColor 设置或者返回shadows的颜色 shadow
  • KEIL MDK中 warning: #223-D: function "xxx" declared implicitly 解决方法

    今天在EINT的范例里添加了一个函数 即eint c中添加了一个datawrite 的函数 并在主函数main c中调用 编译便警告 warning 223 D function datawrite declared implicitly
  • 详解Shiro认证流程

    详解Shiro认证流程 isAccessAllowed Subject在如何得到 resolveSession doCreateSubject save Subject subject isAuthenticated onAccessDen
  • EditText TextWatch监听简单使用

    TextWatch 接口方法如下 方法执行顺序 beforeTextChanged gt onTextChanged gt afterTextChanged new TextWatcher This method is called to
  • vue 用户列表,请求接口中数据并渲染页面,分页

    参考 vue电商项目实战 哔哩哔哩 bilibili 用户列表 渲染数据 一般数据 1 接口请求数据格式 get方式 传入参数 page rows 2 初始化定义变量 3 联调接口 1 created 2 methods 发送请求 3 接口
  • VulnHub--Me-and-My-Girlfriend-1

    背景 有两个恋人 即Alice和Bob 这对夫妻本来很浪漫 但是自从Alice在一家私人公司 Ceban Corp 工作以来 爱丽丝对鲍勃的态度发生了一些变化是 隐藏 的 而鲍勃 Bob 寻求您的帮助 以获取爱丽丝 Alice 隐藏的内容并
  • MongoDB用户管理授权

    文章目录 1 角色类型 2 注意事项 3 给单个数据库授权 4 给一个用户授权多个数据库 5 其它命令 1 角色类型 数据库用户角色 read readWrite 数据库管理角色 dbAdmin dbOwner userAdmin 集群管理
  • python监控mysql连接数 批量杀进程 解决too many connections问题

    线上django服务偶尔会因为机器访问mysql过多 造成too many connections 问题 导致服务挂掉 之前调大了最大连接数 有点治标不治本 所以今天抽空写个监控mysql连接数的服务 如果连接数超过某个阈值 就杀掉一部分连