首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL 案例:"最大连接数"的隐形限制

MySQL 案例:"最大连接数"的隐形限制

原创
作者头像
王文安@DBA
发布于 2020-11-25 08:53:36
发布于 2020-11-25 08:53:36
6.6K0
举报

问题描述

最近遇到一个比较奇怪的问题,用户反馈云服务器的自建 MySQL 连接数没达到的 max_connections 限制,但是程序侧已经开始报错,无法创建新的连接了。程序端报错信息如下:

代码语言:txt
AI代码解释
复制
perationalError(1135, "Can't create a new thread (errno 11); if you are not out of available memory, 
you can consult the manual for a possible OS-dependent bug")

MySQL 侧的错误日志显示:

代码语言:txt
AI代码解释
复制
Can't create thread to handle new connection(errno= 11)

原因分析

如果是触发了最大连接数的限制,错误信息应该是Too many connections,因此这次遇到的问题应该不是参数方面的问题。

值得注意的是,报错信息中显示了 errorno,这个一般是系统层面抛出的异常 Code,因此看一下这个 11 代表的意义:

OS error code 11: Resource temporarily unavailable

那么问题就比较明显了,这个问题是部分资源不可用引起的,说明是收到了外部(即 Linux)的影响才报错的。那么按照用户的环境,搭建了一个沙盒环境,写了一个简单的 python 脚本(参考附录),发现创建的连接数达到一定的数量之后确认会报错,且抛出的异常信息和用户反馈的信息一致:

代码语言:txt
AI代码解释
复制
root@VM-64-5-debian:~# python3 py_conn.py
hello world
OperationalError(1135, "Can't create a new thread (errno 11); if you are not out of available memory, you can consult the manual for a possible OS-dependent bug")
Current MAX_CONNECTION =  32455
5.7.32-log
5.7.32-log
......

在多次尝试过程中,发现一个现象:如果是从 thread_cache 中直接复用的线程是不会触发这个问题的,只有新建连接的时候才会触发。那么追踪了一下 MySQL 创建连接的流程,发现在./sql/conn_handler/connection_handler_per_thread.cc中,以 mysql_thread_create 方法的返回值为条件,会输出这个错误信息。之后以这个方法为入口,最终定位到了原因:调用系统库创建线程的时候出错了。

之后继续查找系统库相关的资料,发现创建线程的数量会受到 Linux 的参数:vm.max_map_count的限制。检查了一下这个参数的作用:

“This file contains the maximum number of memory map areas a process may have. Memory map areas are used as a side-effect of calling malloc, directly by mmap and mprotect, and also when loading shared libraries.

While most applications need less than a thousand maps, certain programs, particularly malloc debuggers, may consume lots of them, e.g., up to one or two maps per allocation.

The default value is 65536.”

简单来说,进程创建线程的时候会创建一些虚拟内存区域,而这个参数限制了这个区域的数量,因此 MySQL 的可创建的连接数也会受到这个参数的限制。

实际测试一下效果:

代码语言:txt
AI代码解释
复制
Session 1:
root@debian:~# sysctl -w vm.max_map_count=256
vm.max_map_count = 256
root@debian:~# service mysql restart
root@debian:~# mysql57
......
Server version: 5.7.32-log MySQL Community Server (GPL)
......
mysql> select count(*) from performance_schema.threads;
+----------+
| count(*) |
+----------+
|       59 |
+----------+
1 row in set (0.00 sec)

mysql> show variables like '%max_conn%';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| max_connect_errors | 100   |
| max_connections    | 151   |
+--------------------+-------+
2 rows in set (0.01 sec)

Session 2:
root@debian:~# python3 py_conn.py
hello world
OperationalError(1135, "Can't create a new thread (errno 11); if you are not out of available memory, you can consult the manual for a possible OS-dependent bug")
Current MAX_CONNECTION =  26
5.7.32-log
5.7.32-log
5.7.32-log
5.7.32-log

可以发现调低了这个系统参数之后,尝试创建连接的时候就会报错,而且可用的最大连接数非常低。

总结一下

这个案例属于比较典型的“受牵连”,即 MySQL 因为外部的限制导致问题的发生,DBA 们在排查问题的时候不仅需要考虑到 MySQL 的问题,也要留意是否是外部原因影响了 MySQL 的行为。

附录

Python3.7,py_conn.py。

代码语言:txt
AI代码解释
复制
import MySQLdb
import time

def dbconn():
    try:
        conn = MySQLdb.connect(host="127.0.0.1",user="root",passwd="root",charset="utf8mb4")
        return conn
    except Exception as e:
        print(repr(e))
        return None

def main():
    print("hello world")
    conn_list = []
    num = 65535
    couter = 0
    for counter in range(0,num):
        conn = dbconn()
        if conn is None : break
        conn_list.append(conn) 
    i = 0
    print("Current MAX_CONNECTION = ",counter+1)
    while(True):
        tmp_conn = conn_list[i]
        cursor = tmp_conn.cursor()
        n = cursor.execute("select version()")
        for row in cursor.fetchall():
            for r in row:
                print(r)
        if (i == counter - 1): i = 0
        i = i + 1
        time.sleep (1)

if __name__ == "__main__":
    main()

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MySQL最大连接数设置
    在使用MySQL数据库的时候,经常会遇到这么一个问题,就是“Can not connect to MySQL server. Too many connections”-mysql 1040错误,这是因为访问MySQL且还未释放的连接数目已经达到MySQL的上限。通常,mysql的最大连接数默认是100, 最大可以达到16384。
allsmallpig
2021/02/25
6K0
记1例MySQL 8.0.15版本Bug引起的风波
2016年09月12日,对于数据库领域来说是一个重要的值得纪念的日子,MySQL第一个DM(development milestone)版本8.0.0发布,这是Oracle收购MySQL后第一次将版本由5系列直接提升为8系列,MySQL 8.0是全球最受欢迎的开源数据库的一个非常令人值得兴奋的新版本,功能、性能全面改进。
用户6543014
2020/05/01
1.6K0
MySQL 修改最大连接数
今天使用ide连接线下MySQL报错Can not connect to MySQL server. Too many connections,报错很明确,与MySQL的连接数满了。想想也是,每起一个服务都会创建MySQL连接池,占用不少的长连接。用ide查看了一下,原来最大连接数才151,看来有必要改大一点了。
星哥玩云
2022/08/16
6.2K0
mysql的最大连接数问题:pymysql.err.OperationalError: (1040, 'Too many connections')
pymysql.err.OperationalError: (1040, 'Too many connections') 超出连接数据库最大连接数所致,修改最大连接数
Python疯子
2018/12/12
6.2K0
使用sysbench压力测试MySQL(二)
昨天有了第一篇的测试之后,仅仅是一个开始。 我接下来做sysbench压测的主要思路是根据现有的配置作出调整,能够持续性的优化和压力测试达到目的,而不是简单的去对比连接数在不同数量级会有多大的差别,所以你会在里面看到一些问题的排查,一些问题的解决,可能有些又不是压测相关的。 压测连接数300跑不上去 我设置了max_connections为3000,但是压测的时候到了300个线程就跑不上去了。这个问题很有典型性。 sysbench抛出的错误如下: FATAL: mysql_stmt_prep
jeanron100
2018/03/21
3.9K0
使用sysbench压力测试MySQL(二)
OpenStack修改数据库最大连接数
查看mysql最大连接数 进入到数据库: show variables like 'max_connections';
院长技术
2020/06/13
1.9K0
[mysql] 查看mysql的最大连接数解决too many connection
当连接数据库报,too many connection的时候 大概是数据库的连接数被占满了 检查哪些服务在长连接占满数据库的连接数,关掉应该就可以了 查看数据库的最大连接数 show variables like '%max_connection%'; 查看所有用户的当前连接 show full processlist;
唯一Chat
2021/09/23
6.9K1
[mysql] 查看mysql的最大连接数解决too many connection
故障分析 | 填坑 TaskMax
先介绍下背景,应用连接数据数执行任务,报 error 1135: Can't create a new thread (errno 11) 错误日志信息如下:
爱可生开源社区
2021/09/08
1.7K0
故障分析 | 填坑 TaskMax
Jmeter测试TCP最大连接数
近期有个需求,需要测试下 SLB 的四层负载均衡性能,即测试 TCP 的最大连接数和连接速度。本次测试我们选择使用 Jmeter。
Python研究所
2022/06/17
4.2K0
Jmeter测试TCP最大连接数
IEE修改最大连接数
# vi /etc/my-ib.cnf  加入配置max_connections = 300
Alfred Zhao
2022/05/06
1.9K0
【译】MySQL挑战:建立10万连接
本文的目的是探索一种在一台MySQL服务器上建立10w个连接的方法。我们要建立的是可以执行查询的连接,而不是10w个空闲连接。
猿哥
2019/03/19
1.1K0
StarRocks配置用户属性,设置单个用户的最大连接数
Error when connecting to server: 1064 Reach limit of connections(FE的连接数达到了上限)
AiDBA宝典
2023/08/09
2.6K0
StarRocks配置用户属性,设置单个用户的最大连接数
MySQL连接错误的十二“坑”
环境准备 自建MySQL环境主机 主机:iZbp1e*****krn92qrx0Z 内网ip: 10.26.254.217 客户端ecs主机 主机:iZbp1e6*****zkrn92qrwzZ 内网ip: 10.24.236.231 说明 说明:mysql的account的组成为’user’@’host’ 常见问题分析 ERROR 1045 (28000) 现象描述 ERROR 1045 (28000): Access denied for user 'testcon'@'10.24.236.231' (
数据和云
2018/03/07
4.3K0
MySQL连接错误的十二“坑”
Python mysql连接池
Python编程中可以使用MySQLdb进行数据库的连接及诸如查询/插入/更新等操作,但是每次连接MySQL数据库请求时,都是独立的去请求访问,相当浪费资源,而且访问数量达到一定数量时,对mysql的
IT架构圈
2018/05/31
6.8K1
MYSQL 连接全部打满后的解决方案, 包含5.7 8.0 (外加一个招聘信息)
MYSQL 的连接被打满,然后就无法提供服务了, 那大部分会有几种解决的方案和方法.
AustinDatabases
2021/03/16
1.1K1
MYSQL  连接全部打满后的解决方案, 包含5.7 8.0  (外加一个招聘信息)
【Python基础】10、MySQLdb
        python访问mariadb|mysql依赖于第三方模块MySQLdb,在pypi上下载下来
py3study
2020/01/15
1K0
openstack中数据库连接数太多--pymysql.err.OperationalError,1040, u'Too many connections'
OperationalError: (pymysql.err.OperationalError) (1040, u'Too many connections')
yaohong
2019/09/11
1.4K0
MySQL最大连接数设置
如果遇见“MySQL:ERROR 1040:Too manyconnec-tions”的情况 一种情况是访问量确实很高,MySQL服务器抗不住,这个时候就要考虑增加从服务器分散读压力了 另外一种情况是
dys
2018/04/02
6.4K0
MySQL最大连接数设置
PostgreSQL修改最大连接数
在使用PostgreSQL的时候,经常会遇到这样的错误提示, sorry, too many clients already,这是因为默认PostgreSQL最大连接数是 100, 一般情况下,个人使用时足够的,但是在生产环境,这个连接数是远远不够的;
每周聚焦
2024/07/25
9520
PostgreSQL修改最大连接数
故障分析 | 一次因为超过最大连接数的登陆限制
在测试某功能时,将 mysql 的最大连接数设置为 120,使用 sysbench 并发 200 插入数据,
爱可生开源社区
2020/07/15
1.9K0
相关推荐
MySQL最大连接数设置
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档