Excluindo arquivos muito grandes sem congelar o servidor

11

No meu servidor web (o apache está em execução, o Linux CentOS), existe um arquivo de log muito grande ( 50 Gbyte ). Este servidor da web possui alguns serviços da web em produção.

Quando tentei excluir o arquivo de log, servidor web não teve resposta cerca de 10 segundos. (Serviço fora do tempo.)

rm -f monthly.log

Existe alguma maneira de excluir este arquivo grande sem congelar o apache?

    
por Jinbom Heo 20.02.2013 / 03:59

8 respostas

23

Gire primeiro via logrotate , usando uma configuração como esta:

/path/to/the/log {
    missingok
    notifempty
    sharedscripts
    daily   
    rotate 7
    postrotate
        /sbin/service httpd reload > /dev/null 2>/dev/null || true
    endscript
    compress
}

crie um cron job à meia-noite para excluir o arquivo girado:

30 2 * * * nice -n 19 ionice -c2 -n7 rm -f /path/to/the/log/file.1
    
por 20.02.2013 / 04:21
5

Para uma exclusão mais rápida de arquivos grandes, você pode usar o comando truncate -  Diga para reduzir para um tamanho de zero e, em seguida, excluí-lo:

 truncate -s 0  monthly.log && rm -f monthly.log

Como o quanta recomendado, você precisa logar primeiro.

    
por 20.02.2013 / 04:42
3
echo "0" > monthly.log && rm -f monthly.log
    
por 20.02.2013 / 07:11
3

Eu truncaria / zeraria o arquivo com a operação : > /path/to/monthly.log . Então, possivelmente, reinicie o processo do Apache e configure a rotação do log para evitar que isso aconteça no futuro ...

Isso acontece com frequência:

Veja: Existe uma maneira de excluir o arquivo de 100GB no Linux sem debulhar IO / carga?

No unix, qual é a melhor maneira de reduzir o tamanho de um arquivo de log massivo que está sendo gravado ativamente?

sem espaço no servidor Linux

    
por 20.02.2013 / 14:25
3

Se você não precisa dos dados, trunque-os usando / dev / null:

cat /dev/null > monthly.log

O servidor da Web continuará gravando dados no arquivo após o truncamento, o que evita a necessidade de reiniciar o servidor da Web (ao contrário de rm monthly.log , que remove o arquivo).

Depois de resolver a crise imediata, considere logrotation como Quanta sugeriu. Você não quer que isso aconteça novamente. Note que os arquivos de log do Apache já são rotacionados por padrão no CentOS

Considere também enviar os logs da web por meio do syslog (usando /usr/bin/logger , por exemplo). Os logs que são criados usando o syslog geralmente também possuem o logrotation configurado.

    
por 20.02.2013 / 05:48
2

Se você estiver usando o sistema de arquivos ext3, considere mudar para o ext4.

Ext3 pode ser lento na exclusão de arquivos grandes porque armazena a localização de cada bloco individual de 4k: um arquivo de 50GiB (50 * 1024 ^ 3 bytes) ocupa 13107200 blocos, cada um deles gravado na tabela de inode como 32- Número de bloco de bits, para um total de 50 MiB de dados de contabilidade apenas para acompanhar onde o conteúdo do arquivo está localizado no disco. Essa grande lista de bloqueios pode estar dispersa em muitos blocos indiretos , todos os quais precisam ser atualizados quando o arquivo é excluído. O disco procurando acessar todos esses blocos indiretos é provavelmente o que está causando o atraso.

O Ext4, por outro lado, aloca arquivos em "extensões" de até 128 MiB. Esse arquivo de 50GiB pode ser gravado na tabela de inode usando apenas 400 registros de extensão, em vez de 13107200 números de bloco individuais, o que reduz drasticamente a quantidade de E / S de disco necessária ao excluir o arquivo.

Note que se você converter um sistema de arquivos ext3 existente no local em ext4, os arquivos novos serão alocados usando extensões, mas os arquivos existentes ainda usarão listas de bloqueio. Você pode usar o comando chattr +e para realocar um arquivo existente usando extensões; Em termos de desempenho, isso é comparável a fazer uma cópia do arquivo e excluir o original.

    
por 27.02.2013 / 02:10
1

Isso se resume a um problema de desempenho do sistema de arquivos. Há uma resposta interessante para isso em esta pergunta SO mas esta depende do sistema de arquivos que você está usando. Eu usei o XFS ao criar um sistema de arquivos para armazenar centenas de arquivos MPEG2 de vários gigabytes para MythTV porque, no momento, o desempenho de exclusão do XFS era muito superior ao ext3 . As coisas podem ter mudado consideravelmente nos anos intermediários.

Eu gosto da resposta do @ quanta. Dividir o arquivo em partes menores levará a uma exclusão mais rápida.

    
por 20.02.2013 / 04:45
1

O problema vem, suponho, que você está excluindo o arquivo do usuário privilegiado que tem mais prioridade às operações de disco do que o usuário do servidor web apache. Não importa de que maneira você escolha excluir o arquivo de log (rm -f ou truncate by >), você deve diminuir suas operações de prioridade de disco para uma mínima:

  ionice -c3 rm -f filename.log
    
por 20.02.2013 / 10:52