解决cacti大量sleep连接占用mysql资源的问题
最近发现msyql的进程数经常保持在20个并发连接,感觉非常奇怪。show processlist 之后才发现原来全都是cacti的连接,而且全部是sleep状态。因此考虑到有可能是连接数据库时使用了持久连接,或mysql_connect 的bool new_link 参数为false了。
接下来就有了查找目标,首先进入到cacti程序的根目录。
[root@localhost htdocs]# cd cacti [root@localhost cacti]# grep -r mysql_pconnect . ./lib/adodb/drivers/adodb-mysql.inc.php: $this->_connectionID = @mysql_pconnect($argHostname,$argUsername,$argPassword,$this->clientFlags); ./lib/adodb/drivers/adodb-mysql.inc.php: $this->_connectionID = @mysql_pconnect($argHostname,$argUsername,$argPassword);
接下来再去找./lib/adodb/drivers/adodb-mysql.inc.php文件内查找mysql_pconnect找到所属的方法名。我这里找到的是_pconnect
然后再查找:
grep -rw _pconnect . ./lib/adodb/drivers/adodb-sqlite.inc.php: function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) ./lib/adodb/drivers/adodb-sybase.inc.php: function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) ./lib/adodb/drivers/adodb-oracle.inc.php: function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) ./lib/adodb/drivers/adodb-ado.inc.php: function _pconnect($argHostname, $argUsername, $argPassword, $argProvider='MSDASQL') ./lib/adodb/drivers/adodb-postgres64.inc.php: 27 Nov 2000 jlim - added changes to _connect/_pconnect from ideas by "Lennie" <leen@wirehub.nl> ./lib/adodb/drivers/adodb-postgres64.inc.php: function _pconnect($str,$user='',$pwd='',$db='') ./lib/adodb/drivers/adodb-csv.inc.php: function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) ./lib/adodb/drivers/adodb-mssql.inc.php: function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) ./lib/adodb/drivers/adodb-mysqli.inc.php: function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) ./lib/adodb/drivers/adodb-ibase.inc.php: function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) ./lib/adodb/drivers/adodb-pdo.inc.php: function _pconnect($argDSN, $argUsername, $argPassword, $argDatabasename) ./lib/adodb/drivers/adodb-oci8.inc.php: function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) ./lib/adodb/drivers/adodb-fbsql.inc.php: function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) ./lib/adodb/drivers/adodb-mysql.inc.php: function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) ./lib/adodb/drivers/adodb-ado5.inc.php: function _pconnect($argHostname, $argUsername, $argPassword, $argProvider='MSDASQL') ./lib/adodb/drivers/adodb-odbc.inc.php: function _pconnect($argDSN, $argUsername, $argPassword, $argDatabasename) ./lib/adodb/drivers/adodb-odbc_oracle.inc.php: function _pconnect($argDSN, $argUsername, $argPassword, $argDatabasename) ./lib/adodb/drivers/adodb-odbtp.inc.php: function _pconnect($HostOrInterface, $UserOrDSN='', $argPassword='', $argDatabase='') ./lib/adodb/drivers/adodb-informix72.inc.php: function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) ./lib/adodb/adodb.inc.php: if ($this->_pconnect($this->host, $this->user, $this->password, $this->database)) return true;
这次会找到很多结果 看上去有点无从下手。没关系,看一看文件名就知道了,这些基本上都是针对其他数据库的代码,与msyql无关。
注意,其中的./lib/adodb/adodb.inc.php,没错,这个就是我们要找的。
在该文件内查找包含_pconnect的函数名,只有一个函数:PConnect
再接下来就是查找调用PConnect函数的地方:
[root@localhost cacti]# grep -rw PConnect .
./lib/adodb/adodb-pear.inc.php: if($persist) $ok = $obj->PConnect($dsninfo['hostspec'], $dsninfo['username'],$dsninfo['password'],$dsninfo['database']);
./lib/adodb/drivers/adodb-postgres64.inc.php: // $db->PConnect("host=host1 user=user1 password=secret port=4341");
./lib/adodb/drivers/adodb-postgres64.inc.php: // $db->PConnect('host1','user1','secret');
./lib/adodb/drivers/adodb-odbc.inc.php: ADOConnection::outp("For odbc PConnect(), $argDatabasename is not used. Place dsn in 1st parameter.");
./lib/adodb/adodb.inc.php: var $autoRollback = false; // autoRollback on PConnect().
./lib/adodb/adodb.inc.php: function PConnect($argHostname = "", $argUsername = "", $argPassword = "", $argDatabaseName = "")
./lib/adodb/adodb.inc.php: $ok = $obj->PConnect($dsna['host'], $dsna['user'], $dsna['pass'], $dsna['path']);
./lib/database.php: if ($cnn_id->PConnect($hostport,$user,$pass,$db_name)) {
OK, 这下找到我们的终极目标了:./lib/database.php
打开该文件浏览一遍代码,马上就会发现cacti默认使用的是PConnect, 至于有没有地方可以配置选择 我还不太清楚,因为没有使用长连接的需求,干脆直接改掉这里吧。把PConnect改成Connect,保存退出。
最后就是等待观察,经过十几分钟的观察一切正常了,再也看不到令人厌烦的sleep连接啦~
oh my lady gaga…
收兵