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

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

Собственно такая схема работает, но можно ли обойтись вообще без временного файла?
Между опросами скрипт не существует; на каждый опрос запускается инстанс Perl с указанным скриптом.
________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
[PERL] Кеширование данных в памяти
    #38056161
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос.
Похоже что разные инстансы скрипта запускаются одновременно и проверка по файлу не срабатывает.
Что-то даже не соображу, как можно это обойти. Случайную задержку при запуске пробовал сделать, но способ не самый лучший.
Сейчас код такой:
Код: 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
[PERL] Кеширование данных в памяти
    #38056488
madbear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: perl
use Pid::File::Flock;
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [PERL] Кеширование данных в памяти
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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