Tôi hiện đang thiết lập một máy chủ Debian (6.0.5) mới. Tôi đã đặt Cacti (0.8.7g) vào ngày hôm qua và đã chiến đấu với nó kể từ đó.
Vấn đề đầu tiên
Vấn đề ban đầu tôi quan sát được là đồ thị của tôi không cập nhật. Vì vậy, tôi đã kiểm tra cacti.log
và tìm thấy thông báo liên quan này:
POLLER: Poller[0] Maximum runtime of 298 seconds exceeded. Exiting.
Điều đó không thể nào tốt được, phải không? Vì vậy, tôi đã đi kiểm tra và bắt đầu poller.php
bản thân mình (thông qua sudo -u www-data php poller.php --force
). Nó sẽ bơm ra rất nhiều tin nhắn (tất cả trông giống như những gì tôi mong đợi) và sau đó treo trong một phút. Sau 1 phút, nó sẽ lặp lại thông báo sau:
Waiting on 1 of 1 pollers.
Điều này diễn ra trong 4 phút nữa cho đến khi quá trình kết thúc mạnh mẽ vì chạy lâu hơn 298 giây.
Càng xa càng tốt
Tôi đã tiếp tục một giờ tốt để cố gắng xác định xem pug nào vẫn có thể chạy, cho đến khi tôi đi đến kết luận rằng đơn giản là không có pug chạy .
Gỡ lỗi
Tôi đã kiểm tra poller.php
xem cảnh báo đó được đưa ra như thế nào và tại sao. Trên dòng 368, Cacti sẽ lấy số lượng các quy trình đã hoàn thành từ cơ sở dữ liệu và sử dụng giá trị đó để tính toán có bao nhiêu quy trình vẫn đang chạy. Vì vậy, hãy xem giá trị đó!
Tôi đã thêm mã gỡ lỗi sau vào 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";
Kết quả
Điều này sẽ in sau đây trong một giây bắt đầu poller.php
:
Finished: 0 - Started: 1
Waiting on 1 of 1 pollers.
Finished: 1 - Started: 1
Vì vậy, các giá trị đang được đọc và có giá trị. Cho đến khi chúng ta đến phần mà nó cứ lặp đi lặp lại:
Finished: - Started: 1
Waiting on 1 of 1 pollers.
Đột nhiên, giá trị biến mất. Tại sao? Đưa var_dump()
vào đó xác nhận vấn đề:
NULL
Finished: - Started: 1
Waiting on 1 of 1 pollers.
Giá trị trả về là NULL
. Làm thế nào có thể được khi truy vấn SELECT COUNT()...
? ( SELECT COUNT()
nên luôn luôn trả về một hàng kết quả, phải không?)
Gỡ lỗi nhiều hơn
Vì vậy, tôi đã đi vào lib\database.php
và đã xem xét điều đó db_fetch_cell()
. Một chút kiểm tra đã xác nhận, rằng tập kết quả thực sự trống rỗng.
Vì vậy, tôi đã thêm mã truy vấn cơ sở dữ liệu của riêng mình vào đó để xem những gì sẽ làm:
$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 );
Điều này sẽ xuất
Finished: - Started: 1
array(1) {
["COUNT(*)"]=>
string(1) "2"
}
Waiting on 1 of 1 pollers.
Vì vậy, dữ liệu có ở đó và có thể được truy cập mà không có bất kỳ vấn đề nào, không phải với phương pháp mà Cacti đang sử dụng?
Kiểm tra kỹ xem!
Tôi đã kích hoạt đăng nhập MySQL để đảm bảo rằng tôi không tưởng tượng mọi thứ. Chắc chắn, khi thông báo lỗi bị lặp, các lần cacti.log
đọc như thể nó đang truy vấn như điên:
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'"
Nhưng không có truy vấn nào trong số này được đăng nhập bởi MySQL. Tuy nhiên, khi tôi thêm mã truy vấn cơ sở dữ liệu của riêng mình, nó sẽ hiển thị tốt.
Cái quái gì đang xảy ra ở đây?
Đào sâu hơn...
Tôi đã kết luận rằng kết nối cơ sở dữ liệu phải bị mất ở đâu đó trong quy trình và adodb đơn giản là không quan tâm.
Vì vậy, sau khi tìm hiểu kỹ, cuối cùng tôi đã đặt thông báo gỡ lỗi vào drivers/adodb-mysql.inc.php
, dòng 529, trong _close
hàm. Tôi muốn xem khi kết nối được đóng lại.
Tôi thực sự (cuối cùng) đã bật gỡ lỗi PHP và nhận ra mysql_query()
đã được gọi với id kết nối boolean (một chỉ báo của kết nối đóng có chủ ý).
// returns true or false
function _close()
{
@mysql_close($this->_connectionID);
echo "!!!! CLOSED !!!!\n";
debug_print_backtrace();
$this->_connectionID = false;
}
Nó in cái gì?
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
Và bây giờ tôi đã quá mệt mỏi để điều tra rằng ...