Ir para o conteúdo
ou

Software livre Brasil

Tela cheia
 Feed RSS

Blog

27 de Maio de 2009, 0:00 , por Software Livre Brasil - | Ninguém está seguindo este artigo ainda.
cover do http://fernandoike.com

Debian: 20 anos!

16 de Agosto de 2013, 15:21, por Software Livre Brasil - 0sem comentários ainda

Hoje o Debian faz 20 anos. É muito legal ver um projeto como ele ter bastante tempo e continuar com seu plano ambicioso de dominação mundial. Ops, dominação do universo.

Eu sou muito grato pelas oportunidades, conhecimento e contribuição esses anos todos que fui (ops, estou) voluntário. Claro que alguns momentos mais ativo que outros mas é admirável olhar um projeto que suporta tantas arquiteturas de hardware diferentes e principalmente, com suporte à tantos idiomas diferentes.

Fui olhar quando foi criado meu login no Alioth e ele é de 2004. :)

Ah, claro! Uma projeto que batiza as versões lançados com os nomes dos personagens do Toy Story, tinha que durar muito tempo.



CDN: Identificando IP de um usuário

8 de Agosto de 2013, 14:40, por Software Livre Brasil - 0sem comentários ainda

<p>Quando um site usa uma <a href="http://pt.wikipedia.org/wiki/Content_Delivery_Network">CDN</a> para fazer cache e/ou aceleração as vantagens são bem conhecidas, mas algumas vezes é necessário ajustar uma ou outra coisa para tudo continue funcionando. Um exemplo é o servidor web do site deixa de receber requisições diretamente do usuário porque agora tem os servidores da CDN intermediando essa comunicação. Então, nos logs do servidor web estará um IP de um servidor da CDN ao invés do IP de um usuário.</p> <p><img src="http://www.fernandoike.com/images/cdn.png" /></p> <p>Para resolver esse problema, uitas CDNs enviam um cabeçalho HTTP extra de suas requisições para o servidor web do site, esse cabeçalho é o True-Client-IP.</p> <p>Abaixo dois exemplos (<a href="http://http.apache.org">Apache</a> e <a href="http://www.nginx.org">nginx</a>) de configuração do Log para registrar o True-Client-IP.</p> <h4>Apache</h4> <pre> [...] LogFormat "%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{true}i\" %q" site.com CustomLog ${APACHE_LOG_DIR}/teste_access.log site.com [...] </pre> <h4>nginx</h4> <pre> [...] log_format teste '$remote_addr - $remote_user [$time_local] ' '"$request" $status $bytes_sent ' '"$http_referer" "$http_user_agent" ' '$http_true_client_ip'; access_log /var/log/nginx/teste.com.log site.com; [...] </pre>



PostgreSQL tuning - Prelúdio

6 de Agosto de 2013, 0:00, por Software Livre Brasil - 0sem comentários ainda

<p>Normalmente ao pensar em melhorar a performance do banco de dados, muitos esquecem de modificar alguns parâmetros e configurações do Sistema Operacional e outras coisas relacionadas a infraestrutura de TI. Não dar a atenção devida para essas coisas é que elas podem impactar o desempenho do banco de dados e você estar tão focado em melhorar o banco de dados que não considera-os como a causa raiz.</p> <p>Bom, então a idéia aqui é ser uma etapa prévia antes de mexer nas configurações do <a href="http://www.postgresql.org/">PostgreSQL</a>, portanto considere como um ponto de partida. Cada aplicação e arquitetura terá uma configuração específica do PostgreSQL para que tenho o melhor desempenho possível.</p> <h3>Adote um método para fazer os ajustes de performance.</h3> <p>Infelizmente não existes muitos números mágicos (ok, existe alguns números mágicos mas não é caso neste momento). Para fazer os ajustes para melhorar o desempenho do PostgreSQL e consequetemente da aplicação é necessário fazer vários testes em muitas variáveis. Fazer alterações em muitas variáveis ao mesmo tempo pode levar muito mais tempo do que fazer alterações em poucas ou uma variável e observar se obteve ganho de performance ou não. Portanto, adote uma metodologia, faça uma mudança por vez e teste! Anote os resultados, faça outra alteração e compare coms os resultados anteriores. Assim poderá comparar e verificar quais são os melhores ajustes em determinados cenários que imaginar que a aplicação faz.</p> <p>Vale qualquer forma de registro, até papel de padaria!</p> <h3>Armazenamento</h3> <p>Tão ou mais importante que ter uma servidor com uma capacidade tão grande de processamento é ter a parte de armazenamento (discos/storages) bem plenajada. É muito comum usar Storages com um único Array e compartilho entre as diversas aplicacṍes da instituição.</p> <p>Como aparentemente o Storage tem I/O infinito, geralmente é relegado algum planejamento de como as aplicações ou base de dados irão ocupá-lo. Em situações de grande uso de I/O (escrita ou leitura) é importante criar grupos de discos (arrays) considerando usar as partes mais rápidas do Storage para as bases ou operações críticas e com conexões de fibras dedicadas para o servidor PostgreSQL.</p> <p> O Telles escreveu um <a href="http://savepoint.blog.br/postgresql-discos-cia/">bom texto</a> sobre discos, recomendada a leitura.</p> <p>Considere sempre usar &#8220;canais&#8221; dedicados de comunicação entre o servidor do banco de dados e o armazenamento. Exemplo: Caso esteja usando um sistema de arquivo de rede (<a href="http://pt.wikipedia.org/wiki/Network-Attached_Storage">NAS</a>) para o banco de dados, considere segregar em uma rede dedicada à eles para que não haja concorrência de tráfego de rede com outros serviços e/ou aplicações. Caso esteja usando comunicação via Fiber Channel (<a href="http://pt.wikipedia.org/wiki/Rede_de_%C3%A1rea_de_armazenamento">SAN</a>), tente deixar as conexões físicas dedicadas entre o servidor de banco de dados, switch fiber channel e o storage.</p> <p>Armazenamento de banco de dados é um tema tão vasto que facilmente poderia ser um Livro de centenas de páginas mas por enquanto ficamos por aqui&#8230;</p> <h3>Habilitar ou não o HyperThreading</h3> <p> Para o PostgreSQL não faz diferença se o <a href="http://pt.wikipedia.org/wiki/Hyper-threading">HyperThreading</a> habilitado ou não, ele usará o número máximo de processadores que o Sistema Operacional disponibilizar.</p> <h3>Sistema Operacional</h3> <p>É simples, use Unix/Linux e que seja 64 bits. Entendo que exista questões de usar um Sistema Operacional &#8220;homologado&#8221; para o servidor ou Storage mas se quer o máximo de performance seria melhor usar <a href="http://www.centos.org/">CentOS</a> ou [Debian<a href="http://www.debian.org/">7</a> ou mesmo um <a href="https://www.archlinux.org/">ArchLinux</a>.</p> <p>Antes do tuning do banco de dados, tuning do Sistema Operacional.</p> <p>Isso é coisa básica mas extremamente importante, afinal é impossível aumentar o<em>Shared Buffer</em> do PostgreSQL sem aumentar a memória compartilhada do Linux. Considere aumentar a memória compartilhada (<em>Shared Memory</em>), <em>semáforos</em>, buffers de rede, scheduler I/O, etc.</p> <h4>Memória compartilhada (shared memory)</h4> <p>Mais ou menos 25% da memória total é a resposta padrão mas pode ser interessante iniciar os ajustes com valor menor. Algo entre 15% e 20% do total disponível da RAM e depois ajustar para um valor maior. Exemplo para 10GB:</p> <pre> #sysctl -w kernel.shmmax=109951162777 </pre> <h4>Usando Swap somente em último caso</h4> <p> O Kernel Linux por padrão usa a memória <a href="http://pt.wikipedia.org/wiki/Mem%C3%B3ria_virtual">Swap</a> (&#8220;extensão&#8221; da memória RAM na HD, é muito) antes mesmo de esgotar o espaço livre da memória RAM. Para utilizar a Swap somente em último caso:</p> <pre> #sysctl -w vm.swappiness=0 </pre> <h3>Rede</h3> <p> Supondo que o servidor tem placas de rede de 10GBits/s.</p> <pre> #systcl -w net.core.rmem_default = 8388608 #systcl -w net.core.rmem_max = 8388608 #systcl -w net.core.wmem_default = 8388608 #systcl -w net.core.wmem_max = 8388608 #systcl -w net.core.netdev_max_backlog = 10000 </pre> <h4>Ajustes na pilha de rede.</h4> <pre> #systcl -w net.ipv4.tcp_max_syn_backlog = 40000 #systcl -w net.core.somaxconn=4000 #systcl -w net.ipv4.tcp_timestamps = 0 #systcl -w net.ipv4.tcp_sack = 1 #systcl -w net.ipv4.tcp_window_scaling = 1 #systcl -w net.ipv4.tcp_fin_timeout = 15 #systcl -w net.ipv4.tcp_keepalive_intvl = 30 #systcl -w net.ipv4.tcp_tw_reuse = 1 </pre> <h3>Scheduler I/O</h3> <p>O Kernel Linux tem vários tipos de scheduler, por padrão atualmente é o <a href="http://en.wikipedia.org/wiki/CFQ">CFQ</a> mas para operações intensivas de I/O o <a href="http://en.wikipedia.org/wiki/Deadline_scheduler">Deadline</a> tem um resultado melhor.</p> <pre> #echo deadline > /sys/block/sda/queue/scheduler </pre> <h3>Limite de Arquivos Abertos (Open Files Limit)</h3> <p> Acontece com muita frequencia alterar a configuração do Linux, servidor de aplicação, algoritimos, banco de dados e esquecer de alterar o &#8220;Limite de Arquivos Abertos&#8221;. Não alterá-lo significa numa analogia grosseira dizer que &#8220;você está andando de Porche com o freio de mão puxado.&#8221;. Este item é importantíssimo porque se estiver com valores relativamente baixos, nenhuma ferramenta de monitoramento irá detectar isso como um gargalo de desempenho.</p> <p>Para configurar o usuário <strong>postgres</strong> com um limite maior:</p> <p>Edite o <em>/etc/pam.d/common-session</em>, acrescente, salve e feche o arquivo.</p> <pre> session required pam_limits.so </pre> <p>Edite o <em>/etc/security/limits.conf</em> e acrescente as linhas abaixo:</p> <pre> * soft nofile 65536 * hard nofile 65536 </pre> <p>Lembre-se de salvar, fechar o arquivo e reinicar para que as alterações tenham efeito. Para saber mais, vale ler a <a href="http://docs.basho.com/riak/latest/ops/tuning/open-files-limit/">documentação</a> do Riak sobre isso.</p> <h3>Sistema de Arquivo</h3> <p>Esse é um difícil dizer qual é a melhor opção, eu não conheço benchmarks recentes mas o benchmark que fiz algum tempo atrás apontou que para bases de dados pequenas e de pouco usuários simultâneos é melhor usar <a href="http://pt.wikipedia.org/wiki/Ext4">Ext4</a>. No cenário de base de dados grandes e muitos usuários simultâneos o <a href="http://pt.wikipedia.org/wiki/XFS">XFS</a> tem uma performance melhor.</p> <p>Também é imporante fazer outros ajustes como modificar a montagem dos discos para desconsiderar o timestamp da criação/edição de arquivos e diretórios. Exemplo de entrada no <em>/etc/fstab</em>:</p> <pre> [...] /dev/sdd1 /opt/pg/9.3/db xfs defaults,noatime,nodiratime,nodev 0 0 [...] </pre> <p>Se você tiver alguma informação do <a href="https://btrfs.wiki.kernel.org/index.php/Main_Page">Brtfs</a>, Ext4 e XFS com benchamrks mais novos, comente aí. :D</p> <h3>Conclusão</h3> <p>Pensar em tuning de banco de dados sem considerar os ajustes de desempenho de toda arquitetura envolvida é como colocar um motor de Porsche num Fusca. Tuning é uma tarefa contínua enquanto a aplicação existir. Existe bons textos sobre o tema, recomendo a leitura de alguns:</p> <ul> <li><a href="http://www.redbooks.ibm.com/abstracts/redp4285.html">Red book Linux Performance and Tuning Guidelines</a></li> </ul> <p>Livro antigo mas com informações preciosas.</p> <ul> <li><a href="http://docs.basho.com/riak/latest/cookbooks/Linux-Performance-Tuning/">Linux Performance Tuning - Riak - Basho</a></li> </ul> <p>Bem didádico, as dicas estão aplicadas para o Riak mas vale como referência.</p> <ul> <li><a href="http://docs.neo4j.org/chunked/stable/linux-performance-guide.html">Linux Performance Guide - Neo4J</a></li> </ul> <p>Também bem didático mas aplicado para o Neo4J.</p> <p>Neste texto tem uma visão bem particular, se tiver alguma sugestão, crítica ou correção. Faça! :)</p>



Melhorar peformance do site aumenta audiência

2 de Agosto de 2013, 0:00, por Software Livre Brasil - 0sem comentários ainda

Há +- um mês eu comecei a fazer otimizações no servidor e no Octopress (O CMS do meu blog) como parte dos estudos de Web Performance. No mês de Junho de 2013 era 352 vistantes, 535 page views (páginas vistas) e o tempo médio de renderização da página era por volta de 11 segundos. Em Julho de 2013 fiz várias otimizações no blog e os números aumentaram um pouco: 706 visitantes, 1.301 pages views, e tempo médio de renderização da página foi 7,48 segundos. Aumento expressivo para um blog de pouca audiência, não?

Abaixo uma tabela simples com os dados consolidado.

Dados/Mês Junho Julho Percentual
Visitantes 352 706 100,57%
Page views 535 1.301 143,18%
Doc Complete 11 seg. 7,48 seg 68%
Tempo/Visita 1:08 seg. 1:32 seg. 36,15%
Página/Visitantes 1,52 1,84 21,24%

Como as principais otimizações no blog foram realizadas no final de Julho, é provável que a audiência aumente um pouco mais no mês de Agosto. Se fosse um portal de notícia ou comércio eletrônico o alvo das otimizações, provavelmente aumentaria audiência ou a conversão de vendas segundo o estudo do Walmart dos EUA.

Essas mudanças ficam mais visíveis com o gráfico comparativo do Google Analtyics.

Os textos blog relacionados à Web Performance: