디스크 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)를 받아 들일거야에 민감한 것으로 보인다 nice와 ionice, 나처럼 적어도 그것은 서버를 파괴하지 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.