मृतक मतदाता प्रक्रियाओं का इंतजार क्यों करता है कैक्टि?


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.

यह 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 द्वारा लॉग नहीं किया गया है। फिर भी, जब मैं अपना खुद का डेटाबेस क्वेरी कोड जोड़ता हूं, तो यह ठीक दिखाई देता है।

यहाँ छवि विवरण दर्ज करें
बड़ा करने के लिए क्लिक करें

यहाँ क्या हो रहा है?

गहरा खोदना...

मैंने निष्कर्ष निकाला कि डेटाबेस कनेक्शन प्रक्रिया में कहीं खो जाना चाहिए और एडोडब बस परवाह नहीं करता है।

इसलिए थोड़ी सी खुदाई करने के बाद, मैंने अंत में डिबग संदेश को 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);
}

अब वोटर बिना किसी चेतावनी के चलता है और मेरे ग्राफ खींचे जा रहे हैं। फिर भी, अभी भी एक मुद्दा है। मेरे सभी ग्राफ़ ठीक से नहीं खींचे जा रहे हैं, जैसा कि निम्नलिखित छवि से देखा जा सकता है:

वर्कअराउंड से परिणाम दिखाने वाला एक रेंडर ग्राफ
बड़ा करने के लिए क्लिक करें

मैंने मान लिया कि यह कुछ डेटा स्रोतों के लिए बहुत कम प्रदूषण के कारण चल रहा है। इसे हल करने के लिए, मैंने स्पाइन पर स्विच किया (जो मैं वैसे भी करना चाहता था) और इसे 4 थ्रेड्स का उपयोग करने के लिए सेट किया।

कैक्टि पोलर कॉन्फ़िगरेशन

अब तक सब ठीक है...

अपडेट करें

मैंने इस मुद्दे पर गहराई से विचार किया और सोचा कि मैंने इसे ठीक कर लिया है। मैंने मान लिया कि कनेक्शन को पोलर के पुन: कनेक्ट करने के प्रयास के बाद ठीक से संग्रहीत नहीं किया गया है।

यह हल करने का मेरा प्रयास पहली बार में आशाजनक लग रहा था, लेकिन परिणामी रेखांकन अभी भी दोषपूर्ण थे। तो समस्या गहरी है।

पहले जो वर्कअराउंड मैंने विकसित किया और इस जवाब में प्रस्तुत किया वह अभी भी पूरी तरह से काम करता है। मैंने इस मुद्दे पर और अधिक समय तक निवेश न करने और वर्कअराउंड के साथ रहने का फैसला किया। माफ़ करना।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.