Melhorando o desempenho do Exim: montando a fila de mensagens no RAMdisk

3

Eu tenho um servidor de e-mail que faz parte de um aplicativo de mensagens e vai ver muito throughput. Eu quero montar a fila de mensagens do Exim em um disco RAM para maximizar o desempenho; A taxa de transferência é mais importante, em oposição à solidariedade em caso de falha ou reinicialização do sistema. Eu encontrei muitas informações dizendo que montar a fila de mensagens em um RAMdisk ajudará bastante, mas nenhuma informação real sobre como fazer isso.

Eu tenho certeza que a fila de mensagens está em / var / spool / exim por padrão, e que eu posso usar o tmpfs para montar um disco RAM. Como exatamente eu iria montar um RAMdisk no boot, e usar a fila de mensagens do Exim?

Ou seja. qual seria o comando para montar este disco RAM, e onde eu colocaria esse comando para que ele seja executado quando a máquina inicializar (mas antes do Exim iniciar)?

Obrigado :)

    
por JustinP 06.05.2011 / 21:13

5 respostas

5

Ramdisk: Implicações

  • O uso de um ramdisk só é útil quando o aplicativo está vinculado a E / S, especificamente ao disco rígido. A menos que você esteja enviando milhares de mensagens por meio de um link de fibra rápido, é provável que seu limitador principal seja a velocidade de sua conexão com a Internet e não a velocidade do seu disco rígido.
  • O Exim já é muito bom em lidar com filas grandes em mídias 'lentas', como discos rígidos; basta definir o split_spool_directory no arquivo de configuração e o Exim manipulará as filas grandes com mais eficiência dividindo as mensagens em subdiretórios em vez de em um único diretório de spool.
  • O spool de mensagens para um ramdisk representa o risco de perder toda a fila no caso de uma reinicialização ou queda de energia, sem nenhuma maneira de recuperar a fila.
  • O diretório de spool pode se tornar bastante grande, e você corre o risco de ficar sem espaço na partição ramdisk muito rapidamente. Alguns e-mails com anexos grandes poderiam facilmente preencher até mesmo um ramdisk considerável. Da mesma forma, as mensagens que não podem ser entregues imediatamente ficam na fila até que sejam entregues com êxito, removidas manualmente ou expiradas pelo Exim, embora essa seja uma configuração configurável no arquivo de configuração do Exim.


Ramdisk: Configurando um ramdisk

Muitas distribuições Linux já possuem alguns ramdisks pré-configurados, mas não utilizados. Execute o seguinte comando para listar seus ramdisks atuais:

ls /dev/ram*

Para ver a alocação de tamanho, use fdisk na moda padrão: (onde X é o seu número de ramdisk)

fdisk -l /dev/ramX

Você provavelmente desejará aumentar a alocação de espaço padrão. Como o tamanho do disco RAM é controlado pelo kernel, você precisará definir uma opção de kernel para aumentar o espaço alocado. Se o seu gerenciador de inicialização for o GRUB, você poderá editar o arquivo grub.conf e adicionar a opção ramdisk_size kernel. Seu arquivo de configuração do GRUB deve ser algo como isto: (neste exemplo, estamos definindo o tamanho do ramdisk para 256MB)

default 0
timeout 5
hiddenmenu
splashimage=(hd0,1)/boot/grub/splash.xpm.gz

title=Gentoo Gateway Server
root (hd0,1)
kernel /boot/vmlinuz root=/dev/sda2 ramdisk_size=256000

Após a reinicialização, os novos ramdisks devem refletir a alocação de espaço atualizada. Como não há nenhum ponto na formatação de um ramdisk com um sistema de arquivos journalled, vamos apenas usar ext2:

mke2fs -m 0 /dev/ram0

A opção -m 0 impede que o mke2fs reserve qualquer espaço no sistema de arquivos para o usuário root. Agora você pode criar um ponto de montagem para o disco virtual, montá-lo e começar a usá-lo.

mkdir /mnt/ramdisk
mount /dev/ram0 /mnt/ramdisk
df -h /dev/ram0

Além disso, certifique-se de ter as permissões corretas definidas no ponto de montagem (substitua username e groupname pelo grupo e pelo usuário corretos do sistema):

chown -R username:groupname /mnt/ramdisk

Agora você pode usar essa partição como se fosse uma partição de disco rígido padrão. Note que se você desmontar a partição, seus dados não serão perdidos, e a RAM não será liberada, já que o kernel aloca permanentemente o espaço requerido até ser reinicializado.

Para automatizar este procedimento, adicione o seguinte ao script /etc/rc.local :

/sbin/mke2fs -q -m 0 /dev/ram0
/bin/mount /dev/ram0 /mnt/ramdisk
/bin/chown username:groupname /mnt/ramdisk
/bin/chmod 0750 /mnt/ramdisk


Ramdisk: Configuração do Exim

Você pode fazer uma montagem de ligação para que o Exim continue a gravar em seu diretório de spool padrão. Para fazer isso, adicione a seguinte linha ao seu arquivo /etc/fstab :

/mnt/ramdisk        /var/spool/exim        none        bind        0 0

Como alternativa, você pode simplesmente apontar o Exim para o ponto de montagem do ramdisk. Para fazer isso, você precisará definir o seguinte no arquivo exim.conf :

spool_directory = /mnt/ramdisk

Obviamente, você faria apenas um dos itens mencionados acima, não ambos.


Uma solução melhor: tmpfs

Em vez de usar um ramdisk, use tmpfs, suportado pelo kernel Linux 2.4 e superior. O benefício de usar o tmpfs é que a memória é dinamicamente atribuível, tornando-a uma solução muito mais flexível do que os discos RAM. Além disso, se a partição tmpfs ficar sem espaço, o kernel iniciará automaticamente os dados de paginação para o disco rígido, enquanto a solução ramdisk simplesmente fará com que o Exim pare de processar mensagens e travar.

Usando o tmpfs, você não precisará executar nenhuma das etapas necessárias para a solução ramdisk acima. As etapas a seguir são necessárias para uma configuração de tmpfs bem-sucedida:

Crie um ponto de montagem e defina as permissões corretas:

mkdir /mnt/tmpfs
chown -R username:groupname /mnt/tmpfs

Em seguida, abra o arquivo /etc/fstab e defina a partição tmpfs a ser criada e montada na inicialização:

#<fs>        <mountpoint>        <type>       <opts>                             <dump/pass>
tmpfs        /mnt/tmpfs          tmpfs        size=1G,nr_inodes=10k,mode=0700    0 0

Isso criará uma partição tmpfs de 1 GB com 10'000 inodes. A configuração exim é a mesma que ao criar um disco virtual - informe ao Exim se o local do novo diretório de spool está localizado em /mnt/tmpfs ou vincule o diretório de spool existente ao /mnt/tmpfs mountpoint. Alternativamente, você poderia apenas montar a partição tmpfs no diretório de spool existente do Exim desde o início - então, em vez das alterações acima no arquivo /etc/fstab , use esta linha:

#<fs>        <mountpoint>        <type>       <opts>                             <dump/pass>
tmpfs        /var/spool/exim     tmpfs        size=1G,nr_inodes=10k,mode=0700    0 0


Este site tem uma boa artigo explicando tmpfs e ramdisks, e as diferenças entre eles.

    
por 07.05.2011 / 16:24
0

Antes de prosseguir, escreva uma mensagem que você enviará aos usuários encontrados pela análise do log do servidor de e-mail informando que o servidor perdeu a mensagem devido a queda de energia / reinicialização / falha / tropeço humano em um cabo de energia. / p>

Os servidores de correio levam muito a sério as garantias de persistência de dados. Eles se esforçam muito para se certificar de que, quando assumem a responsabilidade pelo e-mail do usuário, essa mensagem é segura em disco e sobreviverá a falha / reinicialização ou qualquer outro evento que apague o conteúdo da RAM do sistema. Você vai ter certeza de que seus esforços serão desperdiçados. Tem certeza de que quer fazer isso?

Você perderia os dados do usuário por meio de uma infinidade de cenários, incluindo uma reinicialização ou desligamento de uma máquina. Por favor, procure por alguma outra idéia sobre ajustes de desempenho do servidor de e-mail.

    
por 07.05.2011 / 08:11
0

você pode usar tmpfs e montar um ramdisk, não é complexo.

esta postagem no blog que detalha a criação do tmpfs e a modificação do script de inicialização do exim para torná-lo um pouco mais robusto.

    
por 07.05.2011 / 08:36
0

Eu apenas usaria o / dev / shm que já está montado por padrão na maioria das distribuições Linux modernas.

vz1:~# df -h /dev/shm
Filesystem            Size  Used Avail Use% Mounted on
tmpfs                  12G     0   12G   0% /dev/shm

vz1:~# mount |grep shm
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)

vz1:/dev/shm# dd if=/dev/zero of=5gb.dat bs=1M count=5000 conv=fsync
5000+0 records in
5000+0 records out
5242880000 bytes (5.2 GB) copied, 7.36568 s, 712 MB/s


vz1:/dev/shm# time dd if=5gb.dat of=/dev/null bs=1M
5000+0 records in
5000+0 records out
5242880000 bytes (5.2 GB) copied, 2.70614 s, 1.9 GB/s

Apenas certifique-se de monitorá-lo; preenchê-lo pode ser ruim.

Em seguida, atualize o script de inicialização do Exim init.d para mover os diretórios / var de spool para / dev / shm / em algum lugar.

    
por 07.05.2011 / 20:53
0

Como já foi dito, colocar o diretório de spool na RAM do tempfs é arriscado, pois você pode perder todos os emails na fila se o servidor travar. Eu obtive um desempenho muito bom colocando os diretórios /var/spool/exim/input e /var/spool/exim/msglog em uma unidade SSD (mais de 60000 e-mails enviados por hora em hardware de desktop barato).

O diretório /var/spool/exim/db pode preferencialmente ser colocado em um ramdisk (link simbólico para o qual o diretório / dev / shm é a maneira mais fácil), pois perder dicas de repetição não é fatal.

Também é um fato que o exim será muito ruim se você tiver alguns milhares de e-mails ou mais na fila, pois os processos do corredor de fila gastarão proporcionalmente mais tempo tropeçando uns nos outros e examinando os bloqueios do que recebendo e-mails. Discos rápidos (SSD ou baseados em RAM) certamente ajudam, mas manter a fila pequena é sempre melhor!

    
por 08.05.2013 / 09:17