O espaço de Swap no Linux – for dummies (eu, no caso)

Desde o início dos tempos que o homem passa a vida em busca das respostas para as perguntas que mais nos assolam a mente:

  1. De onde viemos?
  2. Para onde vamos?
  3. O que é isso, minha filha?
  4. O que é e de que tamanho eu deixo essa merda dessa Swap?

As resposta para as 3 primeiras são simples e eu não vim aqui pra respondê-las. Vim falar só da última, que é a que sempre me deixa em dúvida. Isso porquê eu trabalhei milênios com o Windows, e lá tudo tem dica, indicação, hint, tooltip, valor default, esse monte de coisa feito pra gente que não anda muito afim de se preocupar com fine-tuning de nada (eu, àquela época). O detalhe é que em absolutamente lugar nenhum de nenhuma instalação de distribuição Linux que eu tenha testado (de um gigantesco total de três distribuições) me dá uma mínima indicação de como eu posso descobrir o tamanho ideal do espaço que devo destinar pra tal “Swap”.

Vamos por partes, então.

O que é a Swap?
Na verdade, não devíamos nem chamar de “a”. É “o”. É o ‘espaço’ de Swap. É o espaço em disco que o kernel do Linux utiliza pra fazer Swapping, uma técnica de gerenciamento de memória.
Explicativo, né? Eu sou mesmo um gênio!

Não, você é só um idiota. Como diabos isso funciona, cara?
O espaço de Swap é usado em duas ocasiões:

  1. Quando a memória física já não é suficiente. O Kernel retira da memória RAM e coloca neste espaço (uma operação chamada de swap out) as páginas – os pedaços de memória em que o Linux divide a memória física – que estão sendo menos utilizadas, e libera essa memória para aplicações mais críticas, que precisam de memória imediatamente;
  2. Alguns aplicativos podem usar uma grande quantidade de memória durante a inicialização, e depois não usarem essa memória toda alocada pra mais nada. Ou seja, um puta desperdício de RAM. O kernel pode então fazer swap out destes dados, liberando então a memória para processos críticos, de maior prioridade, ou mesmo para operações de cache de disco.

Tá, legal. Mas deve ter alguma desvantagem aí!
E tem! O acesso é em disco, ou seja, é mais lento. Só pra se ter uma ideia, a velocidade de acesso à RAM nós calculamos em nanossegundos; o acesso ao disco, em milissegundos. Ou seja, mil vezes mais lento. Além disso, há um outro agravante: a operação de tirar algo da RAM e pôr no disco (swap out) e o caminho inverso (swap in) é uma operação lenta, o que também torna esse processo meio incômodo se você abusar.

Ahhh, agora entendi. Tá, mas então de que tamanho eu deixo essa naba?
Direto ao ponto:

  1. Desktops, Laptops, enfim, uso “pessoal”: o dobro da memória RAM é o indicado. Aí tu vai perguntar “Tá maluco, cara? Eu tenho 8 Gb na minha máquina, vou perder 16 Gb de HD só pro Swap?” Bom, se você quiser obter o máximo de desempenho da sua memória, sim. Mas sim, se você tem mais de 4 Gb de RAM, um valor igual ao tamanho da tua memória já chega num desempenho muito bom.
  2. Servidores: em geral, a gente não fica abrindo e fechando aplicativo em servidores, então aqui, por increça que parível, a regra é inversa: metade da sua memória RAM é o mais indicado. Entretanto, monitore o uso do espaço de Swap. Se ele estiver sendo muito utilizado, NÃO aumente o Swap; abra essa mão e compre mais RAM. E, claro, redimensione seu espaço de Swap para metade da RAM novamente.
  3. PCs antigos, com até 128 Mb de RAM: se você é do tipo que gosta de desenterrar máquina velha, nesse caso avacalhe. Use o que puder, de preferência acima de 1 Gb.

Coisa linda! Mas eu fiz cagada e já instalei sem calcular antes, e com o valor errado. Como eu redimensiono o meu espaço de Swap?
Há duas formas de Swap: por arquivo e por partição. Por arquivo é mais fácil. Por partição é mais difícil e tu corre o risco de fazer ainda mais cagada.
Daí eu explico depois como altera o tamanho delas depois da cagada feita.

Ósculos, Amplexos e Feliz Ano Novo pra todo mundo!

Anúncios

Configuração Log4J + Spring

Um post individualista – só pra eu não esquecer disso mais uma maldita vez.

Insira isso aqui no web.xml e pronto, o Log4J vai fazer o append das operações gerenciadas pelo Spring também.

<context-param>
<param-name>log4jConfigLocation></param-name>
<param-value>/WEB-INF/log4j.properties></param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

De nada.