왜 Cacti는 데드 폴러 프로세스를 계속 대기합니까?


11

현재 새 데비안 (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.logmad처럼 쿼리하는 것처럼 읽습니다.

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.php529 행에 디버그 메시지를 넣었습니다 _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

그리고 나는 그것을 조사하기에 너무 피곤합니다 ...

답변:


6

나는 조금 더 조사하고 데이터베이스에 대한 연결을 닫는 것이 의도적이라는 것을 깨달았습니다. 다음 폴링 실행을 위해 연결을 다시 설정해야합니다. 그러나 그렇지 않습니다.

발췌 내용은 다음과 같습니다 poller.php.

if ($poller_runs_completed < $poller_runs) {
    db_close();
    // Debug message by myself
    echo "RECONNECTING IN " . $sleep_time . "\n";
    usleep($sleep_time * 1000000);
    db_connect_real($database_hostname, $database_username, $database_password, $database_default, $database_type, $database_port);
}

또한 확인 db_connect_real했으며 실제로 usleep완료 후 호출 됩니다. 그것이 내가 계속 파는 곳입니다.

당분간 다음과 같이 섹션을 수정했습니다.

if ($poller_runs_completed < $poller_runs) {
    //db_close();
    // Debug message by myself
    echo "RECONNECTING IN " . $sleep_time . "\n";
    usleep($sleep_time * 1000000);
    //db_connect_real($database_hostname, $database_username, $database_password, $database_default, $database_type, $database_port);
}

이제 폴러가 경고없이 실행되고 내 그래프가 그려집니다. 그러나 여전히 문제가 있습니다. 다음 이미지에서 볼 수 있듯이 모든 그래프가 올바르게 그려지는 것은 아닙니다.

해결 방법의 결과를 보여주는 렌더링 된 그래프
클릭하면 확대

나는 이것이 특정 데이터 소스에 대해 폴러가 거의 실행되지 않기 때문이라고 가정했다. 이를 해결하기 위해 척추 (어쨌든하고 싶었습니다)로 전환하고 4 개의 스레드를 사용하도록 설정했습니다.

선인장 폴러 구성

여태까지는 그런대로 잘됐다...

최신 정보

나는이 문제에 대해 더 깊이 파고 들고 고쳤다 고 생각했다. 폴러를 다시 연결하려고 시도한 후 연결이 제대로 저장되지 않았다고 가정했습니다.

그 문제를 해결하려는 시도는 처음에는 유망 해 보였지만 결과 그래프는 여전히 오류가 있습니다. 따라서 문제는 더 깊습니다.

이전에 개발하여이 답변에 제시된 해결 방법은 여전히 ​​완벽하게 작동합니다. 이 문제에 더 이상 시간을 투자하지 않고 해결 방법을 사용하기로 결정했습니다. 죄송합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.