Como reduzir o uso de memória do ClamAV?

26

Estou executando um servidor da Web baseado no Ubuntu (Apache, MySQL) em um VPS de 512 MB. Isso é mais que suficiente para o site que está sendo executado (pequeno fórum).

Como eu queria adicionar alguma proteção contra vírus, instalei o ClamAV e o usei para verificar os arquivos enviados como parte do script de manipulação de upload (PHP).

Estou executando o serviço clamav-daemon para que as definições não precisem ser carregadas toda vez que um arquivo for verificado. Uma desvantagem dessa prática parece ser a quantidade "enorme" de memória usada pelo serviço clamav-daemon:> 200 MB. Isso já resultou no serviço sendo forçado a parar e os uploads sendo rejeitados.

Posso simplesmente atualizar a memória do VPS para 1024 MB, mas quero saber se existe uma maneira de reduzir o uso de memória do ClamAV, por exemplo, não carregando definições indesejadas.

Niels R.
fonte

Respostas:

15

O ClamAV mantém as cadeias de pesquisa usando os algoritmos de cadeia clássica (Boyer Moore) e de expressão regular (Aho Corasick). Sendo algoritmos da década de 1970, eles são extremamente eficientes em termos de memória.

O problema é o grande número de assinaturas de vírus. Isso leva as estruturas de dados dos algoritmos a crescer bastante.

Você não pode enviar essas estruturas de dados para troca, pois não há partes das estruturas de dados dos algoritmos acessadas com menos frequência do que outras partes. Se você forçar as páginas a trocarem de disco, elas serão referenciadas momentos depois e serão trocadas novamente. (Tecnicamente, dizemos "o acesso aleatório da estrutura de dados força toda a estrutura de dados a estar no conjunto de memória de trabalho do processo. ".)

As estruturas de dados são necessárias se você estiver verificando a partir da linha de comandos ou a partir de um daemon.

Você não pode usar apenas uma parte das assinaturas de vírus, pois não pode escolher quais vírus serão enviados e, portanto, não pode dizer de que assinaturas precisará.

Aqui está a memória usada em uma máquina de 32 bits executando o Debian Wheezy e é clamd.

# ps_mem.py 
 Private  +   Shared  =  RAM used   Program
281.7 MiB + 422.5 KiB = 282.1 MiB   clamd

Editar: vejo alguém sugerir definir o tamanho do conjunto residente. Se isso for bem-sucedido, ter um tamanho de conjunto residente menor que o tamanho do conjunto de trabalho levará ao processo de troca para e da troca. Isso reduzirá substancialmente o desempenho de todo o sistema. De qualquer forma, a página de manual do Linux para setrlimit (RLIMIT_RSS, ...) diz que definir o tamanho do conjunto residente não é mais suportado e nunca teve nenhum efeito nos processos que optaram por não chamar madvise (MADV_WILLNEED, ...).

vk5tu
fonte
1

Eu encontrei um problema semelhante ao executar o clamd em uma pequena caixa NAS doméstica com apenas 512 MB. De uma pesquisa de perguntas na rede, parece que não há como reduzir o uso de memória. O banco de dados de coisas desagradáveis ​​fica cada vez maior.

É possível configurar o clamav para executar no modo não daemon instalando "clamav" em vez de "clamav-daemon". Isso pode permitir que você tenha mais memória na maioria das vezes. Quando você digitaliza envios, sempre será necessário um grande pedaço de RAM.

davefiddes
fonte
11
A principal desvantagem dessa abordagem é que levará mais tempo para fazer a verificação. Sempre que um arquivo é carregado, o banco de dados precisa ser carregado antes que a verificação possa ser feita. O carregamento do banco de dados leva muitos minutos valiosos se você deseja obter uma resposta rápida para o usuário. Além disso, quando vários uploads são processados ​​ao mesmo tempo, você terá vários threads carregando o banco de dados, resultando em um uso ainda maior de RAM. Daí o uso do daemon. Minha solução foi atualizar meu serviço VPS e pagar 5 USD / mês extra pela RAM extra. Eu posso viver com este aumento de custo :)
Niels R.
1

Esta resposta não foi verificada e pode não funcionar. Ele também não responde como reduzir o uso da memória, mas como limitar o uso da memória, que é um pouco diferente.


Você pode editar o script init do ClamAV (int /etc/init.d/para adicionar o comando ulimit -m amountofram.
Isso limitará a possibilidade do ClamAV e você provavelmente trocará o que provavelmente reduzirá a velocidade de todo o sistema.

Kiwy
fonte