Excluindo arquivos muito grandes sem congelamento do servidor da web

11

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

Quando tentei excluir o arquivo de log, o servidor web não teve resposta em 10 segundos. (Assistência técnica).

rm -f monthly.log

Existe alguma maneira de excluir esse arquivo grande sem o congelamento do apache?

Jinbom Heo
fonte

Respostas:

23

Gire-o 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
}

em seguida, crie um trabalho cron à meia-noite para excluir o arquivo girado:

30 2 * * * nice -n 19 ionice -c2 -n7 rm -f /path/to/the/log/file.1
quanta
fonte
Você pode explicar o que isso significa / faz?
precisa saber é o seguinte
1
você está 'percebendo' e 'ionizando' a exclusão. O Nice costumava evitar indiscutivelmente qualquer uso excessivo da CPU, mas o mais importante aqui é o ionice, em que você está realmente dizendo ao agendador para excluir o arquivo com uma prioridade mais baixa. -c é para a classe, onde 1 é em tempo real, 2 é normal e 3 é inativo. Na classe 2, você tem de 0 a 7 (IRRC), onde 7 é o mais baixo. Se isso ainda criar problemas, execute-o com 'ionice -c3' e deve ficar bem.
golan
5

Para excluir mais rapidamente arquivos grandes, você pode usar o truncatecomando - Diga para reduzi-lo para um tamanho zero e depois excluí-lo:

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

Como o quanta é recomendado, você deve logá-lo primeiro.

Daniel t.
fonte
Qual é a truncatediferença >?
kojiro
hmm boa pergunta. O resultado é o mesmo, mas não tenho resposta sobre como eles diferem na implementação.
Daniel t.
O truncateé mais fácil de usar do sudoque >. Também é mais fácil com find -exec.
Kubanczyk #
3
echo "0" > monthly.log && rm -f monthly.log
Amit Biyani
fonte
3
Você pode simplesmente >logfilenão precisar fazer eco
user9517
3

Eu truncaria / zeraria o arquivo com a : > /path/to/monthly.logoperação. Em seguida, reinicie o processo Apache e configure a rotação do log para impedir que isso aconteça no futuro ...

Isso ocorre frequentemente, no entanto:

Veja: Existe uma maneira de excluir um arquivo de 100 GB no Linux sem debitar IO / load?

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

Servidor Linux sem espaço

ewwhite
fonte
Não há necessidade de :. Você pode fazer isso #> /path/to/monthly.log
kojiro
Eu sei que é um noop, mas faz mais sentido do ponto de vista instrucional.
ewwhite
... mas então algum instrutor futuro precisa corrigir esse equívoco. Bem, acho que é segurança no emprego.
Kojiro
Não true > /path/to/monthly.logfaria a mesma coisa, e é menos arcaico então :?
Stefan Lasiewski
Provavelmente verdade ...
ewwhite 22/02
3

Se você não precisar 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.logque remove o arquivo).

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

Considere também enviar os logs da web através do syslog (usando /usr/bin/logger, por exemplo). Os logs criados usando o syslog também costumam ter a rotação de log já configurada.

Stefan Lasiewski
fonte
5
Você pode apenas fazer >logfilesem necessidade de gato
user9517
2

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

O Ext3 pode demorar a excluir arquivos grandes porque armazena a localização de cada bloco individual de 4k: um arquivo 50GiB (50 * 1024 ^ 3 bytes) ocupa 13107200 blocos, cada um dos quais é registrado na tabela de inodes como um número de bloco de 32 bits , para um total de 50MiB de dados de contabilidade apenas para acompanhar onde o conteúdo do arquivo está localizado no disco. Essa grande lista de blocos pode estar espalhada por vários blocos indiretos , os quais precisam ser atualizados quando o arquivo é excluído. O disco que busca acessar todos esses blocos indiretos é provavelmente o que está causando o atraso.

O Ext4, por outro lado, aloca arquivos em "extensões" de até 128MiB. Esse arquivo 50GiB pode ser gravado na tabela de inodes 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.

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

Wyzard
fonte
1

Isso se resume a um problema de desempenho do sistema de arquivos. Há uma resposta interessante para essa pergunta SO, mas isso depende bastante do sistema de arquivos que você está usando. Usei o XFS ao criar um sistema de arquivos para armazenar centenas de arquivos MPEG2 de vários gigabytes para o MythTV porque, na época, o desempenho de exclusão do XFS era muito superior ao ext3. As coisas podem ter mudado consideravelmente nos anos seguintes.

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

Tim Potter
fonte
1

O problema vem, suponho, de que você esteja excluindo o arquivo do usuário privilegiado que tem mais prioridade nas operações do disco do que o usuário do servidor web apache. Não importa de que maneira você opte por excluir o arquivo de log (rm -f ou truncar por>), reduza as operações de prioridade de disco para um mínimo:

  ionice -c3 rm -f filename.log
Andrei Mikhaltsov
fonte