数据库连接数打满,临时调整系统参数Max processes解决

时间:2024-05-23 20:01:05
 create @2017-12-01    

收到告警:
Problem!!bohai8.8.8.64:3306 MySQL is Down,error nu:1135,err_msg: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,12-01 01:30   主库!

Problem!!bohai8.8.8.28:3306 MySQL is Down,error nu:1135,err_msg: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,12-01 02:02   从库!
 
检查mysql服务并没有down
# ps aux|grep mysqld
root      24576  0.0  0.0 106232  1396 ?        S     2015   0:00 /bin/sh /opt/bohai/mysql/bin/mysqld_safe --defaults-file=my.cnf
mysql     25307 89.9 57.7 58814948 38004792 ?   Sl    2015 1097429:30 /opt/bohai/mysql/bin/mysqld --defaults-file=my.cnf --basedir=/opt/bohai/mysql --datadir=/database/mysql/data --plugin-dir=/opt/bohai/mysql/lib/plugin --user=mysql --log-error=/database/mysql/data/error-log.err --pid-file=/database/mysql/data/mysqld.pid --socket=/opt/bohai/mysql/mysql.sock --port=3306

mysql> show variables like '%conn%';
+-----------------------------------------------+-----------------+
| Variable_name                                 | Value           |
+-----------------------------------------------+-----------------+
| max_connections                               | 6000            |
| max_user_connections                          | 3500            |
 
查看当前连接数:
数据库连接数打满,临时调整系统参数Max processes解决

数据库连接数打满,临时调整系统参数Max processes解决

数据库连接数打满,临时调整系统参数Max processes解决

数据库连接数打满,临时调整系统参数Max processes解决

数据库连接数打满,临时调整系统参数Max processes解决

数据库连接数打满,临时调整系统参数Max processes解决

数据库连接数打满,临时调整系统参数Max processes解决


查看Linux每个用户的最大processes数量
# ulimit -u 
5000

可以从上面看出,用来限制max user processes的数量的。
但是这个user processes是什么呢?
Linux itself has a Max Processes per user limit. This feature allows us to control the number of processes an existing user on the server may be authorized to have
这个ulimit -u是用来限制每个用户的最大processes数量。如果ulimit -u进行了限制那么每个linux用户可以派生出来的process就会被限制再这个数值之内。

# ulimit -a
max user processes              (-u) 5000

查看mysql 进程连接数量
# ps -eLf |grep mysql|wc -l
5473     已经超过5000

原因分析:
xxx瞬间几次把操作系统的最大连接数占满了,后来改了mysql进程的mysql用户连接数好了
昨天xxx上了很多新代码
连接数高峰大于5000,临时改变操作系统用户连接上限解决问题

# cat /database/mysql/data/mysqld.pid
25307
[[email protected] bohai]# cat /proc/25307/limits
Limit                     Soft Limit           Hard Limit           Units       
Max processes             5000                 5000                 processes
Max open files            65535                65535                files     

调整参数:
echo -n 'Max processes=6000:6000' > /proc/25307/limits

这个参数需要在mysqld启动之前调整,如果mysqld已经启动,再动态调整是无效的。(大家都知道stop start mysql是一件比较麻烦的事情,涉及线上业务就更麻烦了)
那么,有没有可以动态调整的方法呢?
echo -n ‘Max processes=SOFT_LIMITS:HARD_LIMITS’ > /proc/`pidof mysqld`/limits   //例 echo -n 'Max processes=10240:10240' > /proc/`8779/limits
通过如上命令就可以动态调整已经存在的mysqld的processes限制了。


修改后:
# cat /proc/25307/limits
Limit                     Soft Limit           Hard Limit           Units       
Max processes             6000                 6000                 processes
Max open files            65535                65535                files     

之前应用链接mysql不进来,报错也是这样处理的。
更多请查褚霸的这篇blog