[Cascavel-pm] [OFF-TOPPIC] Consulta Unix
Márcio Lopes
marciolop em yahoo.com.br
Quinta Agosto 17 18:50:19 PDT 2006
Valeu pessoal!!
Incrementei mais um pouco o problema, além de fazer modificações
necessárias.
Acho que estou para ingressar no mundo Perl ou Php.
Vamos ver se melhorou:
Será implementado um script no Digital Unix 4.0f, para fazer a coleta e
carregar dados em tabelas de um Oracle que não está instalado no servidor
Unix (este banco será acessado via DB-Link). Esses dados serão extraídos a
partir da execução de comando Unix (TOP por exemplo).
Teremos um script que fará a coleta e a carga das tabelas.
Esse script deve ser executado de 30 em 30 minutos, só nos servidores que
estão rodando determinado processo (nome do processo = nucleo1).
O comando TOP quando executado exibe os seguintes dados:
load averages: 0.89, 3.06, 3.28 08:42:15
132 processes: 13 running, 68 sleeping, 51 idle
CPU states: 23.8% user, 0.0% nice, 18.0% system, 58.1% idle
Memory: Real: 478M/991M act/tot Virtual: 618M/3072M use/tot Free: 4936K
PID USERNAME PRI NICE SIZE RES STATE TIME CPU COMMAND
11038 root 44 0 508M 9150K sleep 175:54 13.90% acumula
17482 root 42 0 198M 33M sleep 214:11 2.90% iccp
19332 root 44 0 181M 2547K sleep 56:33 2.80% calcnuc
4827 root 42 0 199M 20M run 63:52 2.30% exploracion
9408 root 44 0 6064K 1933K sleep 42:45 1.60% gestred
12316 root 42 0 712M 60M run 44:41 0.60% nucleo
17812 root 42 0 182M 3088K run 14:21 0.60% supervision
122 root 44 0 130M 131K sleep 76.7H 0.40% perroGuardaBIN
824 root 44 0 14M 2318K sleep 20.2H 0.40% Xdec
16914 root 44 0 2944K 671K run 0:00 0.10% top
19381 root 44 0 182M 3252K sleep 2:25 0.10% enlace
2691 root 42 0 198M 13M sleep 0:17 0.10% sinop
8759 root 44 0 5544K 1327K run 19:57 0.00% distbdol
17954 root 42 0 196M 5808K run 4:59 0.00% ggestor
17153 root 42 0 195M 4374K run 4:28 0.00% ggestor
As tabelas que serão carregadas serão as seguintes:
(*) - Primary Key
MEDICAO_SERVIDORES
· Servidor (*)
· DataHora (*)
· CPU_Usuario
· CPU_Nice
· CPU_Sistema
· CPU_Livre
· MEM_Real_Total
· MEM_Real_Ativa
· MEM_Virtual_Total
· MEM_Virtual_Usada
· MEM_Livre
PROCESSOS_SERVIDORES
· Servidor (*)
· DataHora (*)
· Processo (*)
· CPU
· Tamanho
Acho que assim fica mais organizado. Pensei e cheguei neste enunciado.
Melhorou?
Abraços!
Márcio Lopes.
----- Original Message -----
From: "Luis Motta Campos" <monsieur_champs em yahoo.com.br>
To: "Cascavel Perl Mongers" <cascavel-pm em pm.org>
Cc: "Márcio Lopes" <marciolop em yahoo.com.br>
Sent: Thursday, August 17, 2006 7:02 AM
Subject: Re: [Cascavel-pm] [OFF-TOPPIC] Consulta Unix
> Igor, Márcio, aqui tem um rascunho do que eu acho que deveria ser o
> programa.
>
> Márcio, Perl é muito mais flexível para construir este tipo de solução
> do que o SQL*Loader + Shell Script.
>
> Espero que o pessoal da lista ajude completando os brancos do
> programa, eu não tenho tempo para terminar de escrever. Mas não deve ser
> complicado, agora.
>
> Putamplexos, e boa sorte.
>
> Igor Sutton wrote:
> >> 1- Preciso ter em uma tabela Oracle, para consultas (PL/SQL)
> >> eventuais, as
> >> informações de uso de memória, uso de cpu e dos 5 processos que estão
> >> consumindo mais recursos (no momento da coleta) de determinado servidor
> >> Unix;
> >>
> >
> > Perfeito, isso você deve saber melhor que eu :-)
> >
> > 2- A coleta dessas informações deve acontecer em períodos de tempo
> >> determinados (de 30 em 30 minutos, por exemplo);
> >>
> >
> > O cron resolve este problema.
> >
> > 3- Antes de fazer a coleta das informações é necessário saber se um
> > processo
> >> X está rodando no servidor, caso não esteja, não é necessário fazer a
> >> coleta.
> >>
> >
> > Proc::ProcessTable vem a calhar aqui.
> >
> > use List::Util;
> > use Proc::ProcessTable;
> >
> > my $p = Proc::ProcessTable->new;
> >
> > if (first { $_->fname eq 'meuprocesso' } @{$p->table}) {
> > ...
> > }
> >
> > 4- Preciso dispor as informações em colunas (Coleta, Data_Hora, Cpu,
> >> Memória, Processo1, Processo2, Processo3, Processo4, Processo5) da
tabela
> >> Oracle. Por exemplo:
> >> *COLETA* *DATA_HORA* *CPU* *MEMÓRIA* *PROCESSO_1* *PROCESSO_2* *
> >> PROCESSO_3* *PROCESSO_4* *PROCESSO_5* coleta1 15/8/2006 18:30 60% 70% x
y
> >> z a b coleta2 15/8/2006 19:00 50% 80% y a z x b coleta3 15/8/2006 19:30
> >> 70% 85% a b z y x coleta4 15/8/2006 20:00 30% 40% b y x a z
> >>
> >
> > Isso você faz a inserção via DBI (OK, você pode ser mais tosco
executando o
> > binário do Oracle, porém tente o DBI antes). 'perldoc DBI' para esse
caso.
> >
> > 5- A cada coleta devo importar os dados resultantes da mesma, na tabela
> >> Oracle (a cada 30 minutos terei uma nova tupla na tabela).
> >> coleta1 16/8/2006 20:30 50% 60% s j f c k
> >>
> >
> > CPU e Memória são o total sendo utilizado no seu servidor no momento ou
o
> > total utilizado por este cinco processos? Você tem o nome deste cinco
> > processos já?
> >
> > # separamos todos os processos cujo nomes sejam aqueles que queremos
> > my @processos = grep { $_->fname =~ m/^(?:a|b|c|d|e) } @{$p->table};
> >
> > # somamos a cpu utilizada
> > my $cpu_usada = 0;
> > $cpu_usada += $_->pctcpu for (@processos);
> >
> > Caso você não saiba o nome dos processos, você pode verificar o PID do
> > processo que os gera e localizar todos os processos cujo PPID (Parent
PID)
> > sejam igual àquele que você coletou.
> >
> > O grande X da questão é: Como fazer essas coletas e importar essas
> >> informações para a tabela do Oracle (o Oracle está instalado no mesmo
> >> servidor onde será feita a coleta).
> >>
> >
> > No final das contas Proc::ProcessTable e DBI podem fazer exatamente o
que
> > você quer. Se você estiver impedido de utilizar DBI por qualquer motivo,
> > você pode substituí-lo por um pipe para o seu comando 'sql':
> >
> > <code>
> > # veja que eu não sei quais são os parâmetros para o seu programa, porém
> > # você deve utilizá-lo como na linha de comando.
> > open my $sql, "| /usr/bin/sql -Uusuario -Psenha" or die $!;
> >
> > print $sql "INSERT INTO oracle (cpu, memoria, proc1, proc2, proc3,
proc4,
> > proc5) VALUES ($cpu_usada, $memoria_usada, "$proc1", "$proc2", "$proc3",
> > "$proc4", "$proc5");\n";
> >
> > close $sql or warn $!;
> > </code>
> >
> > Saiba que este modo de interação com o banco de dados é um 'quick and
dirty
> > hack', e não deve ser usado como primeiro recurso.
> >
> >
> > ------------------------------------------------------------------------
> >
> > _______________________________________________
> > Cascavel-pm mailing list
> > Cascavel-pm em pm.org
> > http://mail.pm.org/mailman/listinfo/cascavel-pm
>
>
> --
> =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
> Luis Motta Campos is Software Engineer, Oracle OCP/DBA, Un*x
> Sysadmin, Member of {Lisbon,São Paulo,Cascavel,Brasil,London}
> Perl Mongers and Perl Fanatic Evangelist
> =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
>
----------------------------------------------------------------------------
----
> #!/usr/bin/perl
> use warnings;
> use strict;
> use Proc::ProcessTable;
> use DBI;
>
> =head1 NAME read_process
>
> read_process - A command-line utility to account process usage for some
> processes using Oracle database as backend.
>
> =head1 SYNOPSIS
>
> read_process
>
> =head1 DESCRIPTION
>
> This is a command-line utility to account process cpu/memory usage to an
oracle
> database table. It was made on demand to mr. Márcio Lopes, as a first
attempt
> to solve his problem at the company.
>
> =head1 CONFIGURATION
>
> Our script is simple, and we need as less configuration information as we
can.
> The existing configuration is somewhat hard-wired, but it can be easyly
> replaced by a full-expanded configuration object or something like. I
> personally recommend AppConfig.
>
> =head2 Database Configuration Section
>
> =head3 C<driver>
>
> This is the DBI database driver to use on connecting to the database. See
more
> about this in L<DBI> and L<DBD::Oracle>. Default value: 'dbi:Oracle'.
>
> =head3 C<user>
>
> The username to use on connecting to the database. Please replace this
with
> something useful. There is no acceptable default value.
>
> =head3 C<passwd>
>
> This is quite irregular, but this script is meant to run stand-alone,
> unattended, on a cron-tab. So it needs to know a password to authenticate
on
> the database. There is no default value for this configuration key. Please
fill
> in as appropriated.
>
> =head3 C<host>
>
> The database host name. As a matter of flexibility, its possible to run
this
> script on a different machine than the one that holds the database.
Because
> this software is an ethernal information producer, this could be
considered
> useful as the main database fills in and you will need to decide what to
do
> with de information... default: '127.0.0.1' (localhost).
>
> =head2 Processes to Monitor Configuration Section
>
> This section lists the process to monitor and gives any configuration
needed by
> the L<Proc::ProcessTable>.
>
> =head3 C<list>
>
> This is a list of process names that must be monitored.
>
> =cut
>
> our $config = {
> database => {
> driver => 'dbi:Oracle',
> user => 'process_accounter',
> passwd => 's3cr3t',
> host => '127.0.0.1',
> },
> process => {
> list => [],
> }
> };
>
> =head1 FUNCTIONS
>
> =head2 C<connect>
>
> Stablished a connection to the database. Receives a configuration hash as
> parameter. Dies with an error message in case of failure. Returns a
database
> handler in case of success.
>
> =cut
>
> sub connect{
> my $config = shift;
> my $dbh = DBI->connect( q{$config->{driver};host=$config->{host}},
> $config->{user},
> $config->{passwd},
> { AutoCommit => 1, RaiseError => 1 }
> );
> die $DBI:errstr unless $dbh;
> return $dbh;
> }
>
> =head2 C<disconnect>
>
> Cuts off the database connection. This is a good programming practice to
close
> the connections used so the Oracle database can claim the allocated
resources
> back.
>
> Receives the database handler as first parameter. Returns nothing.
>
> =cut
>
> sub disconnect{
> my $dbh = shift;
> $dbh->disconnect;
> }
>
> =head2 C<search_process>
>
> Gets information about the process list you need to monitor. Returns a
hash
> table with the collected information.
>
> Receives a configuration hash as parameter.
>
> =cut
>
> sub search_process{}
>
> =head2 C<write>
>
> Writes the hash table with monitored process information into the
database.
> Receives a database handler as first parameter, and a process information
hash
> as second. Returns success or dies for errors.
>
> =cut
>
> sub write{}
>
> =head1 AUTHOR
>
> Luis Motta Campos is Senior System Engineer at Segula Tenologia e
Engenharia
> Portugal, and serves as part-time Ogre on the Cascavel Perl Mongers and
São
> Paulo Perl Mongers lists.
>
> Mail: monsieur_champs em segula.pt
>
> =head1 LICENSE
>
> This program is free software; you can redistribute it and/or modify it
under
> the terms of the GNU General Public License as published by the Free
Software
> Foundation; either version 2 of the License, or (at your option) any later
> version.
>
> This program is distributed in the hope that it will be useful, but
WITHOUT ANY
> WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A
> PARTICULAR PURPOSE. See the GNU General Public License for more details.
>
> You should have received a copy of the GNU General Public License along
with
> this program; if not, write to the Free Software Foundation, Inc., 51
Franklin
> St, Fifth Floor, Boston, MA 02110-1301 USA
>
> =cut
>
> __END__
>
_______________________________________________________
Você quer respostas para suas perguntas? Ou você sabe muito e quer compartilhar seu conhecimento? Experimente o Yahoo! Respostas !
http://br.answers.yahoo.com/
Mais detalhes sobre a lista de discussão Cascavel-pm