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?
linux
apache-2.2
centos
Jinbom Heo
fonte
fonte
Para excluir mais rapidamente arquivos grandes, você pode usar o
truncate
comando - Diga para reduzi-lo para um tamanho zero e depois excluí-lo:Como o quanta é recomendado, você deve logá-lo primeiro.
fonte
truncate
diferença>
?truncate
é mais fácil de usar dosudo
que>
. Também é mais fácil comfind -exec
.fonte
>logfile
não precisar fazer ecoEu truncaria / zeraria o arquivo com a
: > /path/to/monthly.log
operaçã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
fonte
:
. Você pode fazer isso #> /path/to/monthly.log
noop
, mas faz mais sentido do ponto de vista instrucional.true > /path/to/monthly.log
faria a mesma coisa, e é menos arcaico então:
?Se você não precisar dos dados, trunque-os usando / dev / null:
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 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.fonte
>logfile
sem necessidade de gatoSe 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 +e
comando 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.fonte
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.
fonte
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:
fonte