Чому кактуси продовжують чекати процесів мертвої пилки?


11

Наразі я налаштовую новий сервер Debian (6.0.5). Я вчора поклав на нього кактуси (0,8,7 г) і з тих пір бився з ним.

Початковий випуск

Первісна проблема, яку я спостерігав, - це те, що мої графіки не оновлювалися. Тому я перевірив своє 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 все ще може працювати, поки я не дійшов висновку, що просто немає запущеного оглядача .

Налагодження

Я перевірив, 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.

Отже, дані є і до них можна отримати без проблем, тільки не з методом, який використовує Кактус?

Перевірте це ще раз!

Я ввімкнув реєстрацію 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);
}

Тепер опитувальник працює без будь-яких попереджень, і мої графіки малюються. І все ж таки проблема є. Не всі мої графіки малюються належним чином, як видно з наступного зображення:

Відображений графік, що показує результати підходу
натисніть для збільшення

Я припускав, що це пов'язано з тим, що опитувальник працює надто рідко для певних джерел даних. Щоб вирішити це, я перейшов на хребет (що я хотів зробити в будь-якому випадку) і встановив його використовувати 4 нитки.

Конфігурація кактусів

Все йде нормально...

Оновлення

Я глибше заглибився в цю проблему і подумав, що я її виправив. Я припустив, що зв’язок належним чином не зберігається після повторної спроби опитувальника.

Моя спроба вирішити це виглядало спочатку багатообіцяючою, але отримані графіки все ще були помилковими. Тож проблема криється глибше.

Проблема, яку я розробив раніше і виклав у цій відповіді, досі працює чудово. Я вирішив більше не вкладати гроші в це питання і залишитися з вирішенням проблеми. Вибачте.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.