파일이 디스크에 순차적으로 저장됩니까?


22

내가 이해했듯이 "스파 스 파일"은 파일에 '갭'이있을 수 있으므로 실제 사용 된 데이터가 논리 파일 크기보다 작을 수 있음을 의미합니다.

Linux 파일 시스템은 디스크에 파일을 어떻게 저장합니까? 나는 주로 ext4에 관심이 있습니다. 그러나:

  1. 파일이 저장 될 수 없습니다 디스크에 순차적으로? 즉, 파일의 일부는 물리적 주소 X에 있고 다음 부분은 물리적 주소 Y에 있으며 X + 오프셋에 가깝지 않습니다.
  2. 어떻게 든 파일 순차를 제어 할 수 있습니까?
    10GB의 파일을 할당하고 싶습니다. 디스크에서 순차적이며 다른 오프셋으로 나누지 않기를 원합니다.
  3. 다른 유형간에 다르게 작동합니까?


1
아마도 귀하의 의도를 올바르게 이해한다면 파일 시스템 계층을 거치지 않고 저장 장치로 작업하는 하위 수준 API에 더 관심이있을 것입니다. 그러면 진입 점 dmsetup은 장치 매퍼에 대한 인터페이스 인 프로그램 이 될 수 있습니다 . 데이터베이스와 같은 스토리지를 계획하는 경우이 방법이 좋습니다.
wvxvw

4
이것은 파일 시스템의 구현 세부 사항입니다. 거의 모든 파일 시스템 기본적으로 조각 파일을 수행 합니다. 만 iso9660하고 romfs그 일을 불가능하고 (이 중 내가-머리를 나열 할 수 있습니다) 연속 저장 공간을 필요로한다.
mirabilos

2
파일이 디스크에서 연속적인지 여부에 관계없이 파일의 다른 부분을 찾지 않으면 데이터 읽기 / 쓰기는 항상 연속적입니다. 그렇다면 왜 이것에 관심이 있습니까? 조각화가 성능에 영향을 미치는 심각한 문제가 아닌 한
phuclv

3
@hudac을 염두에 두어야 할 한 가지는 인접한 것이 실제로 유용한 것은 아니라는 것입니다. 쉬운 방법은 조각화가 그다지 중요하지 않은 플래시이지만 회전하는 플래터에서는 여전히 인접한 데이터의 이점을 얻지 못할 수 있습니다. 회전하는 플래터에서는 액세스 패턴과 데이터의 위치를 ​​고려해야합니다. 머릿속으로 지나간 섹터가 필요하면 다시 완전히 돌아올 때까지 기다려야합니다. 최상의 결과를 얻으려면 데이터를 읽어야 할 때 "가까이"있도록 데이터를 엇갈리게하십시오. 캐시 크기를 늘리는 것이 더 쉽다 ;-)
Ukko

답변:


41

파일이 저장 될 수 없습니다 디스크에 순차적으로? 파일의 일부는 물리적 주소 X 아래에 있고 다른 부분은 물리적 주소 Y 아래에 있으며 X + 오프셋에 가깝지 않습니다.

예; 이것은 파일 조각화로 알려져 있으며 특히 큰 파일에서는 드문 일이 아닙니다. 대부분의 파일 시스템은 필요에 따라 공간을 필요에 따라 순차적으로 할당하지만 향후 동작을 추측 할 수는 없습니다. 따라서 파일에 200MiB를 쓴 다음 100MiB를 더 추가하면 두 데이터 세트가 모두 0이 될 가능성은 없습니다 디스크의 다른 영역에 저장해야합니다 (기본적으로 디스크에 더 많은 공간이 필요한 다른 쓰기는 첫 번째 쓰기 이후와 두 번째 쓰기 이전에 발생 함). 파일 시스템이 거의 가득 찬 경우 상황은 일반적으로 더 나빠질 수 있습니다. 새 파일을 보유 할만큼 충분한 여유 공간 영역이 없을 수 있으므로 조각화해야합니다.

어떻게 든 파일 순차를 제어 할 수 있습니까? 10GB의 큰 파일을 할당하고 싶습니다. 디스크에서 순차적이며 다른 오프셋으로 나누지 않기를 원합니다.

파일 시스템을 만들 때 파일의 대상 크기를 파일 시스템에 알려줄 수 있습니다. 이렇게하면 파일 시스템이 파일을 최적으로 저장하는 데 도움이됩니다. 많은 최신 파일 시스템은 지연 할당이라는 기술을 사용합니다. 지연 할당은 새 파일의 디스크 레이아웃이 가능한 한 늦게 계산되어 계산시 사용 가능한 정보를 최대화합니다. 이 posix_fallocate(3)기능을 사용 하면 파일 시스템에 총 디스크 공간을 얼마나 할당해야하는지 알 수 있습니다. 최신 파일 시스템은이 할당을 순차적으로 수행하려고합니다.

다른 유형간에 다르게 작동합니까?

다른 파일 시스템은 다르게 동작합니다. NILFS2와 같은 로그 기반 파일 시스템은 Ext4와 같은 익스텐트 기반 파일 시스템과 같은 방식으로 스토리지를 할당하지 않으며 이는 변형의 한 예일뿐입니다.


1
fallocate(3)파일 순차 사용을 보장합니까? 아니면 파일 시스템을 암시합니까? 매뉴얼 페이지에서 완전히 이해할 수 없습니다.
hudac

6
순차적 할당을 보장 할 수 없으며 힌트 일뿐입니다. 그러나 10GiB 파일을 작성하는 경우 반드시 사용해야합니다!
Stephen Kitt 2012

6
본질적으로 FAT보다 더 정교한 모든 파일 시스템 (원래 Berkeley UFS로 거슬러 올라갑니다)은 의도적으로 큰 파일을 분할하여 여러 "할당 그룹"에 분산시킵니다. 이렇게하면 디스크 의 전체 조각화를 최소화 할 수 있습니다. 작동 방식을 조정하는 방법이 있을 있지만 파일 시스템을 처음부터 다시 작성해야 할 가능성이 높으며, 완전히 해제 할 수있는 방법이 없을 수도 있습니다.
zwol

2
@hudac 모든 경우에 순차를 보장하는 것은 불가능합니다 (드라이브가 가득 찬 경우를 참조하십시오). ).
Muzer

1
또한 가능한 경우 인접 파일을 갖는 것이 비효율적 인 RAID 시스템과 같은 상황이 있습니다. 이것이 실제로 디스크 / 스토리지 서브 시스템 컨트롤러의 목적이라고 생각합니다. 파일을 저장하는 모든 작업을 합리적으로 예상되는대로 최적으로 오프로드하는 것입니다.
jamesqf

17

이 명령 filefrag은 파일이 장치에 실제로 저장되는 방법을 알려줍니다.

# filefrag -v /var/log/messages.1 
Filesystem type is: ef53
File size of /var/log/messages.1 is 41733 (11 blocks, blocksize 4096)
 ext logical physical expected length flags
   0       0  2130567               1 
   1       1 15907576  2130568      1 
   2       2 15910400 15907577      1 
   3       3 15902720 15910401      7 
   4      10  2838546 15902727      1 eof
/var/log/messages.1: 5 extents found

한 번에 파일을 작성하면 파일이 조각화되지 않을 것입니다.

fallocate(1) 의 맨 페이지 는 매우 분명합니다.

fallocate 블록을 파일에 미리 할당하는 데 사용됩니다. fallocate시스템 호출 을 지원하는 파일 시스템의 경우 블록을 할당하고 초기화되지 않은 것으로 표시하여 데이터 블록에 대한 IO가 필요하지 않으므로 신속하게 수행됩니다. 파일을 0으로 채워 파일을 만드는 것보다 훨씬 빠릅니다.

Linux Kernel v2.6.31부터 fallocatebtrfs, ext4, ocfs2 및 xfs 파일 시스템 에서 시스템 호출을 지원합니다.

순차적입니까? 시스템은 먼저 블록을 순차적으로 할당하려고 시도합니다. 그것이 가능하지 않으면 경고하지 않습니다.


'ef53'유형은 무엇입니까? 나는 그것을 내 파일에서도 보았다. 그러나 내 FS 유형은 ext4입니다.
hudac

2
EF53은 ext2, ext3 및 ext4의 "SUPER_MAGIC"수입니다. 커널 소스의 "include / uapi / linux / magic.h"에서 모든 파일 시스템의 모든 매직 넘버를 찾으십시오.
Vouze

데비안에서는 filefrag에 숨겨져 있습니다 /usr/sbin. 그러나 일반 사용자 (적어도 ext4에서는)에서 작동하는 것 같습니다. strace경고 부족이 방해가되는 경우, 자신의 조각화를 측정하는 방법을 보는 것이 조작에 도움이 될 수 있습니다 .
Toby Speight

6

스파 스 파일에 대해 언급했지만 다른 답변은 언급하지 않았습니다.

대부분의 파일은 드물지 않습니다. 파일을 작성하는 가장 일반적인 방법은 파일을 처음부터 끝까지 한 번에 작성하는 것입니다. 구멍이 없습니다.

그러나 "100,000,000,000 위치로 이동하여 바이트를 쓰십시오"라고 말할 수 있습니다. 이렇게하면 파일 크기가 etabyte 인 것처럼 보이지만 실제로는 디스크에서 4k 만 사용합니다. 이것은 드문 파일입니다.

동일한 파일에 대해이 작업을 여러 번 수행 할 수 있으므로 엄청난 양의 빈 공간에 적은 양의 데이터가 분산됩니다.

이것이 유용 할 수 있지만 두 가지 단점이 있습니다.

첫 번째는 파일이 조각화되어 걱정되는 것입니다.

두 번째는 모든 프로그램이 이러한 파일을 제대로 처리하지는 않는다는 것입니다. 예를 들어 일부 백업 소프트웨어는 공허함을 백업하려고 시도 하므로 백업 미디어에 비해 너무 큰 백업을 생성 할 수 있습니다 .


그러나 스파 스가 아닌 파일조차도 종종 디스크에서 연속적이지 않습니다.
Barmar

2

어떻게 든 파일 순차를 제어 할 수 있습니까? 10GB의 파일을 할당하고 싶습니다. 디스크에서 순차적이며 다른 오프셋으로 나누지 않기를 원합니다.

이를 달성하기위한 최소한 몇 가지 방법이 있습니다.

  1. 여유 공간이 많은 파일 시스템을 사용하고 공간을 미리 할당하십시오 (예 : 응용 프로그램 별 데이터 끝 마커를 사용하고 파일 크기가 10GB에 도달 할 때까지 임의의 데이터를 추가하십시오). 조각화되지 않은 데이터가 생성되는 것은 아닙니다.

  2. ext4 등 대신 원시 (요리되지 않은) 파일 시스템을 사용하십시오 . DBMS는 때때로 성능상의 이유로이를 수행합니다. 필요한 경우 자체 캐싱 / 저널링 / 복구 등을 수행해야합니다.

이 작업을 통해 많은 이점을 얻는 인스턴스는 상대적으로 드물기 때문에 성능을 최적화 할 수있는 다른 곳을 먼저 살펴 보겠습니다.


참조

데이터베이스 관리 시스템이 일반적으로 파일 시스템을 우회하는 것이 사실입니까?


-1

이것이 한 번만 발생하고 파일이 원래 저장되는 방식이 중요하지 않은 경우 결과 만 중요하면 파일을 정상적으로 저장 한 다음 운영 체제의 조각 모음을 실행할 수 있습니다. 그런 다음 파일이 한 조각이면 이 대답을 확인하고 그렇지 않은 경우 반복하십시오. 이것은 명령이나 외부 프로그램을 사용하지 않고 가장 쉬운 방법이지만 전체 디스크를 조각 모음하기 때문에 가장 빠른 방법은 아닙니다.


1
"조각 모음 실행"? 그런 프로그램이 있습니까? 내가 함께 검색 할 때 유일하게 발견 aptitude search ~ddefrag했다 ddrescueviewnidsTCP 세그먼트 재 조립 라이브러리입니다. 프로그램이 무엇인지, 또는 어떤 인수가 전달되어야하는지 말하지 않으면 답변이 크게 도움이되지 않습니다.
Toby Speight

1
@TobySpeight-예 조각 모음이 있습니다. e4defrag.
ravery
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.