<?php

Currently browsing cacti

解决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…
收兵

系统监控配置之cacti+rrdtool+netsnmp

一,安装rrdtool 官网: http://oss.oetiker.ch/rrdtool/

/usr/bin/wget http://oss.oetiker.ch/rrdtool/pub/rrdtool-1.4.2.tar.gz
/bin/tar xzf rrdtool-1.4.2.tar.gz
cd rrdtool-1.4.2
./configure --prefix=/home/rrdtool

提示以下warning信息:
configure: WARNING:
—————————————————————————-
* I found a copy of pkgconfig, but there is no pangocairo.pc file around.
  You may want to set the PKG_CONFIG_PATH variable to point to its
  location.
—————————————————————————-

configure: WARNING:
—————————————————————————-
* I could not find a working copy of pangocairo. Check config.log for hints on why
  this is the case. Maybe you need to set LDFLAGS and CPPFLAGS appropriately
  so that compiler and the linker can find libpango-1.0 and its header files. If
  you have not installed pangocairo, you can get it either from its original home on

     http://ftp.gnome.org/pub/GNOME/sources/pango/1.17

  You can find also find an archive copy on

     http://oss.oetiker.ch/rrdtool/pub/libs

  The last tested version of pangocairo is 1.17.

       LIBS=-lm  -lglib-2.0 
   LDFLAGS= -L/lib64   
  CPPFLAGS= -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include 

—————————————————————————-
               
checking for xmlParseFile in -lxml2… yes
checking libxml/parser.h usability… yes
checking libxml/parser.h presence… yes
checking for libxml/parser.h… yes
configure: error: Please fix the library issues listed above and try again.

信息表明缺了pango的头文件,因此要先安装pango-devel

/usr/bin/yum install pango-devel

接下来重新编译

./configure --prefix=/home/rrdtool

这次编译通过:
Config is DONE!

make && make install

做一个软连接

/bin/ln -s /home/rrdtool/bin/* /usr/local/bin/
cd ..

这样就完成了rrdtool的安装,

 

二,安装net-snmp 官网: http://www.net-snmp.org/

先下载net-snmp的最新版本5.5

/usr/bin/wget http://downloads.sourceforge.net/project/net-snmp/net-snmp/5.5/net-snmp-5.5.tar.gz?use_mirror=nchc
/bin/tar xzf net-snmp-5.5.tar.gz
cd net-snmp-5.5
./configure #一切按照默认值来编译(默认安装到/usr/loca/)
make && make install

运行以下snmpget,检查是否安装成功

/usr/loca/bin/snmpget

我这里就遇到了问题,提示信息是:
/usr/local/bin/snmpget: error while loading shared libraries: libnetsnmp.so.20: cannot open shared object file: No such file or directory
先通过ldd查看snmpget需要加载哪些库

[root@test_server net-snmp-5.5]# /usr/bin/ldd /usr/local/bin/snmpget
        libnetsnmp.so.20 => not found
        libcrypto.so.6 => /lib64/libcrypto.so.6 (0×0000003c1fc00000)
        libc.so.6 => /lib64/libc.so.6 (0×0000003c1d000000)
        libdl.so.2 => /lib64/libdl.so.2 (0×0000003c1d400000)
        libz.so.1 => /usr/lib64/libz.so.1 (0×0000003c1ec00000)
        /lib64/ld-linux-x86-64.so.2 (0×0000003c1cc00000)
可见需要加载的库文件大都放在/lib64/下的;
再查一下libnetsnmp.so.20是在什么位置

/usr/bin/whereis libnetsnmp.so.20
libnetsnmp.so: /usr/local/lib/libnetsnmp.so /usr/local/lib/libnetsnmp.so.20

ok, 至此我们就知道怎么解决问题了:

/bin/ln -s /usr/local/lib/libnetsnmp.so.20 /lib64/libnetsnmp.so.20

再执行一次snmpget

/usr/local/bin/snmpget
Created directory: /var/net-snmp
Created directory: /var/net-snmp/mib_indexes
No hostname specified.
USAGE: snmpget [OPTIONS] AGENT OID [OID]...

  Version:  5.5
  Web:      <a href="http://www.net-snmp.org/">http://www.net-snmp.org/</a>
  Email:    <a href="mailto:net-snmp-coders@lists.sourceforge.net">net-snmp-coders@lists.sourceforge.net</a>

OPTIONS:
  -h, --help            display this help message
...

一切OK

三, 安装cacti 官网: http://www.cacti.net/
值得注意的是cacti的环境需求:
RRDTool 1.0.49 or 1.2.x or greater
MySQL 4.1.x or 5.x or greater
PHP 4.3.6 or greater, 5.x greater highly recommended for advanced features
A Web Server e.g. Apache or IIS

先确认是否满足,然后:

cd ..
/usr/bin/wget http://www.cacti.net/downloads/cacti-0.8.7e.tar.gz
/bin/tar xzf cacti-0.8.7e.tar.gz
/bin/mv cacti-0.8.7e cacti

然后就可以把cacti转移到web目录下

/bin/mv cacti /data/htdocs/cacti
cd /data/htdocs/cacti
/home/mysql/bin/mysql cacti &lt; cacti.sql #导入数据库结构
/bin/chown www:www -R .
/bin/vi include/config.php

修改数据库连接信息:
$database_default = “cacti”;
$database_hostname = “localhost”;
$database_username = “root”;
$database_password = “”;
$database_port = “3306″;

增加后台任务,每两分钟搜集一次数据

*/5 * * * * /usr/local/bin/php /usr/local/apche2/htdocs/cacti/poller.php > /dev/null 2>&1

接下来就从前台访问cacti的安装目录
http://zhys9.com/cacti/install/
按照以下图片中的标红提示完成配置

1

2

3
最后通过默认账号密码: admin/admin 登录,然后系统会提示修改密码;

 

接下来的事情就只是用了 ;)