linux-debian5 DateBase Err: 1040: Too many connections 真正解决方法

阅读更多

问题现象:
今天配置了一台用于数据统计的linux服务器,访问量在200万以上,开始以前配置顺利,域名生效,访问统计链接,出现 DateBase Err: 1040: Too many connections 
 

解决过程
第一反应,修改MYSQL 的参数 max_connections=4087
运行了不到2分钟,服务器平均负载狂飙到>400 瞬间当机,显而易见,连接数加大给服务器带来了巨大压力,可是407的连接数并不算多。
apache 配置有问题?

 
mysql 配置有问题?
查了一边又一遍。。。
原来问题出在PCONNECT
PCONNECT是不会在查询完成后就关闭,而是会等待一定时间,这个时间可以由MYSQL上的wait_timeout设定
而且mysql_close并无法关闭pconnect所开启的连线,只能关闭connect所开启的资料库连线。当然如果没有CLOSE在经过TIMEOUT时间之后也是会被DB DROP掉。
PCONNECT必须要小心使用,在写的不好的CODE中,会残留一大批的DATABASE CONNECTION
最大值可以这样计算每台SERVER的APACHE行程数 * 所有WEB SERVEWR数量,每个连线都会消耗DB的CPU TIME与MEMORY
PCONNECT是傻瓜式的模拟连接池的方法,系统负载会疯狂上升。

解决方法:
修改php.ini参数为
[MySQL]
; 允许或阻止持久连接.
mysql.allow_persistent = Off

修改my.cnf参数为
max_connections = 600 (建议600~1000 一般大于apahce的MaxClients )
wait_timeout = 5
最后上效果图:

两天后:

问题完全解决,关键还是程序员的SQL语句存在问题,昨天程序员优化SQL语句后mysql进程中已经不再出现死锁的问题

之前将一个数据表的类型从myisam(表级别锁定,导致资源无法释放,知道内存消耗殆尽,当机)改成了innodb(记录集级别锁定,不在锁表),问题有所缓解罢了。

你可能感兴趣的:(Linux,MySQL,SQL,Server,SQL,Apache)