동일한 명령을 사용하여 포맷된 2개의 동일한 드라이브에 추가 Inode 오버헤드로 인해 ~55GB의 총 디스크 공간 차이가 발생한 고객 사례의 근본 원인을 파악하려고 합니다.
나는 알고 싶다
Inodes per group
2x를 2x로 변환하는 방법에 대한 수학Inode count
- 플래그 사용시
Inodes per group
설정 방법lazy_itable_init
환경:
2개의 드라이브는 동일한 운영 체제에서 실행되는 2개의 동일한 하드웨어 서버에 있습니다. 드라이브 2개에 대한 세부정보는 다음과 같습니다(민감한 정보는 삭제됨).
드라이브 A:
=== START OF INFORMATION SECTION ===
Vendor: HPE
Product: <strip>
Revision: HPD4
Compliance: SPC-5
User Capacity: 7,681,501,126,656 bytes [7.68 TB]
Logical block size: 512 bytes
Physical block size: 4096 bytes
LU is resource provisioned, LBPRZ=1
Rotation Rate: Solid State Device
Form Factor: 2.5 inches
Logical Unit id: <strip>
Serial number: <strip>
Device type: disk
Transport protocol: SAS (SPL-3)
Local Time is: Mon Apr 25 07:39:27 2022 GMT
SMART support is: Available - device has SMART capability.
드라이브 B:
=== START OF INFORMATION SECTION ===
Vendor: HPE
Product: <strip>
Revision: HPD4
Compliance: SPC-5
User Capacity: 7,681,501,126,656 bytes [7.68 TB]
Logical block size: 512 bytes
Physical block size: 4096 bytes
LU is resource provisioned, LBPRZ=1
Rotation Rate: Solid State Device
Form Factor: 2.5 inches
Logical Unit id: <strip>
Serial number: <strip>
Device type: disk
Transport protocol: SAS (SPL-3)
Local Time is: Mon Apr 25 07:39:23 2022 GMT
SMART support is: Available - device has SMART capability.
드라이브를 포맷하기 위해 실행하는 명령은 다음과 같습니다.
sudo mke2fs -F -m 1 -t ext4 -E lazy_itable_init,nodiscard /dev/sdc1
질문:
df -h
드라이브 A와 B의 출력에는 각각 크기가 6.9T인 드라이브 A와 크기가 7.0T인 드라이브 B가 표시됩니다.
/dev/sdc1 6.9T 89M 6.9T 1% /home/<strip>/data/<serial>
...
/dev/sdc1 7.0T 3.0G 6.9T 1% /home/<strip>/data/<serial>
관찰 결과:
- 두 드라이브의 fdisk 출력은 두 드라이브 모두 동일한 파티션을 가지고 있음을 보여줍니다.
드라이브 A:
Disk /dev/sdc: 7681.5 GB, 7681501126656 bytes, 15002931888 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 8192 bytes / 8192 bytes
Disk label type: gpt
Disk identifier: 70627C8E-9F97-468E-8EE6-54E960492318
# Start End Size Type Name
1 2048 15002929151 7T Microsoft basic primary
드라이브 B:
Disk /dev/sdc: 7681.5 GB, 7681501126656 bytes, 15002931888 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 8192 bytes / 8192 bytes
Disk label type: gpt
Disk identifier: 702A42FA-9A20-4CE4-B938-83D3AB3DCC49
# Start End Size Type Name
1 2048 15002929151 7T Microsoft basic primary
/etc/mke2fs.conf
내용은 두 시스템 모두에서 동일하므로 여기서는 흥미로운 내용이 없습니다.
================== DriveA =================
[defaults]
base_features = sparse_super,filetype,resize_inode,dir_index,ext_attr
enable_periodic_fsck = 1
blocksize = 4096
inode_size = 256
inode_ratio = 16384
[fs_types]
ext3 = {
features = has_journal
}
ext4 = {
features = has_journal,extent,huge_file,flex_bg,uninit_bg,dir_nlink,extra_isize,64bit
inode_size = 256
}
...
================== DriveB =================
[defaults]
base_features = sparse_super,filetype,resize_inode,dir_index,ext_attr
enable_periodic_fsck = 1
blocksize = 4096
inode_size = 256
inode_ratio = 16384
[fs_types]
ext3 = {
features = has_journal
}
ext4 = {
features = has_journal,extent,huge_file,flex_bg,uninit_bg,dir_nlink,extra_isize,64bit
inode_size = 256
}
- 두 드라이브의 une2fs -l 출력을 비교하면
Inodes per group
DriveA에 2x DriveB가 있음 을 알 수 있습니다. - DriveA에는 2xDriveB 도
Inode count
표시됩니다(전체 차이여기)
DriveA:
Inode count: 468844544
Block count: 1875365888
Reserved block count: 18753658
Free blocks: 1845578463
Free inodes: 468843793
...
Fragments per group: 32768
Inodes per group: 8192
Inode blocks per group: 512
Flex block group size: 16
DriveB:
Inode count: 234422272 <----- Half of A
Block count: 1875365888
Reserved block count: 18753658
Free blocks: 1860525018
Free inodes: 234422261
...
Fragments per group: 32768
Inodes per group: 4096 <---------- Half of A
Inode blocks per group: 256 <---------- Half of A
Flex block group size: 16
~에서ext2 파일 시스템에서 "세트당 Inode 블록"을 계산하는 방법은 무엇입니까?이해해요
Inode blocks per group
왜냐면Inodes per group
mke2fs 코드에서(원천), 값은 제공된 경우에만
Inodes per group
함수에서 호출되는 것 같습니다.write_inode_tables
lazy_itable_init
write_inode_tables(fs, lazy_itable_init, itable_zeroed);
...
static void write_inode_tables(ext2_filsys fs, int lazy_flag, int itable_zeroed)
...
if (lazy_flag)
num = ext2fs_div_ceil((fs->super->s_inodes_per_group - <--------- here
ext2fs_bg_itable_unused(fs, i)) *
EXT2_INODE_SIZE(fs->super),
EXT2_BLOCK_SIZE(fs->super));
inode 수의 차이에 일정한 inode 크기(256)를 곱하면 (468844544-234422272)*256 = 60012101632 bytes
약 55GiB의 추가 inode 오버헤드가 발생합니다.
Inodes per group
Inode 수가 2배로 증가할 때 Inode 수를 2배로 늘리는 방법을 알아내는 데 도움을 줄 수 있는 사람이 있습니까 ?lazy_itable_init
런타임 시 결정된 값에 영향을 미치나요 ?Inodes per group
그렇다면 어떤 값을 설정할지 어떻게 알 수 있나요? (이 플래그는 코드에서 s_inodes_per_group에 대한 유일한 참조입니다.)
답변1
두 경우 사이에서 내가 찾은 차이점은 e2fsprogs 버전(1.42.9 및 1.45.4)의 차이점입니다. 나는 이것을 확인할 생각이 없었고 단지 mke2fs.conf 파일에 의존했습니다. 이러한 명백한 실수에 대해 사과드리며 제안해 주신 @lustreone에게 감사드립니다.
각 inode 그룹 및 inode 수와 관련된 수학이 여전히 궁금합니다.