Turbinando o Postfix
by Deives Michellis "thefallen"
1. Introducao
As vezes faz-se necessario ajustar alguns parametros do Postfix pra encaixa-lo nas suas necessidades especificas.
Voce poderia, por exemplo, estar procurando um servidor para enviar Newsletter (como me aconteceu hoje), e ha alguns parametros meio "obscuros" no Postfix que podem fazer um "fine tunning" no seu servidor.
Algumas opcoes interessantes sao as que aumentam/diminuem o numero/quantidade de copias que um determinados modulo do Postfix pode rodar.
Por exemplo, se eu determinar que ha pessoas demais se conectando ao meu SMTP, e que isso esta gerando uma queda de performance no sistema como um todo, eu posso limitar o numero de conexoes SMTP simultaneas. Imagine que eu tenha um anti-virus rodando em meu sistema. Cada mensagem que chega, eh enviada para o AntiVirus scannear. Nao seria la muito bonito se eu tivesse 50 processos do antivirus rodando. Alem de demorar mais para cada mensagem ser scanneada, isso geraria outros problemas com recursos limitados do servidor. Assim, eu poderia diminuir a quantidade de instancias de um dos modulos, o do scanner, por ex, e melhorar a performance geral da maquina.
Ou, em outra situacao, o Postfix serve de MX e Relay para os outros servidores internos (MicroSoft Exchange, Lotus Notes, GroupWise, Mercury, etc). Voce nota que as mensagens comecam a se acumular para serem entregues aos respectivos servidores. Poderiamos aumentar a quantidade de processos que o Postfix usa para fazer as entregas (seja via SMTP, LMTP, UUCP, tanto faz). Isso realmente ajuda na hora do sufoco :)
Bom, ja falamos bastante, agora maos na massa!
Uma parte dessas configuracoes pode ser ajustada no /etc/postfix/master.cf. Esse arquivo controla o funcionamento do processo master, que eh o modulo do Postfix responsavel por controlar TODOS os outros modulos (seja abrir a porta 25 para o smtpd, seja chamar o qmgr pra "agitar" a fila de emails, seja o "virtual" ou "local" para fazer a entrega da mensagem). Vamos dar uma olhadinha na sua estrutura:
# ==========================================================================
# service type private unpriv chroot wakeup maxproc command + args
# (yes) (yes) (yes) (never) (50)
# ==========================================================================
smtp inet n - n - - smtpd
#628 inet n - n - - qmqpd
pickup fifo n - n 60 1 pickup
cleanup unix n - n - 0 cleanup
qmgr fifo n - n 300 1 qmgr
#qmgr fifo n - n 300 1 nqmgr
rewrite unix - - n - - trivial-rewrite
bounce unix - - n - 0 bounce
defer unix - - n - 0 bounce
flush unix n - n 1000? 0 flush
smtp unix - - n - - smtp
showq unix n - n - - showq
error unix - - n - - error
local unix - n n - - local
virtual unix - n n - - virtual
lmtp unix - - n - - lmtp
#
# Interfaces to non-Postfix software. Be sure to examine the manual
# pages of the non-Postfix software to find out what options it wants.
# The Cyrus deliver program has changed incompatibly.
#
spamfilter unix - n n - - pipe
flags=Rq user=lalas argv=/usr/local/sbin/spamfilter.sh -f {$sender} {$recipient}
2. MaxProc
Em nosso caso (a configuracao default), o limite de processos para o smtpd (o cara que recebe as mensagens pela porta 25) eh "-", ou usar o default de 50 (parametro default_process_limit). Em nosso caso, poderiamos restringir o numero de sessoes SMTP simultaneas que a maquina aceita. Poderiamos por a linha:
smtp inet n - n - 15 smtpd
para limitarmos em 15 sessoes do smtpd simultaneas. Ou, mais interessante ainda, aumentar o numero de sessoes de entregas smtp simultaneas com a linha:
smtp unix - - n - 100 smtp
Isso diria ao sistema para permitir ate 100 processos de entrega SMTP (muito util pra gerenciar grande volume de mensagens com um link respeitavel tambem :) )
Uma outra aplicacao MUITO util para o controle do MaxProc seria na hora de rodar um AntiVirus ou filtro Anti-SPAM. Eu poderia limitar o numero de processos do Antivirus/Antispam aqui no master.cf, e melhorar sensivelmente o servico.
spamfilter unix - n n - 3 pipe
flags=Rq user=lalas argv=/usr/local/sbin/spamfilter.sh -f {$sender} {$recipient}
3. WakeUp
Outro parametro interessante pra quem gosta de "escovar bits" eh alterar o valor de Wakeup dos processos de fila do Postfix. Por exemplo, acho q meu postfix demora MUITO pra tentar entregar uma mensagem de novo se houver algum erro no transporte (por ex, o MX/SMTP do Hotmail.com nao respondeu e deu timeout).
A mensagem fica aguardando o proximo "flush" da fila, no caso, o processo flush que ocorre de 1000 em 1000 segundos, o equivalente ao +/- 15minutos. Poderiamos colocar um valor mais baixo, como por exemplo de 5 em 5 minutos como ocorre com o qmgr (o gerenciador de fila). Isso acelera consideravelmente o tempo de resposta do servidor, embora possa consumir mais recursos.
4. Concurrency Limit
Uma outra forma de acelerar o funcionamento do servidor de correio eh alterar o limit para entregas para o mesmo destino.
Este parametro consta no main.cf como "default_destination_concurrency_limit". Se eu, por exemplo, enviar 100 mensagens para o provedor XYZ, ele nao vai abrir 100 conexoes para o MX do provedor e enviar tudo duma vez. Ele, como servico educado que eh, vai abrir ate o limite de conexoes concorrentes para o mesmo destino permitidas, que eh por default 10 no Postfix 1.x e 20 no Postfix 2.x.
No entanto, eu SEI que as minhas entregas simultaneas vao ser para o meu servidor interno de correio, e que nao vao impactar no link internet. Se eu deixar limitado a 10 entregas por vez e chegarem 50 emails para mim "num tapa", teria que esperar 5 rodadas (+/-) para que todas sejam entregues.
Posso mudar um pouco as regras e agilizar isso alterando a opcao "smtp_destination_concurrency_limit", que se refere exclusivamente ao funcionamento do servico de entrega SMTP (nao confundir com smtpd). Poderia "seta-lo" para 50, por exemplo, que eh um numero bastante razoavel para entregas internas, e nao vai "ferrar" o servidor interno se ele for meio fraquinho e tiver uma tendencia a dar telas azuis de brinde para o administrador :)
5. Uma palavra de cautela
Aqui vai um "causo" que ilustra bem o ponto. Aqui na empresa onde trabalho, o Postfix funciona tanto como filtro pra um MS Exchange como um servidor de contas/caixas tambem. Nesse bendito dia, o sisteminha meia-boca do tio Bill resolveu ficar 1 dia e meio fora do ar.
A fila de entrega pro dito cujo foi soh aumentando, aumentando e aumentando. Quando o servico voltou, revolvi acelerar a entrega. Em mina ansiedade (pra nao dizer um monte de usuarios/chefes/gerentes reclamando), mudei o limite de processos de entrega smtp pra 200 com filtragem de SPAM para desentupir minha fila de emails e repassa-los pro Exchange.
Cada processo desse abre diversos outros subprocessos (de filtragem). Soh fui perceber isso quando nao conseguia mais rodar um inocente "ps ax"... Havia esgotado TODOS os file descriptors do sistema. Muitos arquivos abertos. Dava um erro de que nao era possivel abrir novos processos por que os recursos estavam esgotados. Nesse dia, aprendi a ir com calma nos tunnings!
6. Conclusao
Vimos aqui mais um pouquinho dos muitos recursos que o Postfix oferece, que podem ajudar bastante na hora do "vamos ver", especialmente se seu chefe estiver "na cola" por que o servico de correio esta lerdo, ou se voce quiser impressiona-lo com uma melhoria espontanea :)
Esses parametros citados aqui sao coisas que eu uso efetivamente no dia-a-dia. Fica ao cargo do administrador que quiser brincar com essas configuracoes faze-lo com o "pe no chao" e evitar mudancas repentinas de valores. Acredite, isso pode dar problemas :)
7. Sobre o autor
Deives Michellis "thefallen" eh Tecnologo em Processamento de Dados pela FATEC/SP e Gerente de Desenvolvimento de Solucoes Linux do Grupo GEO. Tambem nerd de carteirinha e ativista linux nas horas vagas.
Ultima Revisao: Thu Dec 4 21:51:33 2003
Criado com o txt2tags
Fonte: http://www.unitednerds.org/thefallen/docs/?area=Postfix&tuto=Postfix-Turbinando_o_Postfix