Erlang: system_info pode te dizer coisas legais

Ontem à noite, antes da sessão pão de queijo com chá mate aqui em casa, resolvi brincar um pouco com uns módulos de baixo nível de Erlang, porque de manhã havia me lembrado de um post bem legal, de um cara chamado Krzysztof Kliś, que li no ano passado. (Aliás, aproveitei e colei o código dele no meu gist, pra favorecer a leitura com syntax highlighting.)

Bem, dessa brincadeira saiu o módulo system_info, que você pode conferir no meu GitHub, no projeto de estudo getting_system_info.

O que ele faz?

Basicamente, ele oferece informações de load da máquina, quantidade de processos rodando e uso de memória do nó atual ou do cluster. Você pode ter mais detalhes sobre o formato dessas informações dando uma olhada nos testes do projeto.

Qual a utilidade disso?

Como disse, escrevi esse código depois de me lembrar do post do Krzysztof Kliś sobre seu load balancer [de apenas 48 linha]. Escrevi por pura diversão.

Mas, sim, se amanhã ou depois eu precisar escrever algum load balancer ou aplicativo que monitore load, processos e memória do meu cluster, ele poderá me servir de helper.

Dá pra testar e ver se funciona?

Sim, a menos que você seja usuário de Windows. Não, não é preconceito, é que algumas funções que uso não estão disponíveis pra Windows, apenas pra sistemas operacionais Unix-like.

Você pode fazer isso de duas maneiras:

1- Rodando os testes

Clone o projeto – o único problema é que você vai levar uma porção de outros projetos de brinde. I’m sorry! – e em seu diretório raíz, compile e rode os testes.

$ ./compile.sh
$ ./test.sh

Só que dessa maneira você não consegue ver nenhuma informação útil. Vamos à segunda maneira.

2- Rodando as funções no Eshell

Depois de devidamente clonado e compilado, crie um cluster com três nós. (Se não souber como a arquitetura de cluster de runtimes Erlang funciona, tenho um post introdutório pra você.)

Na raíz do projeto:

a. Inicie três nós, um em cada terminal

$ erl -sname n1 -pa ebin/
$ erl -sname n2 -pa ebin/
$ erl -sname n3 -pa ebin/

b. No n1, estabeleça conexão entre os nós

(n1@codezone)1> net_kernel:connect('n2@codezone').
(n1@codezone)2> net_kernel:connect('n3@codezone').

Agora, todos os três nós estão conectados uns aos outros, já que, por padrão, os nós compartilham suas conexões uns com os outros.

c. Ainda no n1, verifique as informações de system_info

(n1@codezone)3> system_info:node_load().
(n1@codezone)4> system_info:cluster_load().
(n1@codezone)5> system_info:node_processes().
(n1@codezone)6> system_info:cluster_processes().
(n1@codezone)7> system_info:node_memory().
(n1@codezone)8> system_info:cluster_memory().

Agora, sim, você tem informações a valer!

Gostou?

Espero que sim, porque system_info pode te dizer coisas legais. =)

{ 5 comments to read ... please submit one more! }

  1. kra otimo post… tava procurando uma forma de conectar os nos net_kernel:connect(‘n2@codezone’). agora consegui…:D

  2. Obrigado! :)

    Você também pode fazer ping-pong pra conectar os nós:

    (node1@machine1.com) 1> net_adm:ping(‘node2@machine2.com’).

    Se retornar pong, é porque conseguiu encontrar o nó; caso contrario, o retorno é pang. E aqui mora o detalhe: uma vez tendo conseguido pingar um nó, automaticamente passa a existir conexão entre eles.

    []

  3. …só pra dizer que ping-pong é mais para funções administrativas, do tipo “saber se o nó está de pé e respondendo”. Para estabelecer conexão e trocar mensagens, o ideal mesmo é net_kernel:connect. É mais semantico. ;)

  4. Olá, gostaria de saber como é que faz para construir uma função que recebe duas listas que não contenham elementos repetidos e retorna uma nova com todos os elementos das duas listas originais (sem repetição), implementada em linguagem Erlang ??

    Ex:
    uniao([3 6 5 7],[2 9 7 5 1]) ==> [3 6 5 7 2 9 1]

  5. Oi Lima… Trabalho de escola?

{ 0 Pingbacks/Trackbacks }

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>