ক্যাকটি কেন মরা পোলার প্রক্রিয়াগুলির জন্য অপেক্ষা করে রাখে?


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.

298 এর বেশি সময় ধরে চলার জন্য প্রক্রিয়াটি জোরভাবে শেষ না হওয়া পর্যন্ত এটি আরও 4 মিনিটের জন্য চলে।

এ পর্যন্ত সব ঠিকই

এখনও কোন পলারটি চলতে পারে তা নির্ধারণের চেষ্টা করার জন্য আমি ভাল সময় যাচ্ছিলাম, যতক্ষণ না আমি এই সিদ্ধান্তে পৌঁছে যে কেবল কোনও চলমান পেলার নেই

ডিবাগ

poller.phpকীভাবে সেই সতর্কতা জারি করা হয়েছে এবং কেন তা পরীক্ষা করে দেখেছি। 368 লাইনে, ক্যাকটি ডাটাবেস থেকে সমাপ্ত প্রক্রিয়াগুলির সংখ্যা পুনরুদ্ধার করবে এবং কতগুলি প্রক্রিয়া এখনও চলছে তা গণনা করতে সেই মানটি ব্যবহার করবে। সুতরাং, এর যে মানটি দেখুন!

আমি নিম্নলিখিত ডিবাগ কোড এতে যুক্ত করেছি 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.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'"

কিন্তু কেউই এই প্রশ্নের এর মাইএসকিউএল দ্বারা লগ ইন করা হয়। তবুও, যখন আমি আমার নিজস্ব ডাটাবেস ক্যোয়ারী কোড যুক্ত করি, তখন এটি ঠিক আছে।

এখানে চিত্র বর্ণনা লিখুন
সম্প্রসারিত করতে ক্লিক করুন

নরক এখানে কি ঘটছে?

গভীরে খনন...

আমি উপসংহারে এসেছি যে ডাটাবেস সংযোগটি প্রক্রিয়াটির কোথাও হারাতে হবে এবং অ্যাডোব সহজেই যত্ন করে না।

প্রায় কিছু খনন করার পরে, অবশেষে আমি drivers/adodb-mysql.inc.phpফাংশনটিতে 529 লাইনটিতে ডিবাগ বার্তাটি রেখেছি _close। আমি দেখতে চেয়েছিলাম কখন সংযোগটি বন্ধ রয়েছে।

আমি আসলে (অবশেষে) পিএইচপি ডিবাগিং চালু করেছি এবং বুঝতে পারি যে 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 টি থ্রেড ব্যবহার করার জন্য সেট করেছি।

ক্যাকটি পলারের কনফিগারেশন

এ পর্যন্ত সব ঠিকই...

হালনাগাদ

আমি এই ইস্যুটির আরও গভীর খনন করেছি এবং ভেবেছিলাম এটি ঠিক করেছি। আমি ধরে নিয়েছি যে কলারের পুনরায় সংযোগের চেষ্টা করার পরে সংযোগটি সঠিকভাবে সংরক্ষণ করা হয়নি।

সমাধানের জন্য আমার প্রচেষ্টাটি প্রথমে আশাব্যঞ্জক লাগছিল, তবে ফলাফলের গ্রাফগুলি এখনও ত্রুটিযুক্ত ছিল। সুতরাং সমস্যা আরও গভীর।

আমি আগে যে বিকাশ তৈরি করেছি এবং এই উত্তরে উপস্থাপন করা হয়েছে তা এখনও পুরোপুরি কার্যকর। আমি সিদ্ধান্ত নিয়েছি যে এই ইস্যুতে আর কোনও সময় বিনিয়োগ করবেন না এবং কর্মক্ষেত্রের সাথেই থাকবেন। দুঃখিত।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.