blog do Zé

22/7 de 2010

Como visualizar quais Virtual Hosts o Apache está atendendo no momento

Categoria: Linux,Perl,UNIX — jfonseca @ 12:19 am

Caso você administre um servidor Apache com dezenas ou centenas de Virtual Hosts, possivelmente já terá se deparado com picos de visitação que, normalmente, testam os limites do servidor. Caso possua apenas um site hospedado por servidor, esqueça o resto deste artigo. No entanto, na grande maioria dos ambientes de hospedagem, um servidor dedicado terá inúmeros hosts virtuais configurados, e é praticamente impossível saber, desconhecendo a origem do pico de visitação, qual é o responsável pela sobrecarga.

Para resolver este problema criei o seguinte script Perl que, combinado ao tcpdump, analisa o tráfego de rede atual, extraindo os cabeçalhos “Host:” e contando quantas vezes cada Host surge no tráfego capturado. Um handler do sinal SIGALRM imprime ao STDOUT as estatísticas atuais a cada 5 segundos, em ordem decrescente de demanda.

Assim, é possível ver, em tempo real, qual Virtual Host está gerando a maior demanda no servidor naquele instante.

Copie o seguinte script e salve como tcpd_host_filter.pl

#!/usr/bin/perl

# http://zefonseca.com/blogs/ze/

use strict;
use warnings;

our %hosts = ();
our $match_count = 0;

$SIG{ALRM} = \&dump_stats;

alarm(5);

while (<>) {
        if ( m{Host\:\s+(\S+)}gms ) {
                $hosts{$1}++;
                $match_count++;
        }
}

sub dump_stats {
        print "\n\nACTIVE HOSTS\n";
        foreach my $host ( reverse sort { $hosts{$a} <=> $hosts{$b} } keys %hosts ) {
                my $ratio = $hosts{$host} / $match_count;
                printf "%-5d %-32s %.2f %% \n", $hosts{$host}, $host, $ratio*100;
        }
        alarm(5);
}

Torne o script executavel:

chmod 755 tcpd_host_filter.pl

Agora rode o tcpdump com as opções -s 65535, que determina o tamanho máximo de captura, e -w – que escreve todo o conteúdo do pacote capturado à saída padrão.

tcpdump -s 65535 -w - | ./tcpd_host_filter.pl

O script lerá a captura em tempo real, no entanto só imprimirá as estatísticas a cada 5 segundos, para evitar uma inundação de dados na tela.

Exemplo de saída:

ACTIVE HOSTS
120   site1.com             30.61 %
116   site2.com                            29.59 %
74    zefonseca.com                    18.88 %
29    site3.com                        7.40 %
9     site4.com                 2.30 %
8     site5.com               2.04 %
7     site6.com                 1.79 %
7     site7.com                 1.79 %
[ ... ]

 

21/11 de 2009

O Chromium OS é só mais uma distro Linux?

Categoria: Google,Linux,Programação — jfonseca @ 9:58 pm

Há 2 dias, o Google finalmente lançou o código fonte do Chromium OS. Assim com o Chromium é o nome dado ao projeteo OSS do navegador Chrome, o Chromium OS é o código fonte do sistema operacional Chrome OS.

fork.c
/*
* linux/kernel/fork.c
*
* Copyright (C) 1991, 1992 Linus Torvalds
*/

exit.c

/*
* linux/kernel/exit.c
*
* Copyright (C) 1991, 1992 Linus Torvalds
*/

Passeando pelo resto da árvore do kernel do Chromium vemos que é o kernel Linux.


 

4/11 de 2009

Slax: Slackware-like Live CD

Categoria: Linux,UNIX — jfonseca @ 8:55 pm

Slax - Live CD estilo SlackwareHoje baixei minha primeira cópia do Slax, um live CD baseado no Slackware que você quase não percebe se tratar de uma distribuição diferente da oficial.

Após instalar o Slackware 13 em minha máquina principal de trabalho, precisei de um live-CD para meu velho notebook Toshiba. O Slax funcionou perfeitamente com todo o hardware e resolveu meu problema. O download também foi absurdamente rapido, me pergunto se tem mirror no Brasil.

Flashback
Para quem não sabe o Slackware foi uma das primeiras distros Linux do mundo. É a mais antiga ainda em desenvolvimento. Coincidentemente foi a minha primeira distro, lá em 1996, quando o projeto Slackware ainda tinha 3 anos de idade.

Após utilizar o RedHat e posteriormente o Fedora Core, tenho utilizado o Slackware diariamente no trabalho, desde a versão 11. As telas de instalação continuam as mesmas de 10 anos atrás e o “feel” do sistema é o mesmo, você tem que resolver tudo à mão. Foi uma das minhas melhores ferramentas para aprender o Linux lá nos primórdios quando a Internet era cara, lenta e discada.


 

22/10 de 2009

Momento de sarcasmo Finlandês

Categoria: Linux — jfonseca @ 11:16 pm

Linus aprova(?) o windows 7


 

14/5 de 2009

Deu no dia 5/5 na Info: Receita descarta software do IR para Linux

Categoria: Linux,Noticias de Tecnologia — jfonseca @ 3:55 pm

SÃO PAULO – A Receita Federal descartou desenvolver o aplicativo Receitanet para outras plataformas que não Windows, como distribuições Linux e Mac OS.

Ao apresentar o balanço do período de recolhimento do IR este ano, o supervisor da Receita Joaquim Adir classificou como “pouca gente” o número de usuários que baixou a versão do Receitanet – software usado para preencher a declaração de IR – em Java, que funciona tanto em Macs como PCs com Linux.

Leia mais no Info Plantão


 

10/5 de 2009

O Airbus da TAP roda Linux!

Categoria: Linux — jfonseca @ 12:45 am

Avisa pro pessoal da TAP(linha aérea Portuguesa) que é bom atualizar esse kernel do sistema do Airbus ein! O Linux 2.4 foi um release importante, vai ver a TAP manteve porque a árvore 2.4 foi(é?) administrada por um Brazuca(Marcelo Tossati)?

Linux 2.4 a bordo de Airbus da TAP

O que mais me deixou lisonjeado foi um amigo tirar uma foto desse boot do Linux para me mandar! Valeu Fábio!

Outro flagra notável: O Vaticano também roda Linux


 

27/3 de 2009

Para que serve kill -0(kill zero) no UNIX?

Categoria: Linux,UNIX — jfonseca @ 12:45 pm

Encontrei esta dica interessante hoje : o que faz o sinal zero, enviado através do kill -0 no UNIX?

Resposta: nada.

Então para que serve? Para saber se um processo existe.

Ao enviar um kill -0 [PID] o kill retorna 0 (tudo ok) se o processo existe, ou 1 (“erro”) caso contrário. Como diz o post original, é uma forma até elegante de saber se um PID existe à partir de um shell script.


 

16/3 de 2009

Solucionando Segmentation fault no Apache 1.3.41 + mod_perl-1.30 e perl-5.10

Categoria: Dicas para Webmasters,Linux,Perl — jfonseca @ 8:36 pm

Caso tenha instalado o apache_1.3.41 recentemente com mod_perl-1.30 e perl-5.10 você provavelmente(certamente) estará tendo problemas com Segmentation fault no servidor pai. Digo “certamente” porque o release do mod_perl que corrige esse problema com perl 5.10 jamais foi lançado, está parado no Subversion desde Julho de 2007!

Quando completei o upgrade de rotina nos servidores e verifiquei a lista de Segmentation faults, minha primeira suspeita era encima do DBD::mysql > 4.006. Como já tinha apanhado bastante desse problema em Maio de 2008, fúi direto à solução de abaixar o DBD::mysql para uma versão de 2007. Eis que desta vez não funcionou, e lá se foram mais algumas horas na terra do gdb e do Google para descobrir o problema.

Sintoma
[Mon Mar 16 15:39:32 2009] [notice] child pid 24679 exit signal Segmentation fault (11), possible coredump in /usr/local/apache/coredump/
[Mon Mar 16 15:39:34 2009] [notice] child pid 24678 exit signal Segmentation fault (11), possible coredump in /usr/local/apache/coredump/
[Mon Mar 16 15:39:36 2009] [notice] child pid 24673 exit signal Segmentation fault (11), possible coredump in /usr/local/apache/coredump/
[Mon Mar 16 15:40:00 2009] [notice] child pid 24672 exit signal Segmentation fault (11), possible coredump in /usr/local/apache/coredump/
[Mon Mar 16 15:40:02 2009] [notice] child pid 24668 exit signal Segmentation fault (11), possible coredump in /usr/local/apache/coredump/

Nota: o usuário final não percebe nada, pois o core dump acontece após o atendimento do pedido, conforme verificamos com o gdb :

[root@hendrix coredump]# /usr/local/apache/coredump/
[root@hendrix coredump]# gdb /usr/local/apache/bin/httpd core.23794
GNU gdb Red Hat Linux (6.6-45.fc8rh)
Copyright (C) 2006 Free Software Foundation, Inc.
[ .... ]
Core was generated by `/usr/local/apache/bin/httpd -f /usr/local/apache/conf/httpd.conf’.
Program terminated with signal 11, Segmentation fault.
#0 0x084df82c in Perl_av_fill ()
(gdb) where
#0 0x084df82c in Perl_av_fill ()
#1 0×08387682 in perl_shutdown ()
#2 0x0838789a in perl_child_exit ()
#3 0x083a49b8 in ap_kill_cleanup ()
#4 0x083a3291 in ap_init_alloc ()
#5 0x083a3305 in ap_clear_pool ()
#6 0x083b1ecb in ap_call_close_connection_hook ()
#7 0x083b3f57 in sig_coredump ()
#8
#9 0×40000416 in __kernel_vsyscall ()
#10 0x009cba28 in accept () from /lib/libc.so.6
#11 0x083b570a in child_main ()
#12 0x083b5d6b in make_child ()
#13 0x083b6159 in perform_idle_server_maintenance ()
#14 0x083b67e8 in standalone_main ()
#15 0x083b6e93 in main ()

Ou seja, mesmo sem entrar nos detalhes de Perl_av_fill() vemos que a falta ocorreu após diversas “rotinas de limpeza”( *shutdown() *exit() e *cleanup()). Não sabemos ao certo se esse processo do httpd cumpriu sua missão ou foi interrompido precocemente, ou seja, pode estar causando problemas de performance no site abrindo um novo processo httpd a cada Segmentation fault.

Solução
A solução é simples, porém chama a atenção pelo fato de um bug resolvido em meados de 2007 ainda aparecer no ultimo release do mod_perl 1: o mod_perl-1.31 nunca foi lançado, porém a revisão 555908 do mod_perl-1.30 soluciona o problema. Parece que ninguém mais está usando Apache 1.3 a julgar pela idade desse patch.

Baixe primeiro o patch do mod_perl.c aqui. Logo baixe o patch do mod_perl.h aqui.

Vá até a árvore do mod_perl-1.30:
cd mod_perl-1.30/
cd src/modules/perl/
patch -p7 < mod_perl.patch # para aplicar o patch de mod_perl.c (mude mod_perl.patch para o nome que gravou o .patch acima)
patch -p7 < mod_perl_h.patch # para aplicar o patch de mod_perl.h ( novamente adeque o nome do .patch)
cd ../../../
perl Makefile.PL # etc, parametros completos p/ construir o Apache
make
makeinstall

E pronto! Adeus Segmentation faults.

A seguinte discussão deu a solução do problema. Quem explica é Rafael Garcia-Suarez, cuja explicação logo é endossada por Steve Hay, desenvolvedor do mod_perl.

Atualização 17/3 – Se precisar de mod_perl-1.3 e Apache 1.3.* não use Perl 5.10

A versão 5.10 do Perl traz inúmeras melhorias, infelizmente após 24 horas de testes concluí que realmente o apache_1.3.41 + mod_perl-1.30 não estão em grau de produção para funcionar com Perl 5.10. Os segfaults acabaram, mas surgiram diversos novos problemas. Talvez tenham abandonado o desenvolvimento dessas versões, visto que a série 1.3 do Apache não é mais oficialmente suportada(é apenas mantida). Ocorriam problemas difíceis de diagnosticar, por exemplo: ao atingir MaxRequestsPerChild o servidor filho deveria exit(0) e permitir ao pai criar um novo httpd. Acontece que, estranhamente, isso não ocorria. O httpd pai ficava congelado e os filhos apenas aceitavam conexões sem processá-las, não passavam ao próximo handler, tampouco retornavam ao pai. Para o cliente o navegador apenas mostrava eternamente “carregando”…. Poderiam haver incontáveis causas para isso: semaphores que nunca eram liberados(race condition), o patch aplicado acima no cleanup do mod_perl, etc. Infelizmente a necessidade de concluir o trabalho, e a falta de tempo, me impediram de chegar até a raiz do problema – apenas precisava resolver logo! Então partí pro perl-5.8.9 – é preciso compilar o perl, instalar, e depois fazer tudo de novo com o Apache para ele linkar com esta versão do perl. Terminada mais essa jornada, rodei o Apache benchmark (/usr/local/apache/bin/ab) com 10 conexões simultâneas, 1.000.000 requisições – tudo nos conformes, nenhum core dump ou servidor congelado.


 

16/2 de 2009

Debian 5.0 lançado!

Categoria: Linux,Noticias de Tecnologia,UNIX — jfonseca @ 10:47 am

Logotipo oficial DebianVocê já deve ter ouvido falar: o Debian 5.0 foi finalmente lançado no Sábado 14/2.

Confira changelog e release aqui.

Baixe o Torrent do ISO para CD ou DVD aqui.

Ou compre uma distro para ajudar a financiar o desenvolvimento do Debian, clicando aqui.


 

7/10 de 2008

Vida inteligente na blogosfera

Hoje eu tive 2 boas surpresas passeando pela blogosfera. Dois novos blogs que eu nunca pensei que fossem existir, devido à completa falta pretenção de seus autores. Um dos autores eu só conheço pelos livros, e pelos comentários no código fonte do melhor sistema operacional do mundo. O outro é de um amigo e expert em comunicação online que finalmente decidiu acrescentar um blog à sua presença na WWW.

Linus Torvalds, criador do Linux e pesquisador da Linux Foundation criou um blog de “fotos de sua família”, no qual ainda não tem foto alguma publicada. Enquanto isso ele passa o tempo falando daquilo que mais queriamos saber dele : Linux, internet e tecnología. E, por sinal, já começa com um interessante artigo sobre os Intel SSD (“discos” rígidos em estado sólido, ou seja, discos sem discos).

Por falar nisso o sistema operacional Linux completou 17 anos de idade há 2 dias atrás. Foi com este post no grupo comp.os.minix da Usenet que tudo começou.

O jornalista Fernando Zarur lançou O Coletivo, blog onde discutirá suas especialidades : comunicação online, jornalismo, tecnologia e internet. O Coletivo deve estar na mira de quem se interessa por essa poderosa combinação de assuntos. Já entre os primeiros posts fala de um dos assuntos mais relevantes para consumidores modernos: a enchurrada de informação sobre produtos, os beneficios e prejuízos de ter tanta informação na hora de comprar algo tão simples quanto uma câmera digital. Recomendo a todos. ( Conheça também seu tabalho fotográfico)

Taí, é um bom dia pra ler um blog!


  Proxima Pagina »