ZFS에서 10M + 파일을 효과적으로 삭제


30

/ tmp 아래에 약 30M 파일을 실수로 생성 한 버그가있는 프로그램을 작성했습니다. (버그는 몇 주 전에 소개되었으며 초당 몇 개의 서브 디렉토리를 작성하고있었습니다.) / tmp의 이름을 / tmp2로 바꾸고 파일을 삭제해야합니다. 시스템은 FreeBSD 10이고 루트 파일 시스템은 zfs입니다.

한편 미러의 드라이브 중 하나가 잘못되어 교체했습니다. 드라이브에는 2 개의 120GB SSD 디스크가 있습니다.

문제는 다음과 같습니다. 하드 드라이브를 교체하고 전체 어레이를 리 실버 링하는 데 1 시간도 걸리지 않았습니다. / tmp2 파일 삭제는 또 다른 이야기입니다. 파일을 제거하기 위해 다른 프로그램을 작성했으며 초당 30-70 개의 하위 디렉토리 만 삭제할 수 있습니다. 모든 파일을 삭제하는 데 2-4 일이 걸립니다.

전체 어레이를 리 실버 링하는 데 1 시간이 걸리지 만 디스크에서 삭제하는 데 4 일이 걸립니까? 왜 성능이 좋지 않습니까? 초당 70 회 삭제는 매우 나쁜 성능으로 보입니다.

/ tmp2의 inode를 수동으로 삭제할 수는 있지만 공간을 확보하지 못합니다.

이것이 zfs 나 하드 드라이브에 문제가 될 수 있습니까?


1
저는 zfs 전문가가 아니므로 성능 조정 또는 개선을 위해 수행 할 수있는 작업에 대해 이야기 할 수 없습니다 (많은 정보가 필요하고 전문가가 직접 수행하는 것이 가장 좋습니다). 그러나 리 실버 링은 블록 수준에서 발생하지만 삭제는 파일 시스템 수준에서 발생한다고 말할 수 있습니다. 파일 시스템은 이와 같은 Bagillion Inode 버퍼를 삭제할 때 대부분 오버 헤드를 갖습니다.
스풀러

당신의 게시하시기 바랍니다 df -hzpool listzfs list.
ewwhite

5
다른 프로그램 작성 : 일 rm -rf /tmp2을하지 않습니까?
Thorbjørn Ravn Andersen

2
재부팅 만 할 수 있습니까? 파일 시스템 /tmp이어야하며 tmpfs메모리에 저장됩니다.
믹서기

답변:


31

ZFS에서의 삭제는 비용이 많이 듭니다. 중복 제거 된 파일을 역 참조하면 비용이 많이 들기 때문에 파일 시스템에서 중복 제거를 활성화 한 경우 더욱 그렇습니다. 스냅 샷도 문제를 복잡하게 만들 수 있습니다.

/tmp포함 된 데이터 대신 디렉토리를 삭제하는 것이 좋습니다 .

경우 /tmp하여 ZFS 파일 시스템이며, 그것을 삭제하고 다시 만들 수 있습니다.


1
@nagylzs이 경우 별도의 ZFS 파일 시스템으로 만드는 것이 좋습니다. 그런 다음 현재 / tmp를 방해하지 않고 새 / tmp를 제자리로 옮기고 시스템 여가에 파일을 삭제할 수 있습니다. 결과 : ionice삭제가 실행되는 동안 최소 가동 중지 시간과 약간의 성능 저하 ( FreeBSD가 있다고 가정하고 완화 가능 )가 있습니다.
CVn

9
내가 틀렸어. 별도의 파일 시스템이었습니다. 작동 방식은 다음과 같습니다. 단일 사용자 모드로 재부팅 한 다음 "zfs delete zroot / tmp; zfs create zroot / tmp; chmod 41777 / tmp"
nagylzs

6
총 가동 중지 시간은 5 분이었습니다. 환상적인! :-)
nagylzs

1
글쎄, 그것은 또한 내가 가진 우려에 대해 이야기한다. 파이크를 삭제하면 스냅 샷 때문에 공간을 확보 할 수 없다. 그러나 TMP는 자동으로주기적인 스냅 샷,하지 수 있도록 설정됩니다 권리 ?
JDługosz

1
실제로 이것은 다음과 같습니다. zfs create -o compression = on -o exec = on -o setuid = off zroot / tmp; chmod 1777 / zroot / tmp; zfs set mountpoint = / tmp zroot / tmp; 그래도 자동 스냅 샷을 끄는 방법을 잘 모르겠습니다. "zfs set com.sun : auto-snapshot = false"가 있지만 솔라리스에서만 작동한다고 생각합니다.
nagylzs

27

전체 어레이를 리 실버 링하는 데 1 시간이 걸리지 만 디스크에서 삭제하는 데 4 일이 걸립니까?

사무실 건물을 고려하십시오.

모든 층의 모든 사무실에서 모든 컴퓨터와 가구 및 고정물을 제거하는 시간 이 오래 걸리지 만 다른 클라이언트가 즉시 사무실을 사용할 수 있습니다.

RDX와 건물 전체를 철거하는 것은입니다 훨씬 빨리,하지만 다음 클라이언트는 매우 가능성이 곳이 얼마나 통풍이 잘되는 대해 불평합니다.


5
ZFS는 사무실 건물 : 아니다
developerbmw

9
@developerbmw에도 실제로 파일이나 폴더가 없지만 진행 상황을 이해하기 위해 은유 적 인 개념이 필요합니다.
JamesRyan

2
@JamesRyan 그렇습니다 그것은 실제로 좋은 비유입니다 ... 난 그냥 바보 였어요
developerBmw

5

여기에는 여러 가지 일이 있습니다.

첫째, 모든 최신 디스크 기술은 대량 전송에 최적화되어 있습니다. 100MB의 데이터를 이동해야하는 경우, 데이터가 분산되어 있지 않고 하나의 연속 된 블록에 있으면 훨씬 더 빠르게 수행됩니다. SSD는 여기에서 많은 도움을 주지만 심지어 인접한 블록의 데이터를 선호합니다.

둘째, 디스크 작업이 진행되는 한 리실 버닝은 매우 최적입니다. 한 디스크에서 대량의 연속 된 데이터 청크를 읽고 빠른 CPU 작동을 수행 한 다음 다른 큰 연속 된 청크로 다른 디스크에 다시 씁니다. 전원 공급이 중단되면 큰 문제가 발생하지 않습니다. 잘못된 체크섬이있는 데이터는 무시하고 평소대로 계속 수행하면됩니다.

셋째, 파일 삭제가 실제로 느립니다 . ZFS는 특히 나쁘지만 실제로 모든 파일 시스템은 삭제 속도가 느립니다. 디스크에있는 많은 수의 서로 다른 데이터 청크를 수정하고 올바르게 시간을 정하여 (즉 대기) 전원이 꺼질 때 파일 시스템이 손상되지 않도록해야합니다.

전체 어레이를 리 실버 링하는 데 1 시간이 걸리지 만 디스크에서 삭제하는 데 4 일이 걸립니까?

리 실버 링은 디스크 속도가 매우 빠르며 삭제는 디스크 속도가 느립니다. 메가 바이트 디스크 당 약간의 리 실버 링 만하면됩니다. 해당 공간에 수천 개의 파일이있을 수 있으며 삭제해야합니다.

초당 70 회 삭제가 매우 나쁜 성능으로 보입니다.

따라 다릅니다. 나는 이것에 놀라지 않을 것이다. 사용중인 SSD 유형에 대해서는 언급하지 않았습니다. 최신 Intel 및 Samsung SSD는 이러한 종류의 작업 (읽기-수정-쓰기)에 능숙하며 더 나은 성능을 제공합니다. 더 싸고 오래된 SSD (예 : Corsair)는 느려집니다. IOPS (초당 I / O 작업 수)가 결정 요인입니다.

ZFS 특히 삭제 속도 느립니다. 일반적으로 백그라운드에서 삭제를 수행하므로 지연이 표시되지 않습니다. 당신이 그들 중 많은 수를하고 있다면 그것을 숨길 수 없으며 지연시켜야합니다.


부록 : 삭제가 왜 느린가요?

  • 파일을 삭제하려면 몇 가지 단계가 필요합니다. 파일 메타 데이터는 '삭제됨'으로 표시되어야하며 결국 공간을 재사용 할 수 있도록 재생해야합니다. ZFS는 '로그 구조화 된 파일 시스템'으로, 무언가 만 만들거나 삭제하지 않는 경우 가장 잘 수행됩니다. 로그 구조는 무언가를 삭제하면 로그에 차이가 있으므로 차이를 채우기 위해 다른 데이터를 재배치 (조각 모음)해야 함을 의미합니다. 이것은 사용자에게는 보이지 않지만 일반적으로 느립니다.
  • 전원 공급이 중단 되더라도 파일 시스템이 일관되게 유지되도록 변경해야합니다. 종종 이것은 디스크가 데이터가 실제로 미디어에 있음을 확인할 때까지 대기하는 것을 의미합니다. SSD의 경우 시간이 오래 걸릴 수 있습니다 (수백 밀리 초). 이것의 최종 효과는 더 많은 부기 (즉, 디스크 I / O 작업)가 있다는 것입니다.
  • 모든 변경 사항이 작습니다. 전체 플래시 블록 (또는 자기 디스크 용 실린더)을 읽고, 쓰고, 지우는 대신 약간 수정해야합니다. 이렇게하려면 하드웨어가 전체 블록 또는 실린더에서 읽고 메모리에서 수정 한 다음 미디어에 다시 써야합니다. 시간이 오래 걸립니다.

ZFS에 대해서는 잘 모르지만 일부 파일 시스템에서는 디렉토리를 내용과 연결 해제 할 수 있지만 가비지 수집 / 조각 모음 / 정리 단계 중에 해당 내용을 나중에 제거해야합니다. ZFS에 게으른 삭제를 수행하는 유틸리티가 있습니까? 실제로 OP의 삭제 속도를 높이지는 않지만 하우스 키핑 중에 암시 적으로 발생하면 문제를 덜 수 있습니다.
Vality

2

전체 어레이를 리 실버 링하는 데 1 시간이 걸리지 만 디스크에서 삭제하는 데 4 일이 걸립니까?

두 작업이 파일 시스템 스택의 다른 계층에서 작동하기 때문에 가능합니다. 리 실버 링은 낮은 수준으로 실행될 수 있으며 실제로 개별 파일을 볼 필요가 없으므로 한 번에 많은 양의 데이터를 복사합니다.

왜 성능이 좋지 않습니까? 초당 70 회 삭제는 매우 나쁜 성능으로 보입니다.

많은 부기를해야합니다 ...

/ tmp2의 inode를 수동으로 삭제할 수는 있지만 공간을 확보하지 못합니다.

ZFS는 알지 못하지만 자동으로 복구 할 수 있다면 결국에는 이미 수행중인 것과 동일한 작업을 백그라운드에서 수행 할 수 있습니다.

이것이 zfs 나 하드 드라이브에 문제가 될 수 있습니까?

zfs scrub뭐라고 합니까 ?


2

많은 파일을 삭제하는 것은 결코 빠른 작업이 아닙니다.

모든 파일을 삭제하려면 파일 시스템을, 당신은 파일 인덱스, 제거 (또는 삭제 된 것으로 표시) 인덱스에있는 파일 항목을 읽을 필요 파일로 할당 된 공간을 파일과 관련된 다른 메타 데이터를 제거하고, 표시 미사용. 이 작업은 각 파일을 삭제할 때마다 개별적으로 수행해야하므로 많은 파일을 삭제하려면 많은 작은 I / O가 필요합니다. 정전시 데이터 무결성을 보장하는 방식으로이를 수행하려면 더 많은 오버 헤드가 발생합니다.

ZFS가 도입 한 특성이 없더라도 3 천만 개의 파일을 삭제하면 일반적으로 1 억 개 이상의 개별 I / O 작업이 필요합니다. 이 조차 빠른 SSD에 시간이 오래 걸릴. 다른 사람들이 언급했듯이 ZFS의 디자인은이 문제를 더욱 복잡하게 만듭니다.


2

Ian Howson은 왜 느린 지에 대한 좋은 대답을합니다.

파일을 병렬로 삭제하면 삭제로 인해 속도가 증가하여 동일한 블록을 사용할 수 있으므로 동일한 블록을 여러 번 다시 쓰는 것을 저장할 수 있습니다.

그래서 시도하십시오 :

find /tmp -print0 | parallel -j100 -0 -n100 rm

초당 70 회 삭제보다 성능이 좋은지 확인하십시오.


0

생각을 뒤집어 놓으면 아주 간단합니다.

  1. 두 번째 드라이브를 얻으십시오 (이미 이미 가지고있는 것 같습니다)

  2. / tmp 디렉토리를 제외하고 rsync를 사용하여 A 드라이브에서 B 드라이브로 모든 것을 복사하십시오. Rsync는 블록 복사보다 느립니다.

  3. 드라이브 B를 새 부팅 볼륨으로 사용하여 재부팅

  4. 드라이브 A를 다시 포맷하십시오.

이것은 또한 드라이브 조각 모음을 수행하고 새로운 디렉토리를 제공합니다 (예 : SSD의 경우 조각 모음이 그렇게 중요하지 않지만 파일을 선형화하면 아무것도 손상되지 않습니다)


우선 / tmp를 제외한 모든 것을 복사 하시겠습니까? 그래서 / dev와 / proc? 두 번째로, 특히 프로덕션 서버에서 나에게 약간의 소리가 들립니다.
Hennes

파일이 아닌 파일, 탑재 된 볼륨 및 가상 메모리 폴더를 제외하기에 충분히 똑똑하다고 가정합니다. 여기에서 대부분 추측 할 수 없습니다. 또는 중요하지 않은 유지 관리 부팅에서 수행하십시오.
피터

zfs send/recv루트 파일 시스템 (이 경우 / tmp가있는 곳)을 제외한 다른 모든 파일 시스템을 (블록 레벨 복사)하고 루트 파일 시스템의 나머지 데이터를 수동으로 복사 할 수 있다고 생각합니다 (물론 / tmp 제외).
user121391

2
그러면 스냅 샷이 손실되고 일부 안정성 기능이 무시됩니다. zfs를 사용하는 요점이 없습니다.
JDługosz

2
@ JDługosz 유효한 포인트이지만 사용자가 관심을 갖는 경우에만 해당됩니다. "백업이 손상되었습니다. 어떻게 복구합니까?" -> "백업 파일이 필요하십니까?" -> "아니요" -> "재 포맷".
peter

-1

정렬되지 않은 목록에 3 천만 개의 항목이 있습니다. 제거하려는 항목의 목록을 스캔하여 제거합니다. 이제 정렬되지 않은 목록에 29,999,999 개의 항목 만 있습니다. 그것들이 모두 / tmp에 있다면 왜 재부팅을하지 않습니까?


문제의 성명 : 코멘트의 정보를 반영하기 위해 편집 한 대부분의 제거를, 전부는 아니지만 ,의 / tmp를 30M + 잘못 생성 된 파일의 시간이 오래 걸립니다.
문제 1) / tmp에서 원하지 않는 많은 파일을 제거하는 가장 좋은 방법입니다.
문제 2) 왜 파일을 삭제하는 것이 느린 지 이해하십시오.

해결 방법 1)-대부분의 * nix 배포에 의해 부팅시 / tmp가 비워집니다. 그러나 FreeBSD는 그중 하나가 아닙니다.
1 단계-흥미로운 파일을 다른 곳에 복사하십시오.
2 단계-루트로

 $ grep -i tmp /etc/rc.conf  
 clear_tmp_enable="YES" # Clear /tmp at startup.  

3 단계-재부팅
4 단계-clear_tmp_enable을 다시 "아니오"로 변경하십시오.
원하지 않는 파일은 이제 FreeBSD에서 ZFS로 사라졌습니다. 가 모든 데이터를 스캔하고 모든 해당 메타 데이터를 업데이트하지 않아도되므로 데이터 세트를 삭제하는 것이 데이터 세트에있는 모든 파일을 삭제하는 것보다 훨씬 빠릅니다. " 부팅시해야 할 일은 / tmp 데이터 셋에 대한 메타 데이터를 재설정하는 것입니다. 이것은 매우 빠릅니다.

해결책 2) 왜 그렇게 느린가? ZFS는 일정한 시간 디렉토리 액세스와 같은 기능을 포함하는 훌륭한 파일 시스템입니다. 이것은 당신이하고있는 일을 알고 있다면 잘 작동하지만 증거는 OP가 ZFS 전문가가 아니라는 것을 암시합니다. OP는 파일을 제거하려고 시도한 방법을 나타내지 않았지만 "regex -exec rm {} \;"에 대한 변형을 사용했다고 생각합니다. 이것은 작은 숫자로 잘 작동하지만 3 개의 직렬 작업이 진행 중이기 때문에 확장되지 않습니다 .1) 사용 가능한 파일 목록 가져 오기 (해시 순서로 3 천만 파일 반환), 2) 정규식을 사용하여 삭제할 다음 파일 선택, 3 ) 3 천만 목록에서 해당 파일을 찾아 제거하도록 OS에 지시합니다. 심지어 경우 ZFS는 메모리로부터리스트를 반환 하는 경우를 '찾아서'캐시하면 정규식은 목록에서 처리 할 다음 파일을 식별 한 다음 OS에 메타 데이터를 업데이트하여 변경 사항을 반영한 다음 목록을 업데이트하여 다시 처리하지 않도록해야합니다.


1
나는 당신이 그 질문을 오해했다고 생각합니다. 대부분의 파일을 제거해야했습니다. 즉, 30M + 파일입니다.
nagylzs

재부팅시 @nagylzs / tmp가 지워집니다. 삭제하려는 경우 가장 , 당신은 유지하려는 일부 , 즉 미만의 절반, 그래서 당신은 유지하려는 사람을 복사 한 다음 나머지를 제거하는 재부팅합니다. 삭제가 너무 느린 이유는 디렉토리에 많은 수의 파일이 있으면 조작 할 파일을 찾기 위해 처리해야하는 정렬되지 않은 목록이 많아지기 때문에 시간이 걸리기 때문입니다. 여기서 유일한 문제는 PEBCAK입니다.
Paul Smith

Zfs 디렉토리가 정렬되지 않았 습니까? zfs가 특히 큰 디렉토리를 잘 처리한다고 생각했습니다.
JDługosz

음, / tmp는 지워지지 않고 X 관련 파일 만 지워집니다. 적어도 FreeBSD에서는. rc 스크립트가 정상적으로 삭제 되려면 며칠이 걸리기 때문에 부팅시에는 지울 수 없습니다.
nagylzs

@JDlugosz-ZFS가 가장 낫지 만 inode 목록 (모든 디렉토리)은 정렬되지 않습니다.
Paul Smith
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.