Kernel ext4

23
Kernel Filesystem Kai Sasaki(@Lewuathe)

Transcript of Kernel ext4

Kernel FilesystemKai Sasaki(@Lewuathe)

今日のお話• ext4の機能

• ext4を使ってみる

• ext4のチューニング

• Btrfsの機能

ext4• ext3の後継として開発された

• Linux2.6.19から利用可能

機能 ext3 ext4

最大ファイルサイズ 2TB 16TB

ブロック管理方式 間接参照ブロック方式 エクステント方式 + 間接参照ブロック方式

遅延ブロック確保 - ○

タイムスタンプの単位 ミリ秒 ナノ秒

直接参照ブロック方式block1

block2

block3

block4

block5

block6

block7

inode

直接参照ブロック方式block1

block2

block3

block4

block5

block6

block7

inode

例えば1GBのファイルをもつだけで 1G/4K = 262144

のエントリを消費してしまう

間接参照ブロック方式block1

block2

block3

block4

ref1

ref2

inode

block5

block6

ref1block7

エクステント方式• 論理ブロックファイルの先頭からブロックサイズで分けた単位

• 物理ブロックブロックデバイス上のオフセットをブロックサイズで分けた単位

• エクステント論理ブロックと物理ブロックを一対一に対応させるための単位

エクステント物理ブロック 物理ブロック 物理ブロック

論理ブロック 論理ブロック 論理ブロック

エクステント エクステント エクステント

エクステント方式• inodeからのmapの深さが高々1にとどまる

• 連続したブロック領域をまとめて管理できる

• ハードウェアで規定されているページサイズとファイルシステムを分離できる

ext4の作成とマウント$ sudo su # ファイルシステムをデバイス上に作成 # mkfs -t ext4 /dev/sda1

# 作成されたデバイスをext4としてマウント # mount -t ext4 /dev/sda1 /mnt

# 既存のext2,ext3のディスクイメージを# ext4として再マウントすることもできる # mount -t ext4 /dev/DEV MOUNTPOINT

ext4への移行先の方法で移行は可能だけれどext4の多くの機能が無効化されたままになっている→ e2fsprogsを利用する

$ sudo su # e2fsprogsに含まれるtunefsコマンドを使って # エクステント機能を有効にする # tune2fs -O extent /dev/sda1

ext4への移行機能が有効化されたかどうかは同じくe2fsprogs に同封されているdebugfsコマンドを利用する

$ debugfs -R stats /dev/xvda1 Filesystem volume name: cloudimg-rootfs Last mounted on: / … Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recoveryextent flex_bg # <- extentがある

※ただしextent機能に関してはtune2fsコマンドで無効化できない

ext4のチューニングext4は/sys/fsにチューニングに関する特殊ファイルを持っている

$ ll /sys/fs/ext4/xvda1/ total 0 drwxr-xr-x 2 root root 0 Apr 8 11:52 ./ drwxr-xr-x 4 root root 0 Apr 8 11:52 ../ -r--r--r-- 1 root root 4096 Apr 8 11:52 delayed_allocation_blocks -rw-r--r-- 1 root root 4096 Apr 8 11:52 err_ratelimit_burst -rw-r--r-- 1 root root 4096 Apr 8 11:52 err_ratelimit_interval_ms -rw-r--r-- 1 root root 4096 Apr 8 11:52 extent_max_zeroout_kb -rw-r--r-- 1 root root 4096 Apr 8 11:52 inode_goal -rw-r--r-- 1 root root 4096 Apr 8 11:52 inode_readahead_blks -r--r--r-- 1 root root 4096 Apr 8 11:52 lifetime_write_kbytes -r--r--r-- 1 root root 4096 Apr 8 11:52 max_writeback_mb_bump -rw-r--r-- 1 root root 4096 Apr 8 11:52 mb_group_prealloc …

lifetime_write_kbytes• ファイルシステムに書き込まれたデータ総量を表す

• 書き込み制限のあるSSDなどにマウントしている場合には寿命予測のため重要なメトリクスになる

• mountしてからの値が知りたければsession_write_kbytesを見る

# cat /sys/fs/ext4/xvda1/lifetime_write_kbytes 1294237 # <- kb単位

# cat /sys/fs/ext4/xvda1/session_write_kbytes 238196

lifetime_write_kbytes

$ cat /sys/fs/ext4/xvda1/session_write_kbytes 238196 $ dd if=/dev/urandom of=/tmp/file bs=1M count=100 100+0 records in 100+0 records out 104857600 bytes (105 MB) copied, 9.83144 s, 10.7 MB/s $ cat /sys/fs/ext4/xvda1/session_write_kbytes 340692

mb_stream_reqext4ではマルチブロック確保処理を実装- group PA (group事前確保)- inode PA (inode事前確保)

group PAでは対象となるファイルブロックを物理的に近い領域に配置する。inode PAではあるひとつのファイルを物理的に連続した領域に配置する。

mb_stream_reqext4ではマルチブロック確保処理を実装- group PA (group事前確保)- inode PA (inode事前確保)

group PAでは対象となるファイルブロックを物理的に近い領域に配置する。inode PAではあるひとつのファイルを物理的に連続した領域に配置する。

どういう場合に使い分けられるか?

mb_stream_req/* * files smaller than MB_DEFAULT_STREAM_THRESHOLD are served * by the stream allocator, which purpose is to pack requests * as close each to other as possible to produce smooth I/O traffic * We use locality group prealloc space for stream request. * We can tune the same via /proc/fs/ext4/<parition>/stream_req */ #define MB_DEFAULT_STREAM_THRESHOLD 16 /* 64K */

- 16ブロック以下: group PA- それ以上: inode PA

設定ファイルなどは16ブロック以下のためgroup PAにより物理的に 局所化され、起動時のディスクシークが短くてすむ

Btrfsext4の更に次世代のファイルシステムB-tree filesystemの略

• スナップショット

• 複数ディスクサポート

• 透過的圧縮

• 差分バックアップ

スナップショット• CoWの下でB-treeを利用することで効率的な スナップショットが可能になる

root #0

branch A branch B branch C

“A” “B” “C” “D” “E” “F”

root #0

branch A branch B branch C

“A” “B” “C” “D” “E” “F”

root #1

複数デバイス• ひとつのファイルシステム下に複数のブロックデバイスを登録する機能

• ソフトウェアRAIDの機能も備えているRAID0, RAID1, RAID10, RAID5, RAID6 が実装されている

# btrfs device add <Disk Device> <Path>

透過的圧縮ファイル書き込み時にBtrfsが自動でデータを圧縮してデータを書き出す

アプリケーションで意識することなるディスク使用量を節約することが可能

# mount -t btrfs -o compress=lzo <Dev> <Mnt>

重複排除2つのファイルで同じデータを持っている領域を共有させる機能 (dedup)

ZFSでは自動で動くオンラインdedup

Btrfsでは領域を指定して重複排除を適用するためオフラインdedupと呼ばれる。