Tại sao Cacti cứ chờ đợi các quy trình pug chết?


11

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.logvà 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.phpbả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.phpxem 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.phpvà đã 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.

nhập mô tả hình ảnh ở đây
bấm vào để phóng to

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 _closehà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 ...

Câu trả lời:


6

Tôi đã điều tra thêm một chút và nhận ra việc đóng kết nối với cơ sở dữ liệu là có chủ ý. Kết nối nên được thiết lập lại cho lần bỏ phiếu tiếp theo. Nhưng nó không phải là.

Đây là một đoạn trích từ 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);
}

Tôi cũng đã kiểm tra db_connect_realvà trên thực tế, nó được gọi sau khi usleephoàn thành. Vì vậy, đó là nơi tôi sẽ tiếp tục đào.

Hiện tại, tôi đã sửa đổi phần như thế này:

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

Bây giờ pug chạy mà không có bất kỳ cảnh báo nào và đồ thị của tôi đang được vẽ. Tuy nhiên, vẫn còn một vấn đề. Không phải tất cả các biểu đồ của tôi đang được vẽ đúng, như có thể nhìn thấy từ hình ảnh sau:

Biểu đồ hiển thị hiển thị kết quả từ cách giải quyết
bấm vào để phóng to

Tôi cho rằng điều này là do pug chạy quá hiếm khi đối với một số nguồn dữ liệu nhất định. Để giải quyết điều đó, tôi chuyển sang cột sống (điều mà tôi muốn làm bằng mọi cách) và đặt nó để sử dụng 4 luồng.

Cấu hình xe đẩy Cacti

Càng xa càng tốt...

Cập nhật

Tôi tìm hiểu sâu hơn về vấn đề này và nghĩ rằng tôi đã sửa nó. Tôi giả định rằng kết nối không được lưu trữ đúng cách sau nỗ lực kết nối lại của pug.

Lần đầu tiên tôi cố gắng giải quyết điều đó có vẻ đầy hứa hẹn, nhưng các biểu đồ kết quả vẫn bị lỗi. Vì vậy, vấn đề nằm sâu hơn.

Cách giải quyết tôi đã phát triển trước đó và trình bày trong câu trả lời này vẫn hoạt động hoàn hảo. Tôi quyết định không đầu tư thêm thời gian cho vấn đề này và ở lại với cách giải quyết. Lấy làm tiếc.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.