「グループあたりのInode数」および「lazy_itable_init」フラグは、ext4ファイルシステムの「Inode個数」値とどのように関連していますか?

「グループあたりのInode数」および「lazy_itable_init」フラグは、ext4ファイルシステムの「Inode個数」値とどのように関連していますか?

同じコマンドを使用して、フォーマットされた2つの同じドライブに追加のInodeオーバーヘッドが原因で、〜55 GBの合計ディスク容量の違いが発生した顧客ケースの根本的な原因を特定しようとしています。

知りたい

  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

2つのケースの間で私が見つけた違いは、e2fsprogsバージョン(1.42.9と1.45.4)の違いです。私はこれを確認するつもりはなかっただけで、mke2fs.confファイルに頼っていました。これらの明白な間違いについてお詫び申し上げてくれた@lustreoneに感謝します。

各 inode グループと inode の数に関連する数学がまだ疑問に思っています。

関連情報