웹 서버 정지없이 매우 큰 파일 삭제


11

내 웹 서버 (apache가 실행 중임, Linux CentOS)에는 매우 큰 로그 파일 ( 50GB )이 있습니다. 이 웹 서버에는 프로덕션에 일부 웹 서비스가 있습니다.

로그 파일을 삭제하려고 할 때 웹 서버에 약 10 초 동안 응답이 없었습니다. (서비스 시간.)

rm -f monthly.log

아파치 동결 없이이 큰 파일을 삭제하는 방법이 있습니까?

답변:


23

다음 logrotate과 같은 구성을 사용하여을 통해 먼저 회전하십시오 .

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

그런 다음 자정에 크론 작업을 만들어 회전 된 파일을 삭제하십시오.

30 2 * * * nice -n 19 ionice -c2 -n7 rm -f /path/to/the/log/file.1

이것이 무엇을 의미하는지 설명 할 수 있습니까?
mowwwalker

1
당신은 삭제를 'nicing'하고 'ionicing'합니다. CPU 과다 사용을 막기 위해 사용 된 것은 좋지만 여기서 가장 중요한 것은 ionice이며, 실제로 스케줄러에게 우선 순위가 낮은 파일을 삭제하도록 지시합니다. -c는 클래스이며, 여기서 1은 실시간, 2 개의 정상 및 3 개의 유휴 상태입니다. 클래스 2 내에는 0에서 7 (IRRC)이 있으며 여기서 7이 가장 낮습니다. 그래도 문제가 발생하면 'ionice -c3'으로 실행하면 문제가 없습니다.
golan

5

큰 파일을 빠르게 삭제하려면 truncate-명령을 사용하여 크기를 0으로 줄인 다음 삭제하십시오.

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

퀀 타가 권장하는 것처럼 먼저 로그 로테이션해야합니다.


truncate와는 어떻게 다른 >가요?
kojiro 2013

흠 좋은 질문입니다. 결과는 동일하지만 구현 방식이 어떻게 다른지 대답이 없습니다.
다니엘 t.

truncate함께 사용하기 쉽습니다 sudo보다 >. 또한 더 쉽습니다 find -exec.
kubanczyk


3

: > /path/to/monthly.log작업으로 파일을 자르거나 제로화합니다 . 그런 다음 Apache 프로세스를 다시 시작하고 향후에 이런 일이 발생하지 않도록 로그 회전을 설정하십시오 ...

그러나 이것은 종종 발생합니다.

참조 : IO /로드를 중단하지 않고 Linux에서 100GB 파일을 삭제하는 방법이 있습니까?

유닉스에서 활발하게 기록되는 대용량 로그 파일의 크기를 줄이는 가장 좋은 방법은 무엇입니까?

공간이 부족한 Linux 서버


필요 없습니다 :. 당신은 그냥 할 수 있습니다> /path/to/monthly.log
kojiro

나는 그것이 알고 noop있지만 교육 관점에서 더 의미가 있습니다.
ewwhite

… 그러나 미래의 어떤 강사는 오해 를 바로 잡아야 합니다 . 글쎄, 나는 그것이 직업 안전이라고 생각한다.
kojiro

하지 않을까요 true > /path/to/monthly.log같은 일을하고, 그 다음에 덜 구식이다 :?
Stefan Lasiewski 1

아마 사실입니다.
ewwhite

3

데이터가 필요하지 않은 경우 / dev / null을 사용하여 자릅니다.

cat /dev/null > monthly.log

웹 서버는 잘린 후에도 파일에 데이터를 계속 기록하므로 파일 rm monthly.log을 제거하는 (와 달리 ) 웹 서버를 다시 시작할 필요가 없습니다 .

즉각적인 위기를 해결 한 후 Quanta가 제안한대로 로그 로테이션을 고려하십시오. 이런 일이 다시 일어나길 원하지 않습니다. Apache 로그 파일은 CentOS에서 기본적으로 이미 회전되어 있습니다.

syslog를 통해 웹 로그를 보내는 것도 고려하십시오 ( /usr/bin/logger예 :) . syslog를 사용하여 생성 된 로그에는 일반적으로 이미 로그 로테이션이 설정되어 있습니다.


5
당신은 할 수 없다 >logfile고양이에 대한 필요
user9517

2

ext3 파일 시스템을 사용하는 경우 ext4로 전환하십시오.

Ext3은 모든 개별 4k 블록의 위치를 ​​저장하기 때문에 대용량 파일을 삭제하는 데 시간이 오래 걸릴 수 있습니다. 파일 내용이 디스크에서 어디에 있는지 추적하기 위해 총 50MiB의 부기 데이터가 있습니다. 이 큰 블록 목록은 많은 간접 블록에 흩어져있을 수 있으며 파일을 삭제할 때 모두 업데이트해야합니다. 이러한 모든 간접 블록에 액세스하려는 디스크는 아마도 지연의 원인 일 수 있습니다.

반면 Ext4는 최대 128MiB의 "extents"에 파일을 할당합니다. 이 50GiB 파일은 13107200 개별 블록 번호가 아닌 400 개의 익스텐트 레코드를 사용하여 inode 테이블에 기록 할 수 있으므로 파일을 삭제할 때 필요한 디스크 I / O의 양이 크게 줄어 듭니다.

기존 ext3 파일 시스템을 대신하여 ext4로 변환하면 파일이 범위를 사용하여 할당되지만 기존 파일은 여전히 ​​차단 목록을 사용합니다. chattr +e명령을 사용하여 범위를 사용하여 기존 파일을 재 할당 할 수 있습니다 . 성능 측면에서 이것은 파일을 복사 한 다음 원본을 삭제하는 것과 비슷합니다.


1

이것은 파일 시스템 성능 문제로 귀결됩니다. 이 SO 질문 에는 이것에 대한 흥미로운 대답이 있지만 이것은 사용중인 파일 시스템에 따라 다릅니다. XFS 의 삭제 성능이 ext3보다 훨씬 우수했기 때문에 MythTV에 수백 개의 멀티 기가 바이트 MPEG2 파일을 저장하기 위해 파일 시스템을 만들 때 XFS를 사용했습니다 . 개입 년 동안 상황이 크게 변경되었을 수 있습니다.

@quanta의 답변을 좋아합니다. 파일을 작은 부분으로 나누면 더 빨리 삭제됩니다.


1

문제는 아파치 웹 서버 사용자보다 디스크 작업보다 우선 순위가 높은 권한있는 사용자로부터 파일을 삭제한다고 가정합니다. 로그 파일을 삭제하도록 선택한 방법 (rm -f 또는 truncate by>)에 관계없이 디스크 우선 순위 작업을 최소로 낮춰야합니다.

  ionice -c3 rm -f filename.log
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.