Kaktüsler neden ölü poller süreçlerini beklemeye devam ediyor?


11

Şu anda yeni bir Debian (6.0.5) sunucusu kuruyorum. Dün üzerine Kaktüsler (0.8.7 g) koydum ve o zamandan beri onunla mücadele ediyorum.

İlk sayı

Gözlemlediğim ilk sorun, grafiklerimin güncellenmediğiydi. Bu yüzden kontrol ettim cacti.logve şu mesajı buldum:

POLLER: Poller[0] Maximum runtime of 298 seconds exceeded. Exiting.

Bu iyi olamaz, değil mi? Bu yüzden kontrol etmeye gittim ve poller.phpkendime (üzerinden sudo -u www-data php poller.php --force) başladım . (Hepsi beklediğim gibi görünüyor) bir sürü mesaj dışarı pompalayacak ve daha sonra bir dakika asmak olacak. Bu 1 dakikadan sonra aşağıdaki mesajı gönderir:

Waiting on 1 of 1 pollers.

Bu, işlem 298 saniyeden daha uzun süre çalışmak için zorla sona erene kadar 4 dakika daha devam eder.

Çok uzak çok iyi

Çalışan polerin olmadığı sonucuna varıncaya kadar hangi polerin hala çalıştığını belirlemeye çalışırken iyi bir saat geçirdim .

Hata ayıklama

poller.phpBu uyarının nasıl verildiğini ve nedenini kontrol ettim . 368. satırda, Cacti bitmiş işlemlerin sayısını veritabanından alır ve kaç tane işlemin hala çalıştığını hesaplamak için bu değeri kullanır. Öyleyse, bu değeri görelim!

Aşağıdaki hata ayıklama kodunu ekledim 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";

Sonuç

Bu işlem, bir saniye içinde aşağıdakileri basacaktır poller.php:

Finished: 0 - Started: 1
Waiting on 1 of 1 pollers.
Finished: 1 - Started: 1

Böylece değerler okunuyor ve geçerli. Dönmeye devam ettiği kısma gelene kadar :

Finished:  - Started: 1
Waiting on 1 of 1 pollers.

Aniden, değer kayboldu. Neden? Buraya koymak var_dump()sorunu doğrular:

NULL
Finished:  - Started: 1
Waiting on 1 of 1 pollers.

Dönüş değeri NULL. Sorgularken bu nasıl olabilir SELECT COUNT()...? ( SELECT COUNT()her zaman bir sonuç satırı döndürmeli, değil mi?)

Daha fazla hata ayıklama

Böylece içeri girdim lib\database.phpve bir göz attım db_fetch_cell(). Biraz test doğrulandı, sonuç kümesinin gerçekten boş olduğunu.

Bu yüzden ne yapacağını görmek için orada kendi veritabanı sorgu kodumu ekledi:

$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 );

Bu çıktı

Finished:  - Started: 1
array(1) {
  ["COUNT(*)"]=>
  string(1) "2"
}
Waiting on 1 of 1 pollers.

Yani, veriler var ve Cacti'nin kullandığı yöntemle sorunsuz bir şekilde erişilebilir mi?

Tekrar kontrol edin!

MySQL günlük kaydını bir şeyleri hayal etmediğimden emin olmak için etkinleştirdim. Elbette, hata mesajı döngüye girdiğinde, cacti.logdeli gibi sorgulanıyormuş gibi okur:

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'"

Ancak bu sorguların hiçbiri MySQL tarafından kaydedilmez. Yine de, kendi veritabanı sorgu kodumu eklediğimde, gayet iyi görünüyor.

resim açıklamasını buraya girin
Büyütmek için tıklayın

Burada neler oluyor?

Daha derin kazmak ...

Ben veritabanı bağlantısı sürecinde bir yerde kaybolması gerektiği sonucuna vardım ve adodb sadece umurumda değil.

Biraz kazdıktan sonra, sonunda hata ayıklama mesajını drivers/adodb-mysql.inc.php529 satırına _closeişleve yerleştirdim. Bağlantının ne zaman kapandığını görmek istedim.

Aslında (nihayet) PHP hata ayıklama açık ve mysql_query()bir boolean bağlantı kimliği (kasıtlı olarak kapalı bir bağlantı göstergesi) ile çağrıldı fark etti .

// returns true or false
function _close()
{
    @mysql_close($this->_connectionID);
    echo "!!!! CLOSED !!!!\n";
    debug_print_backtrace();
    $this->_connectionID = false;
}

Bu ne yazdırıyor?

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

Ve şimdi bunu araştırmak için çok yorgunum ...

Yanıtlar:


6

Biraz daha araştırdım ve veritabanına bağlantının kasıtlı olarak gerçekleştiğini fark ettim. Bir sonraki sorgulama çalışması için bağlantı yeniden kurulmalıdır. Ama değil.

İşte bir alıntı 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);
}

Ben de kontrol ettim db_connect_realve aslında usleeptamamlandıktan sonra çağrıldı . Böylece kazmaya devam edeceğim yer burası.

Şimdilik, bölümü şu şekilde değiştirdim:

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);
}

Şimdi poller hiçbir uyarı yapmadan çalışıyor ve grafiklerim çiziliyor. Yine de hala bir sorun var. Aşağıdaki görüntüden görülebileceği gibi, grafiklerimin tamamı düzgün çizilmiyor:

Geçici çözümden elde edilen sonuçları gösteren bir grafik
Büyütmek için tıklayın

Bunun, polerin belirli veri kaynakları için çok nadir çalışmasından kaynaklandığını varsaydım. Bunu çözmek için, omurgaya geçtim (yine de yapmak istedim) ve 4 iplik kullanmaya ayarladım.

Kaktüsler poller yapılandırması

Çok uzak çok iyi...

Güncelleme

Bu konuyu daha derinlemesine araştırdım ve çözdüğümü düşündüm. Polerin yeniden bağlanma girişiminden sonra bağlantının düzgün kaydedilmediğini varsaydım.

Bunu çözme girişimim ilk başta umut verici görünüyordu, ancak sonuçta ortaya çıkan grafikler hala hatalıydı. Yani sorun daha derinlerde yatıyor.

Daha önce geliştirdiğim ve bu cevapta sunduğum geçici çözüm hala mükemmel. Ben bu konuda daha fazla zaman yatırım ve geçici çözüm kalmaya karar verdi. Afedersiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.