sexta-feira, 13 de julho de 2012

Recuperando vários arquivos deletados - Sleuth


Em 2010 postei sobre como recuperar arquivos deletados usando a ferramenta Sleuth, confira aqui o post. O procedimento utilizado foi para recuperar alguns arquivos deletados, tornando inviável na recuperação de vários arquivos. Neste post vou compartilhar um script para recuperar vários arquivos:

#!/bin/bash
DISK=/dev/sdb1 # disco alvo
RESTOREDIR=/home/kyle/recovery # diretório para recuperar os arquivos
mkdir -p "$RESTOREDIR"
cat $1 |
while read line; do
filetype=`echo "$line" | awk {'print $1'}`
filenode=`echo "$line" | awk {'print $3'}`
filenode=${filenode%:}
filenode=${filenode%(*}
filename=`echo "$line" | cut -f 2`
echo "$filename"
if [ $filetype == "d/d" ]; then
mkdir -p "$RESTOREDIR/$filename"
else
mkdir -p "$RESTOREDIR/`dirname $filename`"
icat -f ext -r -s "$DISK" "$filenode" \
> "$RESTOREDIR/$filename"
fi
done

Para usar o script salve no diretório /usr/local/bin/ e depois mude as permissões.
$ sudo chmod a+x /usr/local/bin/restore
$ sudo /usr/local/bin/restore ~/recovery/deletados.txt

O arquivo deletados.txt tem que ser gerado com o comando:
$sudo fls -f ext -d -r -p /dev/sdb1 > ~/recovery/deletados.txt

Bom Proveito.

terça-feira, 3 de julho de 2012

Squid: Considerações para um melhor desempenho



1 - Dicas antes de particionar

Quanto melhor otimizarmos o acesso a disco mais rápido será nosso proxy, adquira HD com alta velocidade (RPM) e siga essas dicas que irão ajudar no desempenho do squid:

Considere:

- Utilizar um hd somente para cache;
- Tenha muita memória RAM (o squid consome muita memória para rodar bem e ter um bom aproveitamento);
- Utilize um filtro de conteúdo externo, não use o squid para tal fim.

a) Deixe acima de 20% de espaço livre na partição contendo seu cache, o desempenho do sistema de arquivos degrada muito se o espaço utilizado excede 80%.

 b) Qual sistema de arquivo devo usar

Veja nos testes realizados no item 7 qual sistemas de arquivo teve maior desempenho na leitura e escrita no disco.

 c) O linux guarda algumas informações sobre os arquivos no sistema, como: data, hora de último acesso, ultimas modificações etc. Como o squid possui o seu próprio timestamp, de nada serve para o squid o timestamp do sistema de arquivos do SO. Para desabilitarmos essa opção na partição utilizada como cache do squid devemos utilizar o parâmetro "noatime".


2 - Utilização de RAID 0

Oferece melhor desempenho comparado a discos individuais.

Veja:

http://pt.wikipedia.org/wiki/RAID#RAID_0_Striping
http://www.youtube.com/watch?v=aIq9olTCwRA
http://www.youtube.com/watch?v=kEdV52HQ4Q8&feature=related
http://www.youtube.com/watch?v=Uwie0rJSYiE


3 - Configurando cache_mem e cache_dir

cache_mem: este parâmetro não especifica o tamanho máximo do processo do squid, ele apenas limita a quantidade de memória que o squid deve usar para os objetos.

obs: quanto maior o cache_mem maior será o uso de memória do processo do squid

cache_dir: tamanho do cache usado no disco pelo squid, digamos que você tem uma partição de 100 GB não use acima de 80 GB para o cache.

Tenha em mente:

 - O squid usa 10 MB de RAM para cada GB do cache_dir => 1 GB cache_dir = 10 MB RAM
 - Mais o valor de cache_mem
 - Um adicional de 10 a 20 MB

Levando em consideração o que foi dito vamos calcular o valor que devemos configurar no cache_(dir e mem).

Segue abaixo as configurações da máquina fictícia:

 - HD de 320 GB
 - RAM de 4 GB

DICA: pare o serviço do squid e veja quanto de memória seu sistema consome, para este tutorial vamos dizer que o sistema sem o squid consome 500 MB de memória, então vamos dar mais 500 MB de folga, ficando apenas 3 GB para ser usado pelo squid.

exemplo 1:

cache_dir = 320 GB (3200 MB de RAM)
cache_mem = 3 GB = 3000 MB

somando: 3200 + 3000 + 20 = 6220 MB de RAM

Com o exemplo acima o squid precisaria de 6 GB de RAM, então ultrapassa os 3 GB. Quanto maior for o cache_dir mais memória será necessário. Neste caso precisamos abaixar o cache_dir e o cache_mem ou comprar mais memória.


exemplo 2: vamos baixar só o cache_mem

cache_dir = 320 GB (3200 MB de RAM)
cache_mem = 2 GB = 2000 MB

somando: 3200 + 2000 + 20 = 5220 MB de RAM


exemplo 3: vamos baixar o cache_mem e dir

cache_dir = 140 GB (1400 MB de RAM)
cache_mem = 1,4 GB = 1400 MB

somando: 1400 + 1400 + 20 = 2820 MB de RAM

Neste exemplo o squid usaria 2820 MB de RAM, já que temos 3 GB podemos usar esses valores.


4 - File Desciptors

Segue abaixo alguns links que tratam sobre o problema alertado como "WARNING! Your cache is running out of filedescriptors".

http://en.wikipedia.org/wiki/File_descriptor
http://squid.sourceforge.net/hno/linux-lfd.html
http://www.cyberciti.biz/faq/squid-proxy-server-running-out-filedescriptors/
http://nixcraft.com/getting-started-tutorials/5569-squid-increasing-file-descriptor-debian.html
http://www.cyberciti.biz/faq/linux-increase-the-maximum-number-of-open-files/
http://paulgoscicki.com/archives/2007/01/squid-warning-your-cache-is-running-out-of-filedescriptors/
http://goo.gl/vX8ag
http://goo.gl/vVeP9

5 - Mudando alguns parâmetros

cache_store_log none: o store.log possui informações como: arquivos removidos do cache, objetos salvos e o tempo que estão no cache. Não existe nenhuma utilidade habilitando o store.log.

maximum_object_size_in_memory: objetos maiores do que este valor não ficarão na memória, este valor deverá ser auto o suficiente para manter os objetos mais acessados na memória.

maximum_object_size: objetos maiores do que este valor não ficarão no cache do disco, se você pretende cachear arquivos grandes, como atualizações do windows, aumente este valor para 102400 (100MB).

pipeline_prefetch on: para melhorar o desempenho de requisições e fila, o Squid irá trabalhar com 2requisições paralelamente

shutdown_lifetime 15 seconds: Quando o Squid recebe um SIGTERM ou um SIGHUP, o cache é colocado em modo de"shutdown pendente" até que todos os sockets ativos sejam fechados. Qualquer clienteainda ativo depois desse período irá receber uma mensagem de timeout. Default de 30segundos

Se você não usa o proxy numa hierarquia e nem pretende usar SNMP, faça as configurações abaixo:

icp_port 0
htcp_port 0
icp_access deny all
htcp_access deny all
snmp_port 0
snmp_access deny all

6 - Politicas de troca de cache

São 4 politicas:

lru: mantem em cache os arquivos abertos recentemente
heap GDSF: otimiza o hit radio de objetos mantendo os arquivos menores e populares no cache
heap LFUDA: mantem no cache arquivos populares, independe do tamanho, otimizando o Byte HIT
heap LRU: mantem em cache arquivos abertos recentemente utilizando a politica heap

obs: quando utilizar o LFUDA aumente o maximum_object_size para 102400.

A proposta para este tutorial é utilizar um proxy que utilize menos o disco e mais a mamória RAM. Neste caso vou utilizar o heap GDSF para a memória RAM "setada" no cache_mem, veja como ficou:

memory_replacement_policy heap GDSF

É muito importante também diminuir o consumo de banda, para isso aumentamos o Byte HIT com o LFUDA:

cache_replacement_policy heap LFUDA

7 - Teste de desempenho em Sistemas de Arquivos

Para os nossos testes será usado o comando time do linux. O comando time fornece o tempo de execução de um programa, muito útil para testes de desempenho de aplicações, ele utiliza 3 medidas:

Real: o tempo total utilizado pela aplicação,desde sua execução até a finalização.

User: exibe o que o Processador usa para processar a aplicação.

Sys: o tempo gasto pelo sistema para “ajeitar” tudo no kernel mode (carregar, mover o código e iniciar a execução).

Teste 1

Criando 10000 arquivos com o comando touch:

#time for i in $(seq 10000); do touch arq$i; done


ext3
ext4
jfs
reiserfs
xfs
zfs
real
3m11.734s
3m16.144s
3m46.433s
3m9.375s
3m18.793s
4m21.054s
user
0m34.166s
0m34.002s
0m36.474s
0m32.746s
0m32.334s
0m33.454s
sys
2m43.666s
2m50.759s
3m11.160s
2m44.238s
2m51.967s
3m14.120s


Teste 2
Rodar um find em busca de um arquivo não existente:

#time find . -name arquivo -exec ls {} \;


ext3
ext4
jfs
reiserfs
xfs
zfs
real
0m0.081s
0m0.141s
0m0.249s
0m0.236s
0m0.249s
0m0.920s
user
0m0.016s
0m0.016s
0m0.020s
0m0.008s
0m0.036s
0m0.004s
sys
0m0.068s
0m0.060s
0m0.228s
0m0.228s
0m0.212s
0m0.288s



Teste 3
Remover os 10000 arquivos criados anteriormente:

#time rm -rf particao/



ext3
ext4
jfs
reiserfs
xfs
zfs
real
0m2.936s
0m3.053s
0m15.308s
0m5.388s
0m12.319s
0m33.657s
user
0m0.244s
0m0.228s
0m0.172s
0m0.480s
0m0.244s
0m0.172s
sys
0m2.680s
0m2.808s
0m5.096s
0m4.808s
0m9.181s
0m11.005s


Teste 4
Criar 10000 diretórios:

#time for i in $(seq 10000); do mkdir dir$i; done


ext3
ext4
jfs
reiserfs
xfs
zfs
real
4m16.148s
5m8.983s
4m28.631s
4m9.001s
4m29.034s
4m32.876s
user
0m37.666s
0m44.183s
0m36.114s
0m34.458s
0m41.175s
0m29.742s
sys
3m38.578s
4m29.733s
3m53.671s
3m44.546s
3m36.074s
3m33.845s


Teste 5
Rodar o comando find nos subdiretórios buscando por um arquivo não existente:

#time find . -name arquivo -exec ls {} \;


ext3
ext4
jfs
reiserfs
xfs
zfs
real
0m1.595s
0m2.301s
0m0.947s
0m2.234s
0m1.137s
1m14.661s
user
0m0.080s
0m0.080s
0m0.040s
0m0.068s
0m0.104s
0m0.116s
sys
0m1.500s
0m1.844s
0m0.896s
0m2.144s
0m1.016s
0m26.150s


Teste 6
Remover todos os 10000 diretorios criados anteriormente:

#time rm -rf particao/


ext3
ext4
jfs
reiserfs
xfs
zfs
real
0m6.031s
0m6.229s
0m16.875s
0m8.333s
0m18.624s
1m17.433s
user
0m0.144s
0m0.148s
0m0.220s
0m0.200s
0m0.232s
0m0.168s
sys
0m5.688s
0m5.996s
0m6.700s
0m8.041s
0m8.649s
0m25.442s


Teste7
Baixando um arquivo de 200 MB da rede local usando o wget:

#time wget http://192.168.56.101/teste.exe


ext3
ext4
jfs
reiserfs
xfs
zfs
real
1m15.047s
1m10.764s
1m12.075s
1m15.698s
1m3.559s
1m24.298s
user
0m0.240s
0m0.116s
0m0.112s
0m0.304s
0m0.144s
0m0.184s
sys
0m24.106s
0m17.253s
0m19.397s
0m23.605s
0m14.901s
0m22.257s


Teste 8
Remover o arquivo de 200 MB

#time rm -rf teste.exe


ext3
ext4
jfs
reiserfs
xfs
zfs
real
0m0.229s
0m0.053s
0m0.029s
0m0.079s
0m0.020s
0m1.871s
user
0m0.012s
0m0.000s
0m0.000s
0m0.000s
0m0.000s
0m0.000s
sys
0m0.148s
0m0.056s
0m0.028s
0m0.076s
0m0.020s
0m0.128s


Teste 9
Criar um arquivo de 500 MB usando o /dev/zero:

#time dd if=/dev/zero of=teste count=1050 bs=500000


ext3
ext4
jfs
reiserfs
xfs
zfs
real
0m36.855s
0m23.009s
0m43.667s
0m36.175s
0m20.006s
0m25.787s
user
0m0.000s
0m0.000s
0m0.004s
0m0.000s
0m0.000s
0m0.008s
sys
0m21.733s
0m6.200s
0m17.081s
0m19.137s
0m4.540s
0m2.768s


Teste 10
Ler o arquivo de 500 MB criado anteriormente redirecionando para o /dev/null:

#time cat teste > /dev/null


ext3
ext4
jfs
reiserfs
xfs
zfs
real
0m12.074s
0m6.819s
0m7.622s
0m11.822s
0m8.646s
0m32.077s
user
0m0.024s
0m0.036s
0m0.036s
0m0.016s
0m0.036s
0m0.004s
sys
0m5.064s
0m4.788s
0m4.376s
0m8.105s
0m5.112s
0m2.648s


Teste 11
Dividir o arquivo de 500 MB em vários de 10 MB usando o comando split:

#time split --bytes=10485760 teste



ext3
ext4
jfs
reiserfs
xfs
zfs
real
0m45.588s
0m28.491s
0m28.869s
0m54.243s
0m27.239s
1m22.092s
user
0m0.032s
0m0.032s
0m0.024s
0m0.016s
0m0.036s
0m0.004s
sys
0m25.154s
0m12.437s
0m14.409s
0m37.022s
0m10.505s
0m5.720s



8 - CONCLUSÃO


Seguindo todas as dicas aqui mostradas é possível ter um squid muito robusto e que atenda na maioria dos casos, mesmo assim o Squid possui algumas limitações e problemas em termos de desempenho, foi por isso que foi criado o projeto Lusca. Recomendo a utilização do Lusca como web/Proxy cache. Para maiores informações acesse o site do projeto: http://www.lusca.org/


9 - REFERENCIA

http://wiki.squid-cache.org/SquidFaq
http://etutorials.org/Server+Administration/Squid.+The+definitive+guide/Chapter+7.+Disk+Cache+Basics/7.1+The+cache_dir+Directive/
http://www.comfsm.fm/computing/squid/FAQ.html
http://www.linofee.org/~jel/proxy/Squid/rel-notes-1_1.html#cache
http://www.visolve.com/squid/squid24s1/logfiles.php
http://webdeveloper.earthweb.com/repository/javascripts/2001/04/41291/byteconverter.htm
http://www.cyberciti.biz/faq/linux-increase-the-maximum-number-of-open-files/
http://wiki.squid-cache.org/SquidFaq/WindowsUpdate

Bom proveito.