segunda-feira, 12 de outubro de 2015

How to investigate errors "too many open files"

Last week, at my job, we were trying to find the root problem that was killing one of our applications. It is a rails app running on Debian, and we had some clues about the problem:
- looking at New Relic errors, we saw many errors like "getaddrinfo: Name or service not known"
- looking at Unicorn logs, there were a lot of "too many open files" errors

It seemed the application was being killed by these errors.

We thought that the server may have some network problems, as this could explain the "Name or service not known" error which is an error that happens when some domain can't be resolved with DNS.

But after some research, we remembered this kind of "too many open files" error is related with the number of open files in the filesystem. It is possible to list all opened files using the command lsof. We ran this command, but the number was too little. It didn't look like the default limit of 1024 was being reached.

So we kept searching for some answer to our problem, and we found another way to list the current open files of a process using a command like this:

ls -la /proc/3591/fd

This command shows all the file descriptors related to a process (pid).

We ran this command to our process, and we noticed many file descriptors were not being listed due to permission constraints.

When we ran the same command with root, all the FDs were there listed. So we thought 'Lets try to run lsof with root to see if the result is different', and it was - a big number had appeared!

Running lsof, it is possible to filter the output using grep, so we could analyse why there were so many opened files.

After some analysis, and using a little of bash script, we ended up with this command:

lsof | grep -e "^ruby" | awk '{print $9}' | grep imap | wc

This showed us a lot of opened IMAP connections.

The app uses IMAP to get some information about the mailboxes, and the connections were not being closed after it, so the problem was found!

So the lesson is, when investigating errors like "too many open files", run lsof with root!

Here some links I found to understand it better:

http://www.commandlinefu.com/commands/view/9893/find-ulimit-values-of-currently-running-process
http://geekswing.com/geek/quickie-tutorial-ulimit-soft-limits-hard-limits-soft-stack-hard-stack/

quinta-feira, 2 de outubro de 2014

Como editar configurações de rede Ubuntu 12.04 na mão

Vou postar isso aqui pois sempre esqueço qual o arquivo que deve ser alterado:

sudo vim /etc/NetworkManager/system-connections/Wired\ connection\ 1

[802-3-ethernet]
duplex=full
mac-address=78:2B:CB:C4:69:52

[connection]
id=Wired connection 1
uuid=eba66e39-b7d1-4ce8-a79d-60208a94f966
type=802-3-ethernet
timestamp=1394655259

[ipv6]
method=auto

[802-1x]
eap=peap;
identity=[USERNAME]
phase2-auth=mschapv2
password=[PASSWORD]

[ipv4]
method=auto

segunda-feira, 1 de setembro de 2014

Testes mais rápidos com Rspec e PostgreSql

Uma dica simples e fácil para aumentar a velocidade dos testes no Rspec com PostgreSql é seguir as instruções nesse link:

http://www.postgresql.org/docs/current/static/non-durability.html
obs: não fiz o 1o item da lista (RAM disk)

No meu caso os testes que rodavam em 4min e 10s cairam para 56s !!

Só não use essas configurações em produção pois o risco perder dados é alto!

sexta-feira, 14 de março de 2014

Adicionando o nome do branch em todos os commits do git

*obs: testei isso rodando no Ubuntu 12.4, não tenho certeza se funciona no Mac e no Windows

Com este hook o nome do branch será colocado no começo de todos os commits do git

Por exemplo se fizer isso no branch [historia_1]

git commit -am "lala popo"

A mensagem gravada será "[historia_1] lala popo"

Segue o passo a passo de como configurar o git para isso:

- Se estiver usando o git acima da versão 1.7.1, é possível deixar o hook global deste jeito

git config --global init.templatedir '~/.git_template'

- Depois disso, criar o arquivo abaixo

~/.git_template/hooks/prepare-commit-msg

- Colocar o conteudo abaixo:

#!/bin/bash

FILE=$1

if [[ "$git_status" =~ On\ branch\ ([^[:space:]]+) ]]; then
    BRANCH_NAME=${BASH_REMATCH[1]}
    test "$branch" != master || branch=' '
else
    # Detached HEAD.  (branch=HEAD is a faster alternative.)
    BRANCH_NAME="`git describe --all --contains --abbrev=4 HEAD 2> /dev/null ||
        echo HEAD`"
fi

echo $1

if [ -n "$BRANCH_NAME" ] && [ "$BRANCH_NAME" != "master" ]; then
    sed -i.bak -e "1s/^/[$BRANCH_NAME] /" $FILE
fi

- Salvar o arquivo e colocar permissão chmod 755

A partir desse ponto, todos os repositórios clonados e inicializados terão este hook, para os já existentes, precisa rodar o comando git init que carregará o hook global.

terça-feira, 14 de janeiro de 2014

PostgreSql migrando da versão 9.2 para a 9.3

No Debian/Ubuntu existe um jeito simples de fazer um upgrade da versão 9.2 para a versão 9.3 do PostgreSql com os comando pg_upgradecluster (http://manpages.ubuntu.com/manpages/jaunty/man8/pg_upgradecluster.8.html).

Basta seguir o procedimento abaixo:

sudo apt-get install postgresql-9.3
sudo /etc/init.d/postgresql stop
sudo pg_dropcluster --stop 9.3 main
sudo pg_upgradecluster 9.2 main

Após isso, é possivel rodar o comando pg_lsclusters para verificar que a versão 9.3 está ok.


quarta-feira, 6 de fevereiro de 2013

Lumosity - You have the power to improve your brain

Hoje vou falar do site lumosity.com

O Lumosity é um site com vários jogos feitos para treinar o cérebro.

Segundo eles, os jogos treinam 5 diferentes áreas:

  • velocidade
  • memória
  • atenção
  • flexibilidade
  • resolução de problemas

Ao criar uma conta, você escolhe quais áreas deseja melhorar e quais tem preferência no treinamento.

Todos os dias, são 5 jogos selecionados de acordo com seu perfil. Eles dizem que treinar o cérebro deve ser um costume como escovar os dentes, deve ser feito todos os dias e assim terá resultados no futuro.

Uma das partes mais legais é acompanhar o gráfico de evolução das suas habilidades e como você se compara com as outras pessoas da sua mesma faixa etária. A seguir coloquei um print dessa tela:


 Para experimentar é possível criar uma conta trial e jogar por 3 dias.

Eu não consegui resistir e estou pagando um plano mensal para poder continuar, até minha esposa está treinando e gostando!

A dica é fazer um plano familiar, fica mais barato por pessoa, inclusive tenho vagas no meu plano, se alguem tiver interesse me avisem!

sexta-feira, 18 de janeiro de 2013

GEM para consumir API do Emailmarketing da Locaweb

Pessoal,

fiz uma GEM para consumir a API do Emailmarketing da Locaweb.

O Github é esse: https://github.com/fabioperrella/locaweb-emailmarketing
Está publicado no rubygems: https://rubygems.org/gems/locaweb-emailmarketing

Sugestões serão bem vindas!

 

© 2013 Coisas da Vida. All rights resevered. Designed by Templateism

Back To Top