新建连接失败?

关于链接数据库报错: ERROR 1135 (HY000): 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

看到这个信息会有些迷惑,大概就是要么是内存不够了,要么是遇到 OS 的bug了。但是通过free命令查看我们的内存是足够的,难道真的就是OS 的bug ?不会这么巧吧。

既然说的是内存不够了, 猜测有可能是某个资源确实是越到了瓶颈,那么执行ulimit看看呢:

[[email protected] ~]$ ulimit -acore file size          (blocks, -c) unlimiteddata seg size           (kbytes, -d) unlimitedscheduling priority             (-e) 0file size               (blocks, -f) unlimitedpending signals                 (-i) 127405max locked memory       (kbytes, -l) 64max memory size         (kbytes, -m) unlimitedopen files                      (-n) 204800pipe size            (512 bytes, -p) 8POSIX message queues     (bytes, -q) 819200real-time priority              (-r) 0stack size              (kbytes, -s) 10240cpu time               (seconds, -t) unlimitedmax user processes              (-u) 1024        ---->  这里似乎有点猫腻virtual memory          (kbytes, -v) unlimitedfile locks                      (-x) unlimited

到这里可以发现max user processes 这个地方似乎有点小,而我们的DB的连接数恰好达到1024,看起来和这里的限制有很大的关系,而这个限制一般情况下我们是通过 /etc/security/limits.conf这个文件配置的:

[[email protected] ~]$ cat /etc/security/limits.conf |grep -vE ‘^#|^$‘soft nofile 204800hard nofile 204800

通过cat 这个文件后发现并没有限制这么小呢,猜想会不会是limit.d目录下还有另外的配置,从而发现这个目录下还有个隐藏的配置文件90-nproc.conf,打开该文件一看果不其然是有个限制。

[mysql@xxxx ~]$ cat /etc/security/limits.d/90-nproc.conf # Default limit for number of user‘s processes to prevent# accidental fork bombs.# See rhbz #432903 for reasoning.*          soft    nproc     1024

通过修改这个值,然后重启DB后,我们就可以创建更多的连接了。

到此问题已经解决了,那么留下几个问题:

  1. 为什么会是90-nproc.conf 这个文件呢?
  2. 对于一个已经启动的进程如果查看这个进程的资源限制呢?
  3. 如果动态的修改这些限制而不重启进程?
    • 关于为什么会是 90-nproc.conf 这个文件的值会生效? 可以查看Linux 源代码 pam_limits.c,定位 pam_sm_open_session 这个函数。它会先读取limits.conf 文件,然后在看limits.d 目录下是否存在 *.conf 的配置文件,如果有这样的配置文件,那么依次读取进来,覆盖 limits.conf 的相关配置。
retval = parse_config_file(pamh, pwd->pw_name, pwd->pw_uid, pwd->pw_gid, ctrl, pl);if (retval != PAM_SUCCESS || pl->conf_file != NULL)/* skip reading limits.d if config file explicitely specified */    goto out;

/* Read subsequent *.conf files, if they exist. */if (!glob_rc) {/* Parse the *.conf files. */for (i = 0; globbuf.gl_pathv[i] != NULL; i++) {pl->conf_file = globbuf.gl_pathv[i];retval = parse_config_file(pamh, pwd->pw_name, pwd->pw_uid, pwd->pw_gid, ctrl, pl);if (retval != PAM_SUCCESS)        goto out;        }    }
  • 如何得知我们的进程启动时候的资源限制如何? 
    可以通过 ps找到这个进程的PID ,然后 cat /proc/$PID/limits 文件得到进程资源限制
[[email protected]_naruto_192-168-3-59 ~]# cat /proc/25675/limits Limit                     Soft Limit           Hard Limit           Units     Max cpu time              unlimited            unlimited            seconds   Max file size             unlimited            unlimited            bytes     Max data size             unlimited            unlimited            bytes     Max stack size            10485760             unlimited            bytes     Max core file size        unlimited            unlimited            bytes     Max resident set          unlimited            unlimited            bytes     Max processes             102400               102400               processes Max open files            204800               204800               files     Max locked memory         65536                65536                bytes     Max address space         unlimited            unlimited            bytes     Max file locks            unlimited            unlimited            locks     Max pending signals       127405               127405               signals   Max msgqueue size         819200               819200               bytes     Max nice priority         0                    0                    Max realtime priority     0                    0                    Max realtime timeout      unlimited            unlimited            us        
  • 有时候重启进程是个危险的操作,而且不是所以进程都可以随时重启的,那当我们知道这个进程存在资源限制的瓶颈时,怎么通过动态调整这个限制来确保我们的服务正常运行呢? 
    比如通过 /proc/$pid/limits 文件,得知我们的mysql进程存在OS级别的最大连接数限制,像调整一下这个限制可以通过一下步骤来完成:
[[email protected] ~]# ps -ef|grep mysqldmysql    24831    1  0 Aug07 ?        00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf --user=mysqlmysql    25675 24831  0 Aug07 ?        00:00:34 /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql --datadir=/data/mysqldata/data --plugin-dir=/usr/local/mysql/lib/plugin --log-error=/data/mysqldata/data/xxxxxx.err --pid-file=/data/mysqldata/data/xxxxx.pid --socket=/data/mysqldata/mysql.sock --port=xxxx[[email protected] ~]# echo -n "Max processes=204800:204800" > /proc/25675/limits[[email protected] ~]# cat /proc/25675/limits Limit                     Soft Limit           Hard Limit           Units     Max cpu time              unlimited            unlimited            seconds   Max file size             unlimited            unlimited            bytes     Max data size             unlimited            unlimited            bytes     Max stack size            10485760             unlimited            bytes     Max core file size        unlimited            unlimited            bytes     Max resident set          unlimited            unlimited            bytes     Max processes             204800               204800               processes Max open files            204800               204800               files     Max locked memory         65536                65536                bytes     Max address space         unlimited            unlimited            bytes     Max file locks            unlimited            unlimited            locks     Max pending signals       127405               127405               signals   Max msgqueue size         819200               819200               bytes     Max nice priority         0                    0                    Max realtime priority     0                    0                    Max realtime timeout      unlimited            unlimited            us        

修改了这个值后是否真的有效?如何验证?我们可以通过把这个值该小后,然后不断的增加连接数,当连接数达到我们的限制时,看看是否会报错;然后在动态修改这个值,看看连接能否建立。 
mysql 连接可以简单的写个for循环,然后每个连接sleep 2秒钟 for i inseq 150;do mysql -uxxx -pxxxx -Pxxx -h xxxx -e "select sleep(3)" & done

注: 动态的修改了/proc/$pid/limits 值之后,只是临时生效,如果进程重启这个限制又会重新读取配置文件的值,一劳永逸的办法是修改完成进程运行时的限制,然后在修改配置文件的参数。

时间: 2024-08-07 00:09:03

新建连接失败?的相关文章

解决方案—SQL Server 远程连接失败

机房收费系统异地发布的时候,需要保证数据库能够远程连接,但连接的时候通常会报错: 要解决这个问题,首先需要检查SqlServer 的几项设置.(这些设置一般都是系统默认项,不过最好看一下) (一)检查SQL Server是否允许远程链接.以SqlServer 身份验证方式登陆.登录账户sa (二)打开配置管理器,检查微软SQL服务器(MSSQLServer)的TCP/IP协议是否开启. 确保上面设置正确后,进行最后的SQL服务器防火墙设置,(问题大多出在这里) 一.可以直接关闭防火墙,但是这样不

websocket连接失败

websocket连接失败 @(markdown) 最近项目里调试websocket相关的nodejs实现的server,刚接触web开发的小伙伴们对websocket协议不熟悉,遇到问题很容易悲剧.这里只说自己理解的部分以及解决问题的经验吧. 首先,nodeserver用的socketio,于是写了个页面,用js发起websocket握手,发现一直是longpoll,猜测webserver不支持websocket协议,一查果然,haproxy设置的http反向代理.抛弃haproxy,握手成功

Java JDBC连接SQL Server2005错误:通过端口 1433 连接到主机 localhost 的 TCP/IP 连接失败 及sql2008外围服务器

转载:Java JDBC连接SQL Server2005错误:通过端口 1433 连接到主机 localhost 的 TCP/IP 连接失败 错误原因如下: Exception in thread "main" org.hibernate.exception.JDBCConnectionException: Cannot open connection at org.hibernate.exception.SQLStateConverter.convert(SQLStateConver

Java JDBC连接SQL Server2005错误:通过port 1433 连接到主机 localhost 的 TCP/IP 连接失败

错误原因例如以下: Exception in thread "main" org.hibernate.exception.JDBCConnectionException: Cannot open connection at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:99) at org.hibernate.exception.JDBCExceptionHelper.convert(J

com.microsoft.sqlserver.jdbc.SQLServerException: 到主机 的 TCP/IP 连接失败。 java.net.ConnectException: Connection refused: connect

问题描述:最简单的数据库连接报错,到主机  的 TCP/IP 连接失败.(win 7 操作系统) 错误信息: com.microsoft.sqlserver.jdbc.SQLServerException: 到主机  的 TCP/IP 连接失败. java.net.ConnectException: Connection refused: connect package sqlconnect; import java.sql.*; public class sqlconnect { public

【BUG & PROBLEM】mysql远程连接失败

问题描述 今天在云主机上用mysql客户端连接远程数据库,提示连接失败.提示 Host "62.183.38.xx" is not allow to connect the mysql server. Host 是我外网的IP.关闭云主机防火墙和启动mysql服务都无效. 解决方案 之后查了相关网友的资料后,找到原因,是由于mysql默认没有开启远程连接的权限.因此在mysql命令行中开启权限,问题解决! mysql > GRANT ALL PRIVILEGES ON *.* T

mysql客户端授权后连接失败问题

在本地(192.168.1.152)部署好mysql环境,授权远程客户机192.168.1.%连接本机的mysql,在iptables防火墙也已开通3306端口.如下:mysql> select host,user,password from mysql.user;+--------------+-----------------+---------------------------------------------------------+| host              | use

Mac 连接失败,因为 PPP 设置不正确 Mac OS 无密钥方式连接L2TP协议的VPN

实践是检验真理的唯一标准.起先直接照搬命令行结果出错,提示"连接失败,因为ppp设置不正确"怀疑方法不对.Google了国外的文章,结果都是一样的.后来手工打字进去就对了,妈蛋.蛋疼的事情是必须打字 终端命令如下: sudo vi /etc/ppp/options 输入: plugin L2TP.pppl2tpnoipsec 保存退出.在高级中选择通过VPN发送全部流量.

Firefox提示“安全连接失败,您收到了一个无效的证书”的解决方法

当你看到这篇文章的时候,我已经坐上轻轨准备前往某个地方游玩去了,这篇文章实际上是我昨天写好然后用wordpress的定时发布功能发布的,实际上这里大部分文章都是我事先写好然后定时发布的,特别是这个月希望能够保持每天更新一篇文章的频率,一有想法就会赶快记录下来,害怕忘记什么. 在Firefox上搭配AutoProxy/FoxyProxy和goagent穿越的时候需要导入证书,不过我在导入证书后浏览某个网站会有以下提示:(AutoProxy/FoxyProxy对该网站启用) 安全连接失败 连接 XX