Software Design 2016年04月号: Linux 4.1から4.4までのeBPFに関する開発
Linux 4.3のIO/FSまわりcommit
今日読んだ分をざっくりとtweetから持ってきた
“Btrfs: add support for blkio controllers” / “kernel/git/torvalds/linux.git - Linux kernel source tree” http://t.co/w1lWm62WMD
— キーリ (@naota344) 2015, 9月 7
Btrfsは独自にbioをsubmitしているので、blkio controllerにacountingされていなかったのを直したような感じ。複数disk対応にはまだ作業が必要とか
これ踏んでたのかなあ…“Btrfs: check if previous transaction aborted to avoid fs corruption” / “kernel/git/torvalds/linux.git -…” http://t.co/OYmyYjaue8
— キーリ (@naota344) 2015, 9月 7
transactionが別のtransactionの完了を待っていたが、正常終了かどうかをcheckしていなかった。そのためcommitされていないerror transactionに依存する形でtransactionがcommitされてたという問題のfix
btrfs, empty chunkのauto cleanupが入ったのか。あいてるように見えるのに書けないの問題が少し解消するかな
— キーリ (@naota344) 2015, 9月 7
Btrfsではdfで空きスペースがあるのにfileが作れない消せないということがあって問題とされていた. 原因の1つとして、空になったchunkを回収してない -> 新しいchunkをallocできないというのがあった. いつのまにか空のchunkを回収するコードが入っていたらしい。
“inode: don't softlockup when evicting inodes” / “kernel/git/torvalds/linux.git - Linux kernel source tree” http://t.co/oH5ck1Wztx
— キーリ (@naota344) 2015, 9月 7
148GB RAMなマシンで、inodeをメモリから消すほどメモリがいっぱいにならない
なので、数億のempty fileを作ってumountすると数億分のevict inodeが起きてsoft lockupするbugのfix
https://t.co/bUSBn2qU4N
— キーリ (@naota344) 2015, 9月 7
これはそのまま。evict inodeに時間がかかるほど大量のinodeを溜め込めるメモリがあるマシンじゃないといけないけど、そういうこともあるのかーと面白かった。
“sync: serialise per-superblock sync operations” / “kernel/git/torvalds/linux.git - Linux kernel source tree” http://t.co/Uop8AmRVeS
— キーリ (@naota344) 2015, 9月 7
複数のsyncが同時に同じFSにかかると、inode listのspin lockがcontentionし、無駄にCPUを使ってしまう。
mutex lockをとるようにして、syncをserialiseした
https://t.co/g4KJa0hut1
— キーリ (@naota344) 2015, 9月 7
syncで無駄にCPUを使うことがなくなってよかったというはなし。ついついsyncしちゃう人に朗報?(謎
“writeback: plug writeback at a high level” / “kernel/git/torvalds/linux.git - Linux kernel source tree” http://t.co/bfUtYrS7As
— キーリ (@naota344) 2015, 9月 7
これまでper-mappingでIOをまとめていた。複数fileに同時にwriteし、disk上でその2つのfileのblockが連続でも、2つのIOはまとめられない。writebackのplugを行ないIOがまとまるようにした
https://t.co/DJxlPV1Ap3
— キーリ (@naota344) 2015, 9月 8
さっきのcommit, benchmarkがよくて,大量の4KB fileを作るテストだけれど95%のIOPS削減(それだけ大きなIOにまとめられた)し、bandwidthが38%改善している。実行時間も26%減少。
— キーリ (@naota344) 2015, 9月 8
benchがSSDで行なわれているので、HDDではもっとbenefitが出るだろう。
— キーリ (@naota344) 2015, 9月 8
複数fileに同時にIO operation(しかもdisk上では並んでいる & fsyncはしてない)というのは実際どういうオペレーションになるのか少し不明だけどSSDでもこれだけパフォーマンス改善するのは面白い
GoogleのKernelThreadSanitizerが、swaponのpotential data raceを発見
https://t.co/xxedbvj3e3
— キーリ (@naota344) 2015, 9月 8
KTSan面白そうなので触ってみたい
おっxfsのcorruption情報だ(log recoveryのsizeに不正なものを入れとくやつ)“xfs: validate transaction header length on log recovery” / “ker…” http://t.co/i9xxbsduwP
— キーリ (@naota344) 2015, 9月 8
Linux 4.3結構xfs log recoveryのとこにfix入ってるな。log がcorruptした時にそのまま進んでしまわないようなcheckが多く導入されている感じ。
— キーリ (@naota344) 2015, 9月 8
log部分のchecksumとかsizeとか、logのcancelが正しく動くかなどlogまわりに多くのfixが入っている
“xfs: Fix file type directory corruption for btree directories” / “kernel/git/torvalds/linux.git - Linux kernel sou…” http://t.co/sZkJKN3IDb
— キーリ (@naota344) 2015, 9月 8
ディレクトリエントリ置換前のfiletypeと置換後のfiletypeをうっかり同じ変数に保存していたため, filetypeがおかしくなってたよというバグ. これは怖い…
portage tree を squashfs で sync しよう
portage-2.2.19以降では Portage tree を Squash FSでsyncできるようになったらしい。
下記メールにある通り、 dev-util/squashmergeをインストールして repos.conf を設定する。 emerge --sync すると最初は Squash FSの snapshot が、最初のsync以後はいまの snapshot に対する差分がDLされて portage tree として見えるようになる。
Portage tree に SquashFSを使うのは、 tree のサイズを小さくするよく知られたトリックである。 たとえばbtrfs+lzoで504MBのtreeがSquashFS+lzoで96MBにまで小さくできる。
しかし、Squashを毎回やり直すのが面倒であった。 今回のportageの変更で透過的にSquashFS上のportage treeの更新ができるようになる。
いまの自分のシステムは Git での syncにしているが、どうせportage treeの中で上書きなんてしないし、 SquashDelta sync に切り替えていこう。特にあまり容量のないサーバでinodeとディスクの節約になって嬉しい。
make.profile はディレクトリでいいらしい
Gentoo は選択なので当然 systemd をサポートしている。 systemd を使うには USE フラグを設定しておいたり、あるいは systemd とではうまく動かないパッケージがあるので使わないように設定しなければならない。これを簡単に設定できるように systemd の profile が作られている。
これまでは systemd の profile はdefault/linux/amd64/13.0/desktop/gnome/systemd か
default/linux/amd64/13.0/desktop/kde/systemd のようにデスクトップ環境の下に作られていた。 最近になってデスクトップ環境以外の systemd profile (default/linux/amd64/13.0/systemd)ができた。
これを聞いて、よかったべんりーと思っていたのだけれど、実は"/etc/portage/make.profile" は「/usr/portage/profiles下へのsymlink」でなくていいということを知った。
このメールによると /etc/portage/make.profile のディレクトリを作って、その下の parent ファイルに使いたい profile へのパスを書けば複数のprofile を "mix-in" できるようだ。
そうすると、 desktop+systemd (kdeでもgnomeでもない)とかdesktop+kde+systemd+developer とか no-multilib+systemd とかmusl+systemd とかも設定できる、ということなのだろう。すごい
Software Design 2015年 2月号: BPF, seccomp, tinyconfig
Software Design (ソフトウェア デザイン) 2015年 02月号 [雑誌]
- 出版社/メーカー: 技術評論社
- 発売日: 2015/01/17
- メディア: 雑誌
- この商品を含むブログ (2件) を見る
Software Design 2015年 2月号 に記事を書きました。
「第35回 Linuxカーネル観光ガイド」で、 seccomp フィルタ、 bpfシステムコール、そして Linux カーネルの新しい config 方法である tinyconfig について書きました。