ทำไม Cacti รอกระบวนการโพลเลอร์ที่ตายแล้ว


11

ขณะนี้ฉันกำลังตั้งค่าเซิร์ฟเวอร์ Debian (6.0.5) ใหม่ ฉันใส่ Cacti (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.

สิ่งนี้จะดำเนินต่อไปอีก 4 นาทีจนกว่ากระบวนการจะสิ้นสุดลงอย่างแข็งขันเพื่อให้ทำงานได้นานกว่า 298 วินาที

จนถึงตอนนี้ดีมาก

ฉันเดินต่อไปเป็นชั่วโมงที่ดีเพื่อพยายามกำหนดว่าโพลเลอร์อาจยังทำงานอยู่หรือไม่จนกว่าฉันจะได้ข้อสรุปว่าไม่มีโพลเลอร์วิ่งอยู่

แก้จุดบกพร่อง

ฉันตรวจสอบ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";

ผลลัพธ์

สิ่งนี้จะพิมพ์สิ่งต่อไปนี้ภายในหนึ่งวินาทีของการเริ่มต้น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อ่านราวกับว่ามันกำลังสืบค้นอย่างบ้าคลั่ง:

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()ถูกเรียกด้วยรหัสการเชื่อมต่อบูลีน (ตัวบ่งชี้ของการเชื่อมต่อที่ปิดโดยเจตนา)

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

ตอนนี้ poller ทำงานโดยไม่มีคำเตือนใด ๆ และกราฟของฉันถูกวาด กระนั้นก็ยังมีปัญหาอยู่ กราฟของฉันบางอันไม่ถูกวาดอย่างที่เห็นจากภาพต่อไปนี้:

กราฟที่แสดงผลแสดงผลลัพธ์จากวิธีแก้ปัญหา
คลิกเพื่อดูภาพขยาย

ฉันคิดว่านี่เป็นเพราะโพลเลอร์ทำงานน้อยเกินไปสำหรับแหล่งข้อมูลบางอย่าง เพื่อแก้ปัญหานั้นฉันเปลี่ยนเป็นกระดูกสันหลัง (ซึ่งฉันต้องการทำต่อไป) และตั้งค่าให้ใช้ 4 เธรด

การกำหนดค่า Cacti Poller

จนถึงตอนนี้ดีมาก ...

ปรับปรุง

ฉันขุดลึกลงไปในปัญหานี้และคิดว่าฉันได้แก้ไขแล้ว ฉันสันนิษฐานว่าการเชื่อมต่อนั้นไม่ได้จัดเก็บไว้อย่างเหมาะสมหลังจากที่พยายามเชื่อมต่อโพลเลอร์อีกครั้ง

ความพยายามของฉันในการแก้ไขที่ดูมีแนวโน้มในตอนแรก แต่กราฟผลลัพธ์ยังคงมีข้อบกพร่อง ดังนั้นปัญหาอยู่ลึก

วิธีแก้ปัญหาที่ฉันพัฒนาก่อนหน้านี้และนำเสนอในคำตอบนี้ยังคงทำงานได้อย่างสมบูรณ์ ฉันตัดสินใจที่จะไม่ลงทุนอีกต่อไปสำหรับปัญหานี้และอยู่กับการแก้ไขปัญหาชั่วคราว ขอโทษ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.