현재 새 데비안 (6.0.5) 서버를 설정하고 있습니다. 나는 어제 그것에 선인장 (0.8.7g)을 넣고 그 이후로 싸우고있다.
초기 문제
내가 관찰 한 초기 문제는 그래프가 업데이트되지 않았다는 것입니다. 그래서 나는 내 것을 확인 cacti.log
하고 메시지와 관련하여 이것을 발견했습니다.
POLLER: Poller[0] Maximum runtime of 298 seconds exceeded. Exiting.
좋지 않아요? 그래서 나는 확인을하고 poller.php
(를 통해 sudo -u www-data php poller.php --force
) 나 자신을 시작 했다 . 많은 메시지 (모든 것이 예상되는 것처럼 보임)를 펌핑 한 다음 잠시 멈 춥니 다. 1 분 후 다음 메시지가 반복됩니다.
Waiting on 1 of 1 pollers.
이 과정은 298 초 이상 실행되도록 프로세스가 강제 종료 될 때까지 4 분 이상 계속됩니다.
여태까지는 그런대로 잘됐다
나는 단순히 실행중인 폴러가 없다는 결론에 도달 할 때까지 어떤 폴러가 여전히 실행 중인지 결정하려고 좋은 시간을 보냈습니다 .
디버깅
나는 poller.php
그 경고가 어떻게 발생하고 왜 발생했는지 확인했다. 368 행에서 Cacti는 데이터베이스에서 완료된 프로세스 수를 검색하고 해당 값을 사용하여 아직 실행중인 프로세스 수를 계산합니다. 그래서 그 가치를 보자!
다음 디버그 코드를 추가했습니다 poller.php
.
$finished_processes = db_fetch_cell("SELECT count(*) FROM cacti.poller_time WHERE poller_id=0 AND end_time>'0000-00-00 00:00:00'");
print "Finished: " . $finished_processes . " - Started: " . $started_processes . "\n";
결과
시작 후 1 초 이내에 다음을 인쇄합니다 poller.php
.
Finished: 0 - Started: 1
Waiting on 1 of 1 pollers.
Finished: 1 - Started: 1
따라서 값을 읽고 유효합니다. 계속 반복되는 부분에 도달 할 때까지 :
Finished: - Started: 1
Waiting on 1 of 1 pollers.
갑자기 가치가 사라졌습니다. 왜? var_dump()
거기에 넣으면 문제가 확인됩니다.
NULL
Finished: - Started: 1
Waiting on 1 of 1 pollers.
반환 값은 NULL
입니다. 쿼리 할 때 어떻게 될 수 SELECT COUNT()...
있습니까? ( SELECT COUNT()
항상 하나의 결과 행을 반환해야합니까?)
더 많은 디버깅
그래서 나는 들어가서 그것을 lib\database.php
보았습니다 db_fetch_cell()
. 약간의 테스트에서 결과 집합이 실제로 비어 있음을 확인했습니다.
그래서 거기에 내 데이터베이스 쿼리 코드를 추가하여 그 기능을 수행했습니다.
$finished_processes = db_fetch_cell("SELECT count(*) FROM poller_time WHERE poller_id=0 AND end_time>'0000-00-00 00:00:00'");
print "Finished: " . $finished_processes . " - Started: " . $started_processes . "\n";
$mysqli = new mysqli("localhost","cacti","cacti","cacti");
$result = $mysqli->query("SELECT COUNT(*) FROM poller_time WHERE poller_id=0 AND end_time>'0000-00-00 00:00:00';");
$row = $result->fetch_assoc();
var_dump( $row );
출력됩니다
Finished: - Started: 1
array(1) {
["COUNT(*)"]=>
string(1) "2"
}
Waiting on 1 of 1 pollers.
따라서 Cacti가 사용하는 방법이 아니라 데이터가 문제없이 액세스 할 수 있습니까?
다시 한번 확인 해봐!
상상하지 못하도록 MySQL 로깅을 활성화했습니다. 물론, 오류 메시지가 반복되면 cacti.log
mad처럼 쿼리하는 것처럼 읽습니다.
06/29/2012 08:44:00 PM - CMDPHP: Poller[0] DEVEL: SQL Cell: "SELECT count(*) FROM cacti.poller_time WHERE poller_id=0 AND end_time>'0000-00-00 00:00:00'"
06/29/2012 08:44:01 PM - CMDPHP: Poller[0] DEVEL: SQL Cell: "SELECT count(*) FROM cacti.poller_time WHERE poller_id=0 AND end_time>'0000-00-00 00:00:00'"
06/29/2012 08:44:02 PM - CMDPHP: Poller[0] DEVEL: SQL Cell: "SELECT count(*) FROM cacti.poller_time WHERE poller_id=0 AND end_time>'0000-00-00 00:00:00'"
그러나 이러한 쿼리 중 어느 것도 MySQL에 의해 기록 되지 않습니다 . 그러나 자체 데이터베이스 쿼리 코드를 추가하면 잘 나타납니다.
도대체 무슨 일이야?
더 깊게 파고 ...
프로세스의 어딘가에서 데이터베이스 연결이 끊어 져야하고 adodb는 신경 쓰지 않는다고 결론지었습니다.
그래서 약간의 파기 후에 마침내 함수의 drivers/adodb-mysql.inc.php
529 행에 디버그 메시지를 넣었습니다 _close
. 언제 연결이 끊어 졌는지보고 싶었습니다.
나는 실제로 (마지막으로) PHP 디버깅을 켜고 mysql_query()
부울 연결 ID (의도적으로 닫힌 연결의 표시 자)로 호출 되었음을 깨달았습니다 .
// returns true or false
function _close()
{
@mysql_close($this->_connectionID);
echo "!!!! CLOSED !!!!\n";
debug_print_backtrace();
$this->_connectionID = false;
}
그게 무엇을 인쇄합니까?
oliver@j27773:/etc/php5/conf.d$ sudo -u www-data php /usr/share/cacti/site/poller.php --force
06/30/2012 01:33:49 AM - POLLER: Poller[0] NOTE: Poller Int: '60', Cron Int: '300', Time Since Last: '61', Max Runtime '298', Poller Runs: '5'
06/30/2012 01:33:49 AM - POLLER: Poller[0] DEBUG: About to Spawn a Remote Process [CMD: /usr/bin/php, ARGS: -q "/usr/share/cacti/site/cmd.php" 0 3]
Finished: 0 - Started: 1
Waiting on 1 of 1 pollers.
Finished: 1 - Started: 1
06/30/2012 01:33:50 AM - POLLER: Poller[0] CACTI2RRD: /usr/bin/rrdtool update /var/lib/cacti/rra/j27773_servers_jiffybox_net_apache_sb_keepalive_100.rrd --template apache_sb_keepalive 1341012829:0
06/30/2012 01:33:50 AM - POLLER: Poller[0] CACTI2RRD: /usr/bin/rrdtool update /var/lib/cacti/rra/j27773_servers_jiffybox_net_apache_reqpersec_95.rrd --template apache_reqpersec 1341012829:.0228409
06/30/2012 01:33:50 AM - POLLER: Poller[0] CACTI2RRD: /usr/bin/rrdtool update /var/lib/cacti/rra/j27773_servers_jiffybox_net_apache_bytesperreq_90.rrd --template apache_bytesperreq 1341012829:13925.7
06/30/2012 01:33:50 AM - POLLER: Poller[0] CACTI2RRD: /usr/bin/rrdtool update /var/lib/cacti/rra/j27773_servers_jiffybox_net_cpu_85.rrd --template cpu 1341012829:1
OK u:0.00 s:0.00 r:1.00
06/30/2012 01:33:50 AM - POLLER: Poller[0] CACTI2RRD: /usr/bin/rrdtool update /var/lib/cacti/rra/j27773_servers_jiffybox_net_hdd_used_80.rrd --template hdd_used:hdd_total 1341012829:924741632:2677886976
OK u:0.00 s:0.00 r:1.00
OK u:0.00 s:0.01 r:1.00
OK u:0.00 s:0.01 r:1.00
06/30/2012 01:33:50 AM - POLLER: Poller[0] CACTI2RRD: /usr/bin/rrdtool update /var/lib/cacti/rra/j27773_servers_jiffybox_net_apache_sb_wait_105.rrd --template apache_sb_wait 1341012829:9
OK u:0.00 s:0.01 r:1.00
OK u:0.00 s:0.01 r:1.00
06/30/2012 01:33:50 AM - SYSTEM STATS: Time:1.1261 Method:cmd.php Processes:1 Threads:N/A Hosts:2 HostsPerProcess:2 DataSources:7 RRDsProcessed:6
Loop Time is: 1.1291718482971
Sleep Time is: 58.867464065552
Total Time is: 1.1325359344482
!!!! CLOSED !!!!
#0 ADODB_mysql->_close() called at [/usr/share/php/adodb/adodb.inc.php:2141]
#1 ADOConnection->Close() called at [/usr/share/cacti/site/lib/database.php:68]
#2 db_close() called at [/usr/share/cacti/site/poller.php:455]
^C06/30/2012 01:33:55 AM - CMDPHP: Poller[0] WARNING: Cacti Master Poller process terminated by user
그리고 나는 그것을 조사하기에 너무 피곤합니다 ...