Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [PERL] Кеширование данных в памяти / 3 сообщений из 3, страница 1 из 1
28.11.2012, 10:08
    #38055853
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PERL] Кеширование данных в памяти
Есть система мониторинга со следующими особенностями:
1. Система позволяет писать собственные скрипты для нестандартных опросов или нестандартных устройств.
2. Результаты опросов сохраняются в источники данных - rrd-файлы (файлы кольцевой БД).
3. Архитектура системы такова, что для каждого источника данных может указываться один скрипт.
4. У нескольких источников данных может быть указан один и тот же скрипт; это удобно для модернизации и доработки скрипта, если он предназначен для устройств конкретного типа.
5. Скрипт может за один вызов опросить все необходимые данные; опрос осуществляется по SNMP и эффективнее один раз подключиться и получить десять параметров, чем подключаться десять раз и получать по одному параметру.
6. Однако система устроена так, что она будет вызывать этот скрипт для каждого источника данных.
7. Проблему можно решить тем, что будет использоваться один rrd-файл, в который сохраняются все опрашиваемые данные.
8. Однако использование таких комплексных rrd-файлов неудобно в обслуживании — если вдруг нужно изменить структуру файла (добавить новое поле или изменить существующие), нет инструментов для таких операций, необходимо пересоздавать файл с потерей данных. Поэтому для удобства обслуживания лучше использовать несколько rrd-файлов вместо одного.

У меня такая мысль.
2. Скрипт опрашивает устройство, получает необходимые данные. Эти данные он отдает в систему, а также сохраняет их во временный файл, добавив временную метку (timestamp).
1. При запуске скрипт проверяет наличие временного файла и актуальность временной метки; если данные в файле не старше определенного времени (60 секунд), то вместо выполнения пункта 2 скрипт использует данные из временного файла.

Собственно такая схема работает, но можно ли обойтись вообще без временного файла?
Между опросами скрипт не существует; на каждый опрос запускается инстанс Perl с указанным скриптом.
________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
28.11.2012, 12:51
    #38056161
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PERL] Кеширование данных в памяти
Вопрос.
Похоже что разные инстансы скрипта запускаются одновременно и проверка по файлу не срабатывает.
Что-то даже не соображу, как можно это обойти. Случайную задержку при запуске пробовал сделать, но способ не самый лучший.
Сейчас код такой:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
my $host = shift;
my $snmp_version = shift||'';
my $snmp_community = shift||'';

my $delay = (-e "/tmp/~snmp_query" ? 1 : 0);
if ($delay) {sleep 5} else {open FLAG, ">/tmp/~snmp_query"; print FLAG ""; close FLAG;}
unlink "/tmp/~cacti_cisco_query" if (-e "/tmp/~snmp_query" && !$delay);

my $cache = "/tmp/~snmp_query-$host.dat";
my $output;
if (-e $cache)
{
  open CACHE, "<", $cache;
  my $data = <CACHE>;
  if ($data)
  {
    chomp $data;
    my $time = substr($data,0,index($data,' '));
    $data = substr($data,index($data,' ')+1);
    $output = $data . " cache:1" if ((time - $time) < 60);
  }
  close CACHE;
}

unless ($output)
{
  my $snmp = Net::SNMP->session(-hostname=>$host, -version=>$snmp_version, -community=>$snmp_community, -translate=>[-timeticks=>0x00])
    or die "SNMP-connect to $host failed!";
  my $res = $snmp->get_request(-varbindlist=>[values(%oid)]);
  $snmp->close();
  ...
  $output = join(' ',map {$_.':'.($val{$_}||'U')} sort(keys(%val)));
  open CACHE, ">", $cache;
  print CACHE time . " " . $output;
  close CACHE;
}

print $output;
...
Рейтинг: 0 / 0
28.11.2012, 15:21
    #38056488
madbear
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PERL] Кеширование данных в памяти
Код: perl
use Pid::File::Flock;
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [PERL] Кеширование данных в памяти / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]