"그룹당 Inode 수" 및 "lazy_itable_init" 플래그는 ext4 파일 시스템의 "Inode 개수" 값과 어떤 관련이 있습니까?

"그룹당 Inode 수" 및 "lazy_itable_init" 플래그는 ext4 파일 시스템의 "Inode 개수" 값과 어떤 관련이 있습니까?

동일한 명령을 사용하여 포맷된 2개의 동일한 드라이브에 추가 Inode 오버헤드로 인해 ~55GB의 총 디스크 공간 차이가 발생한 고객 사례의 근본 원인을 파악하려고 합니다.

나는 알고 싶다

  1. Inodes per group2x를 2x로 변환하는 방법에 대한 수학Inode count
  2. 플래그 사용시 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 groupDriveA에 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
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 오버헤드가 발생합니다.

  1. Inodes per groupInode 수가 2배로 증가할 때 Inode 수를 2배로 늘리는 방법을 알아내는 데 도움을 줄 수 있는 사람이 있습니까 ?

  2. lazy_itable_init런타임 시 결정된 값에 영향을 미치나요 ? Inodes per group그렇다면 어떤 값을 설정할지 어떻게 알 수 있나요? (이 플래그는 코드에서 s_inodes_per_group에 대한 유일한 참조입니다.)

답변1

두 경우 사이에서 내가 찾은 차이점은 e2fsprogs 버전(1.42.9 및 1.45.4)의 차이점입니다. 나는 이것을 확인할 생각이 없었고 단지 mke2fs.conf 파일에 의존했습니다. 이러한 명백한 실수에 대해 사과드리며 제안해 주신 @lustreone에게 감사드립니다.

각 inode 그룹 및 inode 수와 관련된 수학이 여전히 궁금합니다.

관련 정보