디스크 I / O에 대한 다른 프로세스가 굶주 리지 않도록 하위 트리 제거 (`rm -rf`)를 유지하는 방법은 무엇입니까?


8

사용량이 많은 사이트를위한 매우 큰 (멀티 GB) Nginx 캐시 디렉토리가 있으며 가끔씩 한 번에 지워야합니다. 캐시 폴더를 새 경로로 이동하고 이전 경로에 새 캐시 폴더를 만든 다음 이전 캐시 폴더를 사용하여 과거 에이 문제를 해결했습니다 rm -rf.

그러나 최근에 바쁜 아침에 캐시를 비워야 할 때, I / O rm -rf는 Nginx와 그 앞에있는 서버가 읽기 집약적이기 때문에 서버의 디스크 액세스 프로세스를 고갈시킵니다. CPU가 유휴 상태에 있고 rm -rf디스크 IO의 98-99 %를 차지하는 동안로드 평균 상승을 볼 수 있습니다 iotop.

ionice -c 3호출 할 때 시도했지만 rm관찰 된 동작에 큰 영향을 미치지 않는 것 같습니다.

rm -rf디스크를 더 공유 하기 위해 길들이 는 방법이 있습니까? 단서가 다른 기술을 사용해야 ionice합니까?

최신 정보:

해당 파일 시스템은 AWS EC2 인스턴스 스토어입니다 (기본 디스크는 EBS 임). /etc/fstab항목은 다음과 같습니다 :

/dev/xvdb       /mnt    auto    defaults,nobootwait,comment=cloudconfig 0       2

또한 사용중인 파일 시스템과 방법 (마운트 옵션)도 언급해야합니다.
Cristian Ciupitu

업데이트되었습니다. 또한 중요한 경우 우분투 12.04에 있습니다.
David Eyk

Amazon EBS의 IO 성능은 상당히 나쁠 수 있습니다. perfcap.blogspot.com/2011/03/… 을 참조하십시오. 단기간 (1 분) 버스트가 최대 1000 인 장기 최대 100 개의 iops 를 권장합니다. 따라서 문제.
Moshe Katz

그렇기 때문에 캐시에 EBS가 아닌 인스턴스 스토어를 사용하고 있습니다. 내 업데이트 의견을 참조하십시오. 명확하지 않으면 죄송합니다.
David Eyk

늦어서 죄송하지만 cgroup 및 blkio 컨트롤러를 조사 할 수 있습니다. kernel.org/doc/Documentation/cgroups/blkio-controller.txt
AndreasM

답변:


3

이 페이지에서 수집 된 모든 데이터. 다음은 파일의 큰 디렉토리를 삭제하는 몇 가지 옵션입니다. 이것이 어떻게 만들어 졌는지에 대한 자세한 내용은 기록을 확인하십시오.

명령 경과 시스템 시간 % CPU cs1 * (Vol / Invol)
rsync -a – 삭제 비어 있음 / a 10.60 1.31 95 % 106/22
b /-유형 f 찾기-삭제 28.51 14.46 52 % 14849/11
c /-유형 f 찾기 | xargs -L 100 rm 41.69 20.60 54 % 37048/15074
d / type f 찾기 | xargs -L 100 -P 100 rm 34.32 27.82 89 % 929897/21720
rm -rf f 31.29 14.80 47 % 15134/11

* cs1은 자발적 및 비자발적 인 컨텍스트 전환입니다.


이 이론적으로 질문에 대답 할 수 있습니다 동안, 바람직 할 것이다 여기에 대한 대답의 본질적인 부분을 포함하고 참조 할 수 있도록 링크를 제공합니다.
Tom O'Connor

매혹적인! 시도해 볼게.
David Eyk

rsync지금 실행 중입니다. 아마도 말하기가 너무 이르면 바쁜 아침 중에는 서버를 실행하지 않는 것이 도움이 될 수 있지만 서버는 여전히 응답 성이 있으며 부하 평균을 관리 할 수 ​​있습니다.
David Eyk

내가 사용하는 정확한 호출 :ionice -c 3 nice -19 rsync -a --delete /mnt/empty/ /mnt/nginx-cache-old
David Eyk

네 시간 밖에 걸리지 않았습니다. ;) 나는 간단한 호출과 같은 I로이 답변 (죄송 @aferber)를 받아 들일거야에 민감한 것으로 보인다 niceionice, 나처럼 적어도 그것은 서버를 파괴하지 rm -rf않았다.
David Eyk

9

파일을 제거하면 파일 시스템에서 메타 데이터 작업 만 수행하며, 이는 ionice의 영향을받지 않습니다.

가장 간단한 방법은 지금 디스크 공간이 필요없는 경우 rm사용량이 적은 시간 동안 수행하는 것 입니다.

더 복잡한 방법은 시간이 지남에 따라 삭제를 분산시키는 것입니다. 다음과 같은 것을 시도해 볼 수 있습니다 (경로와 파일 이름에 공백이 없다고 가정하십시오!)

while find dir -type f | head -n 100 | xargs rm; do sleep 2; done
while find dir -type d -depth | head -n 100 | xargs rmdir; do sleep 2; done

또한 rm -f루프가 멈추지 않기 때문에 첫 번째 명령에서 사용할 수 없습니다 ( rm인수가없는 경우 의 오류 종료 코드에 따라 다름 ).

주기 당 삭제 수 (예 : 100)와 휴면 기간을 수정하여 조정할 수 있습니다. 그러나 파일 시스템이 여전히 IO로드에 문제가있는 방식으로 메타 데이터 업데이트를 모을 수 있기 때문에 실제로 작동하지 않을 수 있습니다. 당신은 시도해야합니다.


많은 파일을 제거하는 데 시간이 오래 걸리므로 파일을 포괄 할 "피크가 적은"기간은 없습니다. :(
David Eyk

while루프 할 때 트릭을 할 것으로 보인다 head -n 50. 100은 여전히로드 평균을 임계 이상으로 천천히 올리면서 너무 많은 리소스 경합이 발생하고 있음을 나타냅니다.
David Eyk

얘야, 달리는데 오랜 시간이 걸린다!
David Eyk

find는 여전히 while 루프의 모든 반복에 대해 디렉토리의 모든 파일과 모든 서브 디렉토리를 나열합니다. 당신은 아마 같은 것을 더 잘 할 수
랜디 Orrison

1
find는 여전히 while 루프의 모든 반복에 대해 디렉토리의 모든 파일과 모든 서브 디렉토리를 나열합니다. 당신은 아마 find dir -type f -print0 | xargs -l50 -0 rmwait 여기서 rmwait는 rm "$ @"를 수행하는 스크립트입니다. sleep 2. 공백이있는 파일 이름을 처리하려면 -print0 및 -0을 사용하십시오. -l50은 xargs에 한 번에 50 개만 수행하도록 지시합니다.
랜디 올리 슨

-1

"nice"명령과 함께 사용할 수 있습니다. ionice -c 3 nice -19 rm -rf /some/folder

이것은 기계에서 프로세스의 우선 순위를 변경합니다.


불행히도 nice만큼 효과가있는 것 같습니다 ionice.
David Eyk

@DavidEyk. 멋지고 이오니아가 "눈에 띄는"효과를 나타내지 않는다면, 그 어떤 것도 주목할만한 방식으로 자원에 대항하는 것이 아무것도 아니거나 육안으로 그 효과를 눈치 채지 못하고 있다는 것을 의미합니다. 실제 효과를 보려면 iostat 및 vmstat를 사용하여 벤치마킹해야합니다.
Michael Martinez

@aferber는 그의 대답에서 이것을 해결했다고 생각합니다. "파일 제거는 파일 시스템에서 메타 데이터 작업 만 수행하며, 이는 ionice의 영향을받지 않습니다." CPU 경합과 rm -rf99 %를 유지하는 동안 서버 프로세스가 읽기 시간 동안 굶주리고 있다는 경합을 보았습니다 iotop.
David Eyk
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.