나는 종종 ext4 fs의 맥락에서 "조각"과 "범위"라는 단어를 우연히 발견합니다.
그것들은 모두 단편화와 관련된 것 같습니다. 예를 들어 범위가 상당히 광범위하게 해석됩니다.여기.
그들 사이의 차이점은 무엇입니까?
답변1
더 혼란스러운 점은 두 가지 유형의 프래그먼트와 세 가지 유형의 프래그먼트가 있다는 것입니다.
조각화된 파일은 여러 블록(또는 조각, 각 조각이 범위일 수 있음)에 저장되는 파일이므로 파일을 순차적으로 읽을 때 운영 체제는 디스크의 서로 다른 위치에서 모든 조각을 읽어야 하므로 속도가 느려집니다. 파일 읽기 속도. ext4fs의 알고리즘은 파일에 블록을 가능한 한 연속적으로 할당하여 이러한 일이 발생하는 것을 방지하려고 합니다. 여러 범위를 가진 파일을 조각난 파일이라고 합니다. 그러나 파일은 범위가 아닌 연속 블록 목록인 단일 조각(즉, 분할되지 않음)으로 저장될 수도 있습니다. 이것이 프래그먼트와 범위가 관련되는 방식입니다.
조각은 청크보다 작은 파일의 마지막 청크이거나 다른 조각과 함께 전체 청크에 조각으로 저장되는 청크보다 작은 파일일 수도 있습니다. 블록 크기가 크고 작은 파일이 많은 경우 단일 블록에 여러 파일 조각을 저장하면 많은 공간을 절약하고 잠재적으로 성능을 향상시킬 수 있습니다. 특히 블록을 공유하는 모든 파일을 읽으려고 할 때 더욱 그렇습니다.
파일 시스템 관점에서 보면 내부 단편화와 외부 단편화가 있을 수 있습니다.
내부 조각화는 단일 파일 내에서 이루어지며 위의 첫 번째 조각화 유형과 동일합니다.
외부 조각화는 관련 파일이 모두 하나의 디렉터리에 있고 디스크 전체에 분산되어 있을 때 발생합니다. 디렉터리의 모든 파일을 읽으려고 하면 내부 조각화만큼이나 많은 성능 문제가 발생할 수 있습니다. ext4fs 알고리즘은 또한 동일한 디렉토리에 있는 다른 파일과 동일한 실린더 그룹에 있는 파일에 블록을 할당하려고 시도하여 외부 조각화를 최소화하려고 시도합니다.
역사적 기록:
Linux ext4fs는 ext3fs, ext2fs 및 extfs의 발전입니다. extfs는 UFS를 기반으로 하지만 기반은 아닙니다. UFS는 BSD FFS(Fast File System)를 기반으로 합니다. 위의 알고리즘은 FFS의 핵심 알고리즘이며 주로 ext4에 존재하지만 FFS의 다른 많은 알고리즘(특히 회전 지연을 처리하는 알고리즘)은 더 이상 사용되지 않으며 UFS에서 폐기될 수 있습니다. 위의 용어 중 일부는 (적어도) Linux 2세대이며, 용어 자체는 변경되었을 수 있지만 알고리즘은 그대로 유지됩니다.
FFS의 실린더 그룹은 처음에는 트랙 및 섹터(회전 대기 시간 최적화를 위해)와 연관되어 있지만 실제로는 인접한 실린더일 뿐입니다. 블록은 적어도 30년 동안 트랙/섹터에 명확하게 매핑되지 않았으며 아마도 플로피 디스크가 널리 보급된 이후에도 없었을 것입니다. 그러나 실린더 그룹은 여전히 연속적인 블록 그룹이며 탐색 시간을 최적화하는 데 도움이 됩니다. 탐색 시간은 SSD와 관련이 없을 수 있지만 연속 블록 할당은 여전히 도움이 될 수 있습니다.
실린더 그룹의 최적화는 거의 부작용입니다(그러나 의도적임). 왜냐하면 inode는 실린더 그룹에 속하고 디렉토리의 inode는 순차적으로 할당되는 경향이 있고 디렉토리의 inode에 블록을 할당하려고 시도하기 때문입니다. 동일한 실린더 그룹.
실린더 그룹은 조각화로 인해 발생하는 성능 문제를 줄이는 데 사용되는 유일한 알고리즘이 아닙니다. FFS도 파일 내에서 더 큰 연속 블록 할당을 얻기 위해 블록 할당을 지연시키려고 합니다.
UNIX에서 "조각"이라는 용어는 항상 부주의하게 사용되며, 문맥을 주의 깊게 읽지 않으면 어떤 유형의 조각을 참조하고 있는지 거의 또는 전혀 명확하지 않습니다. BSD와 Linux 모두에 대한 여러 역사적 문서를 검색하고 참조한 결과 내부 또는 외부 단편화라는 용어에 대한 공식적인 정의를 찾을 수 없으며 그 사용법은 결코 수정되지 않은 것으로 보이며 "조각화"라는 용어 자체가 때때로 사용되었습니다. 두 가지 유형을 동시에 참조합니다.
답변2
당신은 이미 인용했습니다원천이것은 범위가 무엇인지 설명합니다.
조각의 경우 블록의 세분화입니다. 이 개념은 FFS에서 도입되었으며 UFS에도 여전히 존재하지만 EXT4에는 없습니다.
원천:
파일이 생성되거나 확장되면 완전한 논리 블록이나 조각이라고 불리는 논리 블록의 일부에 디스크 공간이 할당됩니다. 파일에 디스크 공간이 필요한 경우 전체 블록이 먼저 할당된 다음 블록의 하나 이상의 조각이 나머지 부분에 할당됩니다. 작은 파일의 경우 할당은 조각부터 시작됩니다.
전체 블록 대신 블록 조각을 파일에 할당하는 기능은 블록의 사용되지 않는 구멍으로 인한 디스크 공간 조각화를 줄여 공간을 절약합니다.
UFS 파일 시스템을 생성할 때 조각 크기를 정의합니다. 기본 조각 크기는 1KB입니다. 각 블록은 1, 2, 4 또는 8개의 조각으로 나눌 수 있으므로 조각 크기는 8192바이트에서 512바이트(4KB 파일 시스템에만 해당)입니다. 하한은 실제로 일반적으로 512바이트인 디스크 섹터 크기와 관련이 있습니다.
테라바이트급 파일 시스템의 경우 조각 크기는 파일 시스템 블록 크기와 동일해야 합니다.
https://recoverhdd.com/blog/ufs1-and-ufs2-file-systems.html
FFS의 주요 목적은 디렉터리의 모든 콘텐츠(데이터 및 메타데이터)를 단일 실린더 그룹으로 통합하는 것입니다. 디스크 표면 전체에 데이터가 과도하게 분산되어 조각화 수준이 크게 줄어듭니다. 그러나 디스크 크기와 디스크에 저장되는 파일 크기의 급격한 증가로 인해 적절한 수준의 성능을 유지하기 위해 블록 크기를 늘리므로 이 솔루션은 더 이상 효과적이지 않습니다.따라서 작은 파일을 많이 저장하면 많은 공간을 차지하게 됩니다.
이는 다시 한 번 개발자에게 파일 시스템을 개발하도록 강요했으며 FFS를 기반으로 개정된 파일 시스템 "UFS1"이 생성되었고 나중에 안정성과 속도를 제공하기 위해 개정된 "UFS2"가 생성되었습니다.블록은 조각으로 나누어지기 때문에 이러한 조각은 파일의 최종 바이트를 저장하는 데 사용됩니다(전체 블록은 이전에 이를 위해 할당되었습니다).그리고 몇 가지 새로운 기술.
다시 말하지만, 이 개념은 EXT3/4에는 존재하지 않습니다.
ext3fs는 블록 조각화를 지원하지 않으므로 바이트 파일은 전체 4096 블록을 사용합니다.
대조적으로, 예를 들어 UFS는 블록에서 4개의 조각을 지원하므로 작은 파일은 ext3fs에서처럼 빠르게 파일 시스템을 채우지 않습니다.
수백만 개의 1KB 파일을 수용할 수 있도록 ext4 파티션 최적화
AFAIK, ext4는 당신이 하고 있는 일에 전혀 좋은 선택이 아닙니다.블록 하위 할당을 지원하지 않습니다.. 실제로 UFS2 또는 BtrFS 사용을 고려해야 합니다.
EXT3/4 FS 는 # dumpe2fs
블록 크기와 동일한 조각 크기를 표시합니다.
# dumpe2fs /dev/sde1
(...)
Block size: 4096
Fragment size: 4096
(...)