Perl threads

И всё прочее, что касается HTML
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
gr0und
проходил мимо
Сообщения: 4
Зарегистрирован: 2009-11-25 23:16:04

Perl threads

Непрочитанное сообщение gr0und » 2012-12-18 19:05:08

Сижу, весь день ломаю голову над сабжем.

Поставили задачу - рисовать графики уровней сигнала с docsis-модемов. Их порядка 400-600 штук, в зависимости от времени суток.
Навалял скрипт, который опрашивает модемы по snmp. Но тут возникла проблема: ip адреса берутся по snmp с CMTS, а она выдает ипы не только онлайн модемов, но и оффлайн - как следствие скрипт работает невозможно долго - вплоть до 15 минут.
Переделал скрипт для опроса модемов только с одной cmts - выходит порядка 3-5 минут. А хочется проводить опрос раз в 5 минут (аля кактус).
Вспомнил про нитки в перле (где-то давно читал, не помню). В гугле нашел несколько статей (вот одна из них).
И тут опять незадача - не работает. Выводит инфу с 1-5 модемов и глохнет. Где я ошибся?

простите за быдлокод, перл начал изучать только сегодня

Код: Выделить всё

#!/usr/bin/perl

use strict;
use warnings;
use diagnostics;
use threads;
use Net::SNMP;

my $cmts_ip = "10.25.0.11";
my $cmts_comm = "public";
my $cmts_ml_oid = ".1.3.6.1.2.1.10.127.1.3.3.1.3";

# RF MAC, ETH MAC, DS SNR, US TX, DS RX, US ID
my @modem_oid = (".1.3.6.1.2.1.2.2.1.6.2",".1.3.6.1.2.1.2.2.1.6.1", ".1.3.6.1.2.1.10.127.1.1.4.1.5.3", ".1.3.6.1.2.1.10.127.1.2.2.1.3.2", ".1.3.6.1.2.1.10.127.1.1.1.1.6.3", ".1.3.6.1.2.1.10.127.1.1.2.1.1.4");

# Get modem list from CMTS
my $cmts_sess = Net::SNMP->session(
-hostname => $cmts_ip,
-community => $cmts_comm,
-version => 2,
) or die ("Connection to CMTS failed");
my $cmts_mlist = $cmts_sess->get_table(
-baseoid => $cmts_ml_oid,
) or die ("Unable to fetch modem list from CMTS");

my %m_list = %$cmts_mlist;

my @temp = %m_list;
my $i;
my @ips_u;
my @ips;

for ($i=1; $i <= $#temp; $i++)
{
        @ips_u = (@ips_u, $temp[$i]);
        $i = $i+1;
}

@ips = sort @ips_u;

my $y;
my @threads;
for ($y=0; $y <= $#ips; $y++)
{
        push @threads, threads->create(\&snmp_query, $ips[$y]);
}

foreach my $thread (@threads)
{
        $thread->join();
}

sub snmp_query
{
        my @data = ("0","0","0","0","0","0");
        my $ip = shift;
        my $modem = Net::SNMP->session(
                -hostname => $ip,
                -community => "public1",
                -version => 2,
                -timeout => 1,
        ) or return;
        my $result = $modem->get_request(
                -varbindlist => \ @modem_oid,
        ) or return;

        $data[0] = uc (substr ($result->{$modem_oid[0]}, 3));
        $data[1] = uc (substr ($result->{$modem_oid[1]}, 3));
        $data[2] = $result->{$modem_oid[2]}/10;
        $data[3] = $result->{$modem_oid[3]}/10;
        $data[4] = $result->{$modem_oid[4]}/10;
        $data[5] = $result->{$modem_oid[5]};
        print ("$y : $ip : \tRF MAC: ".$data[0]." | ETH MAC: ".$data[1]." | ".$data[2]." dB | ".$data[3]." dBmv | ".$data[4]." dBmv | ".$data[5]."\n");
        $modem->close();
}

$cmts_sess->close();

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
gr0und
проходил мимо
Сообщения: 4
Зарегистрирован: 2009-11-25 23:16:04

Re: Perl threads

Непрочитанное сообщение gr0und » 2012-12-20 8:29:44

отвечу сам себе - нитки использую по-другому, заработали.