Polling SNMP cepat dari perangkat jaringan

Saya termasuk generasi "penggiat jejaring liar" yang pada awal abad ini mulai membangun jaringan dengan berbagai ukuran di ruang angkasa pasca-Soviet. Tidak ada cukup semuanya - uang, pendidikan, spesialis, peralatan ... Tetapi antusiasme dan kepercayaan diri tidak dapat diukur. Mereka membuat jaring dari apa saja, atau dari apa pun yang cukup untuk uang. Saya masih ingat hari ketika saya membeli saklar L2 pertama saya - DES-3526 yang terkenal .





Secara alami, pada titik tertentu ada pertumbuhan kualitatif, dan menjadi perlu untuk memantau seluruh kebun binatang jaringan ini. Ada begitu banyak metode dan perangkat lunak untuk memantau yang bahkan hanya mencantumkannya dan karakteristik singkat akan membutuhkan lebih dari satu artikel.





Sekitar 5 tahun yang lalu saya berusaha untuk menulis ulang modul NMS yang ditulis sendiri di ABillS . Tagihan ditulis dalam bahasa Perl, dan pada saat itu saya "gesit" di dalamnya. Dokumentasi API penagihan sudah cukup bagi saya untuk mentransfer webcam dari PHP ke Perl. Pada awalnya, untuk polling potongan besi secara berkala, saya menggunakan analog dari fping di Perl dan secara terpisah mengambil statistik SNMP. Yang paling menjengkelkan saat bekerja dengan SNMP adalah kelambatan yang mengerikan, dan karena jumlah perangkat yang disurvei meningkat, mereka juga meningkat. Mereka berjuang dengan ini dengan metode yang berbeda: paralelisasi, menambah batas waktu, dan sebagainya.





Sebenarnya, di sini saya ingin membagikan implementasi polling SNMP saya untuk peralatan jaringan. Pustaka SNMP digunakan , yang merupakan bagian dari proyek Net-SNMP . Sejujurnya, kode tersebut bekerja berdasarkan prinsip "pemula yang beruntung" (versi tolerannya adalah "orang bodoh yang beruntung"). Saya menyalin kode dalam beberapa jenis lembaran sabun (saya tidak akan memberikan tautan - saya tidak menemukannya), menyelesaikannya sedikit untuk kebutuhan saya, meluncurkannya dan pada saat pertama bahkan tidak mempercayai mata saya. Observium yang saya gunakan pada saat itu melakukan polling, grid tidak terlalu besar (kurang dari 300 switch), selama lebih dari satu menit, dan dalam empat aliran (saya segera mencatat bahwa minimum sensor digunakan saat polling, jika tidak polling bisa memakan waktu 5 menit). Dan skrip saya melakukan hal yang sama dalam 8-10 detik.





Nah, lalu kodenya sendiri dengan komentar:





use SNMP;

#       ,   @obj_list.
my @obj_list = ('10.0.0.100', '10.0.0.101', '10.0.0.102');

# ,     .
my %snmpparms;
$snmpparms{Version}        = 2;
$snmpparms{Retries}        = 1;
$snmpparms{UseSprintValue} = 0;
$snmpparms{Community}      = 'public';#      :)

#      OID.
my @mibs;
        push @mibs, SNMP::Varbind->new( [ 'sysObjectID', 0 ] );
        push @mibs, SNMP::Varbind->new( [ 'sysName',     0 ] );
        push @mibs, SNMP::Varbind->new( [ 'sysLocation', 0 ] );

#   
my $vb = SNMP::VarList->new(@mibs);

sub nms_poll {
    
    foreach my $obj (@obj_list) {
        my $sess = SNMP::Session->new(
            %snmpparms,
            DestHost  => $obj,
        );
        $sess->get( $vb, [ \&nms_clb, $obj ] );

        &SNMP::MainLoop(2);
    }
    return 1 if $status;
    return undef;
}

#   ,      
sub nms_clb {
    my ( $obj, $vl ) = @_;
    # ,   
    if ( defined $vl->[0] ) {
        &SNMP::finish();
    }
    else {
        
    }

    return ();
}
      
      



, . SNMP::MainLoop:





to be used with async SNMP::Session calls. MainLoop must be called after initial async calls so return packets from the agent will not be processed. If no args suplied this function enters an infinite loop so program must be exited in a callback or externally interupted.





5.04. "" SNMP, . .





Apa yang tertulis jelas tidak menarik artikel, melainkan catatan. Saya menulisnya karena saya merasa kasihan atas perkembangan yang hilang, yang sekarang menjadi tidak perlu. Waktu berlalu, dunia berubah. Penyedia kecil bangkrut, diserap oleh pemain besar, dan beralih ke model agensi. Akibatnya, banyak pengalaman yang terkumpul menjadi tidak berguna. Saya pikir ini tidak benar :)








All Articles