同じコマンドを使用して、フォーマットされた2つの同じドライブに追加のInodeオーバーヘッドが原因で、〜55 GBの合計ディスク容量の違いが発生した顧客ケースの根本的な原因を特定しようとしています。
知りたい
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
2つのケースの間で私が見つけた違いは、e2fsprogsバージョン(1.42.9と1.45.4)の違いです。私はこれを確認するつもりはなかっただけで、mke2fs.confファイルに頼っていました。これらの明白な間違いについてお詫び申し上げてくれた@lustreoneに感謝します。
各 inode グループと inode の数に関連する数学がまだ疑問に思っています。