내 XFS 파일 시스템이 갑자기 더 많은 공간을 사용하고 스파 스 파일로 가득 찬 이유는 무엇입니까?


62

나는 실행했습니다 XFS 파일 시스템 의 다양한 리눅스 서버에서 거의 10 년 동안 데이터 / 성장 파티션 등을.

버전 6.2 이상을 실행하는 최근 CentOS / RHEL 서버에서 이상한 현상이 나타났습니다.

EL6.0 및 EL6.1에서 최신 OS 버전으로 이동 한 후 안정적인 파일 시스템 사용이 매우 다양해졌습니다. EL6.2 +와 함께 처음 설치된 시스템은 동일한 동작을 나타냅니다. XFS 파티션에서 디스크 사용률의 급격한 변동을 보여줍니다 ( 아래 그래프 의 파란색 선 참조).

이전과 이후. 6.1에서 6.2로 업그레이드는 토요일에 이루어졌습니다. xfs 그래프

같은 시스템의 지난 분기 디스크 사용량 그래프는 지난 주 변동을 보여줍니다. 여기에 이미지 설명을 입력하십시오

파일 시스템에서 큰 파일과 런 어웨이 프로세스 (로그 파일 등)를 확인하기 시작했습니다. 나는 나의 가장 큰 파일에서 다른 값을보고 한 것을 발견 du하고 ls. 스위치를 du사용하거나 사용하지 않고 실행 --apparent-size하면 차이가 나타납니다.

# du -skh SOD0005.TXT
29G     SOD0005.TXT

# du -skh --apparent-size SOD0005.TXT
21G     SOD0005.TXT

전체 파일 시스템 에서 ncdu 유틸리티 를 사용하여 빠른 검사를 수행했습니다 .

Total disk usage: 436.8GiB  Apparent size: 365.2GiB  Items: 863258

파일 시스템은 이전 버전의 OS / 커널과 비교할 때 거의 70GB의 공간 이 부족한 스파 스 파일 로 가득 합니다!

Red Hat Bugzilla 와 변경 로그를 통해 XFS와 관련하여 동일한 동작 또는 새로운 공지 사항이 있는지 확인했습니다.

나다.

업그레이드하는 동안 커널 버전 2.6.32-131.17.1.el6 에서 2.6.32-220.23.1.el6 으로 갔습니다 . 부 버전 번호에는 변화가 없습니다.

filefrag도구로 파일 조각화를 확인했습니다 . XFS 파티션에서 가장 큰 파일 중 일부는 수천 개의 익스텐트를 가졌습니다. xfs_fsr -v활동이 느린 기간 동안 온라인 조각 모음을 실행 하면 디스크 사용량이 일시적으로 줄어 들었습니다 (위의 첫 번째 그래프에서 수요일 참조). 그러나 과도한 시스템 활동이 재개 되 자마자 사용량이 급증했습니다.

여기서 무슨 일이 일어나고 있습니까?


2
음 .. 광장 ..
톰 오코너

답변:


76

이 문제 는 2010 년 12 월부터 XFS 소스 트리 에 대한 커밋에 대한 논의로 거슬러 올라갑니다 .이 패치는 커널 2.6.38에서 도입되었습니다 (그리고 나중에 일부 인기있는 Linux 배포 커널로 백 포트되었습니다).

디스크 사용량의 변동은 새로운 기능의 결과입니다. XFS 동적 추론 EOF 사전 할당 .

이것은 파일 크기가 증가함에 따라 공간을 추측 적으로 할당하여 스트리밍 쓰기 중 파일 조각화를 줄입니다. 파일 당 사전 할당 된 공간의 양은 동적이며 주로 파일 시스템에서 사용 가능한 여유 공간의 기능입니다 (공간 부족을 완전히 방지).

이 일정을 따릅니다.

freespace       max prealloc size
  >5%             full extent (8GB)
  4-5%             2GB (8GB >> 2)
  3-4%             1GB (8GB >> 3)
  2-3%           512MB (8GB >> 4)
  1-2%           256MB (8GB >> 5)
  <1%            128MB (8GB >> 6)

이것은 내가 다루는 대규모 조각화 된 파일 중 일부에 도움이 될 수 있으므로 파일 시스템에 흥미로운 추가 기능입니다.

다음을 사용하여 페이지 캐시, 덴 트리 및 inode를 해제하여 추가 공간을 임시로 회수 할 수 있습니다.

sync; echo 3 > /proc/sys/vm/drop_caches

allocsize파일 시스템 마운트 중에 값 을 정의하여 기능을 완전히 비활성화 할 수 있습니다 . XFS의 기본값은 allocsize=64k입니다.

이 변경의 영향은 아마도 모니터링 / 임계 값 시스템 (내가 파악한 방식)에 의해 느껴질 수 있지만 데이터베이스 시스템 에도 영향을 미쳤 으며 씬 프로비저닝 된 가상 머신 및 스토리지 어레이에 대해 예측할 수 없거나 바람직하지 않은 결과를 초래할 수 있습니다. 예상보다 많은 공간).

배포 수준에서 또는 XFS 메일 링리스트 를 모니터링 할 때 파일 시스템 변경 사항이 명확하게 알려지지 않았기 때문에 전혀 문제가되지 않았습니다 .


편집 :
이 기능을 사용하여 XFS 볼륨의 성능이 크게 향상되었습니다. 이전에 최대 50 % 조각화를 표시 한 볼륨에서 일관된 <1 % 조각화를보고 있습니다. 쓰기 성능이 전 세계적으로 향상되었습니다!

레거시 XFS를 EL6.3의 버전과 비교하여 동일한 데이터 세트의 통계입니다.

낡은:

# xfs_db -r -c frag /dev/cciss/c0d0p9
actual 1874760, ideal 1256876, fragmentation factor 32.96%

새로운:

# xfs_db -r -c frag /dev/sdb1
actual 1201423, ideal 1190967, fragmentation factor 0.87%

4
백만 개의 찬사와 나의 왕국
Joel E Salas

1
감사합니다! 우리는 우분투 데비안 짜기에서 업그레이드 및 뒤와 LS가 (64Mb의 대 예를 들어 50Mbps를.) 좀 큰 파일을 같은 격렬하게 서로 다른 값을 보여주는 이유 궁금했던
자일스 토마스

1
@ewwhite 공간을 확보하기 위해이 기능을 해제 했습니까? 아니면이 기사가 방금 말한 것입니다.이 기능이보고 된 크기의 불일치를 일으키는 원인입니까? "데이터베이스 시스템 또는 씬 프로비저닝 된 VM에서이 기능을 끄십시오"라고 들리지만 궁극적으로 무엇을하기로 결정했는지는 확실하지 않습니다.
JDS

2
@jds 내가 남겨 둡니다. 조각화를 제거하고 내 응용 프로그램의 성능을 향상 시켰습니다.
ewwhite

3
오, 훌륭한 발견. 35GB 파일에서 750GB를 사용하고있었습니다. xfs_fsr약 35GB로 돌아간 후 . 나는
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.