Cgroupあれこれ-第4回コンテナ型仮想化の情報交換会資料

@hiro_kamezawa
アジェンダ 
自己紹介 
cgroupって何? 
今昔 
memory cgroup
自己紹介 
亀澤 寛之(@hiro_kamezawa) 
某F社 
今の仕事はマネージャ 
現役だったのは2年前 
HPCじゃなくエンタープライズ系 
元memory cgroupの開発者 
最近面白そうなもの Dockerと周辺 kdbus、systemd
Cgroup 
“Control Group” の略 
-タスクのグループを作る -作ったグループに対し制限・パラメータ等を設定する ための機能 例えば、KVMのフロントエンドの “libvirt” は各 KVMを cgroupの下に突っ込んで動かすことで CPU,Memory等の 
リソース制御を行っている。
Cgroup ? 
実は元々、”Process Container ” って名前で開発が始まった。 
+/* 
+ * cgroup_create_dir - create a directory for an object. 
+ * cont: the cgroup we create the directory for. 
+ * It must have a valid ->parent field 
+ * And we are going to fill its ->dentry field. 
+ * dentry: dentry of the new container 
+ * mode: mode to set on new directory. 
+ */ 
昔のコードを見ると“Container”の文字が結構あったりする 
“Process Container”機能だけじゃ”Container”にならないよね? 
とかそういう話もあって “Control Group”に
汎用性のために 
Cgroup を作っている最中には色々議論があって 
特定用途でなく“汎用性”を重視すべきだとか。 
それで今の形、cpu, memory etc…をバラバラに管理できるようになった。 名前も Control Groupに。 
Kernel 2.6.24 (2007年)にマージ。 当時からgoogleのエンジニアがメンテナ(代替わりしたけど)。 
=>結局、無駄に複雑にしたことで、後々問題になるんだけど
昔と今と 
なんだこのCgroup機能って、俺たちのコードを汚くする上に 
性能を落とすだけの機能じゃねーか。 
誰が使うんだこんなもん 
昔の雰囲気 
コンテナとかで使ってるみたいだからユースケースが 
あるんだろうが、ホットパスをいじる時は気をつけろよ 
昔よりも根本的なところでコードをよくして行ける。
Cgroupの機能 
タスクをグループ化する 
グループは動的に生成・廃棄が可能 
各グループはヒエラルキを作る 
各ヒエラルキには“サブシステム”で様々な属性を付与 
仮想ファイルシステムインタフェースで実装される 
mkdir で cgroupを作る 
タスクの子タスクは同一のグループに所属する 
全てのタスクはいずれかのcgroupに所属する 
所属していないように見えるタスクは “root” cgroupに所属
現在のsubsystem 
cpu 
cpuacct 
cpuset 
memory 
blkio 
device 
freezer 
net_class 
net_pio 
perf 
hugetlb
ヒエラルキ① 
Cgroupは階層構造が持てる。これをヒエラルキと呼ぶ。 
Subsystem毎に別々のヒエラルキを構築可能 
CPU のヒエラルキ 
メモリのヒエラルキ 
バラバラに作ると 
正直カオス・・・
ヒエラルキ② 
Subsystem毎に階層構造の効果が異なる! 
CPU のヒエラルキ 
メモリのヒエラルキ 
増々カオス・・・ 
基本的に上位のリソース 
を下位で分割してゆく 
1/2 
1/2 
1/2 x 1/3 
上位の影響をうけるかどうか 
スイッチで選べる
ヒエラルキ③ 
A 
B 
C 
D 
中間層にもタスクが所属可能! 
CPU のヒエラルキ 
例えば、Aグループの下に 
B、C,D,グループがあるとする。 
Aグループにタスクが3つ所属し、 
B,C,Dにそれぞれタスクが 
1つずつ所属する時、それぞれ 
のタスクが受け取るCPU 
リソースはいくつか? 
1/2 
1/2 
1/2 x 1/3 
わけわからん
タスクとプロセス 
コントロール⇒タスク単位 
リソース⇒タスク単位? 
メモリってプロセス単位ですよね?
自由度高杉問題 
自由度を優先した実装だったんだけど・・・ 
複雑なコード 
わけのわからんヒエラルキ 
Memory等はプロセス単位で管理されるのにスレッド単位で グループに所属可能 
Cgroup間の連携が皆無 
⇒memory cgroup と blkio cgroupがバラバラになっている ため、buffered I/O にうまくタグ付けが出来ないから buffered I/O制限が実施できないとか。
sane_behavior 
mount -t cgroup -o __DEVEL__sane_behavior cgroup $MOUNT_POINT 
元々の実装がcgroupの使い方に制約を加えていないことへの怒りが生み出した “正しい”使い方 
ヒエラルキ-はシステムに一つだけ(default ヒエラルキ-を作る) 
Remount/rename は不可 
プロセス単位で管理。タスク単位では管理しない 
Taskの所属しないcgroup状態のnotification機能追加 
プロセスを持たないグループだけがサブシステム効果を得る 
Memory, blkio cgroupはデフォルトでヒエラルキー効果が有効化 
カーネル 3.19~20あたりでdefault化かな?
新ヒエラルキルール 
A 
B 
C 
D 
ヒエラルキ 
例えば、Aグループの下に 
B、C,D,グループがあるとする。 
AグループでCPU cgroupをenable 
した場合、BCDに効果が及ぶが Aにはタスクが所属できない。 BCDにのみタスクが所属可能 
1/2 
1/2 
1/2 x 1/3
cpusetの運命? 
cpuset はcgroupが出来る前からあったのだけど、似て るってことでcgroupに取り込まれた。 
元々cpusetはスレッド単位でcpu bindの制御等ができた 
今もできている 
sane_behaviorになると?
systemd 
systemdが全てのcgroupを牛耳る! 
Systemdが有効なシステムではsystemdでcgroupを作る 
Unit file を使って作る 
DBUS APIで作る 
….mkdir よりめんどくさい …けどsystemdのツール群は正直便利 
※ libvirt のcgroup関係もsystemdを使うよう書き直された
3つのslice 
systemd 
user.slice 
system.slice 
machine.slice
ちなみに 
今の所systemd から設定できるパラメータは限定的 
CPUの”Share”は設定できても“Limit”は設定できない 
Memoryの上限は設定できても Swapの設定ができない 
Etc….. 
Systemdの開発者に聞いてところ、Linux Kernel側の 
Cgroupの再設計作業がひと段落してAPIが確定するまで 増やさないとのこと・・・ 
⇒手動でどうぞ。
Cgroupあれこれ-第4回コンテナ型仮想化の情報交換会資料
Memory cgroup 
1.メモリ使用量の上限を設定できる 
ユーザメモリとページ(ファイル)キャッシュ 
2.メモリ+swap使用量の上限を設定できる 
3.カーネルメモリの使用量上限を設定できる 
4.TCPのバッファ量を制限できる 
1~3は連携している。 
….実はTCPのバッファ量制御だけ仲間外れで他の3つとは独立 (元々network bufferのシステム上限制御のcgroup版だから なのだけど)
ところで・・・・ 
Johannes Weiner が 2014/08/08 のコミットで 
書き換えまくったので(綺麗になったし性能もよくなった) 
そのバージョンに基づいてしゃべります。 
※なので今手に入るカーネルとは少し違うかも。 
昔はホットパス等に手を入れるのに反発もあったので 
かなり外付けコード風にmemory cgroupを作ってた。 
最近は市民権?も出て来たのでよりスリム化している最中。
ユーザメモリのアカウンティング ~ページフォルト~ 
プロセス実行 
ページフォルト 
ページフォルトハンドラ 
Memory cgroup 
課金する 
ページフォルトの際に 
アロケートされたメモリ 
に対し課金を行う
ユーザメモリのアカウンティング② ~メモリ解放~ 
munmap() や exit() 
put_page() 
メモリ解放処理 
Memory cgroup 
使用量の返却
ユーザメモリのアカウンティング③ ~swap out処理~ 
メモリ回収処理 
ページを選択 
スワップキャッシュに追加 
unmap 
Swap out 
宙ぶらりん 
フリー 
メモリ使用量を減らす 
スワップアウトしたことを記録 
ユーザメモリはスワップに行った後も 
開放されない場合があるのがいやらしい・・・
ユーザメモリのアカウンティング ~swapin 処理~ 
プロセス実行 
ページフォルト 
ページフォルトハンドラ 
Swapの記録域から 
Memory cgroup情報を 
読み出して課金する 
Swap-in処理 
実はswap inがくせもので、 
SwapCacheにヒットして、既に課金済の 
ページを拾ってくることがある。 
この辺、race conditionとかややこしい 
-> Johannesの改善で少しマシに。
ページキャッシュのアカウンティング 
ページ 獲得 
ページキャッシュに追加 
メモリ使用量UP 
Radix-Tree 
ページキャッシュから削除 
put_page() 時に 
メモリ使用量を返却 
ページ 解放 
最初にページを読んだ人に課金される。 
共有されるページキャッシュの扱いが問題だったが・・・ 
結局コンテナメインなら共有はあんまりかんがえなくていいよね?
Kernelメモリのアカウンティング① 
1.SLAB / SLUB アロケータからページを割り当てた場合 
2.alloc_kmem_pages()を呼ぶ場合 …とはいえ、alloc_kmem_pages()はkmalloc()から 呼ばれる。 基本、kmallocやslab関係で page単位に課金される。
Kernel メモリのアカウンティング② 
今の所、カーネルメモリ課金は free()されたときに減算。 
…..とはいえ、特定のmemory cgroup狙い撃ちでカーネル 
メモリを解放して行くようなルーチンはいまのところまだ無い。 
つまり、memory cgroupを削除してもまだ課金されている状 態….ということもあるわけで、あんまり使わない方がいい。
TCP bufferのアカウンティング 
元々、システム全体でtcp bufferを制限するための仕組みが あり、それを流用。 
Socket の data用のメモリ域をアロケートするところで判定す る。
Memory cgroupの面倒なところ 
タスクのライフサイクルとメモリのライフサイクルが異なる 
莫大な性能オーバヘッドがあると信じられている 
タスクに課金するわけじゃなくてページに課金しているので race conditionが多い 
….少しずつ説明してみます。
ライフサイクル 
元々のcgroupデザイン時の期待値 
Task がいなくなると参照が無くなる⇒削除可能 
メモリcgroup 
Taskがいなくなっても以下が残る 
ページキャッシュ 
カーネルメモリ 
スワップキャッシュ(残ることがある) 
このあたりの処理をするためにリファレンスカウント処理等々を入れた おかげで性能に影響が出たり、race conditionが発生
オーバヘッド 
Kernelは1ページ(4096byte)単位にPage構造体 (64バイト)を割り当てる。Memory cgroupは1ページごと に、16byte使用する。 
=> 1G毎に4Mバイト。 
Cgroup毎にカウンターを一つ持つ。カウンターはスピンロック で保護される。課金情報はココで管理 
Page 情報の管理のためにロック操作が必要だった ⇒ 2014/08 のパッチ群でJohannesが解決。
Race condition 
ページに対して課金する 
ページマイグレーション時の課金の移動 
Transparent Huge Page 
SwapCache 
ページの”dirty”等の属性のカウンティング 
Taskをcgroup間移動した際に課金情報を移動させる機 能がある 
ロックを使っていると性能に出てくる
Memory cgroupの性能オーバヘッド① 
一番最初のナイーブな実装 
1ページの課金ごとにカウンタ(spinlock付)を操作 
/::::i::::、:::ヽ、:::::\:ヽ:\::::::ヽ:::、::ヽ::、:', 
/::i|::l::ト、ヽ::、:::ヽ:、::::::\::ヽ::::l::::ヽ::i:::i:::! 
/:/:!:::!:|::ヽ:\ヽ::::、:\::::ヽ:::ヽ!::::::i::|:::!::! 
!ハ::|::::i::l:|心、:ヽ::\:ヽ_\、\:::ヽ:::|!::|:|i 
i、:!:|:、N{、ヒjヽゝ\ヾイ ヒj >、ヽi:、|!:|:l 
ヽ:!::トヽ ̄ l! ` ` ̄´ |::l::|:|j:,!:! 駄目だこいつ 
ト、::! u j |::/lj:::!リ 
ヾ、 丶 - u リイ:|リ 早くなんとかしないと…… 
リヽ ‐、ー- 、_ /イ:::i 
rー'"ト:l゙、  ̄ ./ , |::! 
/ ヘ ヾ ヽ、 _,. ' / |:'
ヒエラルキとカウンタ 
counter 
counter 
counter 
counter 
lock 
lock 
lock 
lock 
一つカウントすると カウンタとlockを複数操作
性能オーバヘッド改善① 
・・・・・ 
各CPU 
struct { 
struct memcg *ptr; 
unsigned long nr_pages; 
} 
中央のカウンタ 
128kb 単位で課金 
4kb 単位で課金 
ス レ ッ ド 
各CPU毎に128KBずつ、現在走行中のスレッド が所属するmemory cgroupから利用量をキャッシュ。 
(スレッドが切り替わったら必要に応じて返却) 
CPU数が増えたらどうかと思ってたけど自動ヒュージページで影響が見えにくくなった。 
課金処理オーバヘッドの削減 
所属
性能オーバヘッド改善② 
メモリ解放処理等 
Pagevec処理 
Memory cgroupへの返却は put_page() 
のバッチ処理の中で複数のページ分を まとめてカウンタ操作していく。 
今は数百ページ単位で処理。
カウンタの誤差 
Memory cgroup は性能のためにカウント誤差を許容 
-課金の際には各CPUあたり最大128KB分の“前借り” 
-ページテーブルからメモリが剥がされても実際にページアロケー タに返却される直前までは課金が返済されない。 
ファジーなカウンターと呼んだりするけど、Linuxの中にはファジー な値が結構ある。 例)タスク毎のrss accountingとか。
Johannesの改善 
今まで 
lock_page_cgroup() 
pc->memcg = memcg 
unlock_page_cgroup() 
これから 
lock_page_cgroup() 
pc->memcg = memcg 
unlock_page_cgroup() 
どうやったか?
課金処理 
カウンタにチャージ 
Limit Hit ? 
Page単位に記録 
メモリ回収 
Lock 
Lock
try-commit-cancel 
Race conditionを扱うためにmemory cgroupで使われるテクニック 
Try 
リソースを予約 
メモリ関連の処理 
commit 
ページ情報の記録 
成功 
失敗 
cancel
Johannes の改善:lock外し 
改善前 
メモリ獲得 
課金処理 (Try+Commit) 
メモリ管理処理 
改善後 
メモリ獲得 
課金処理(Try) 
メモリ管理処理 
課金処理(Commit) 
課金処理中に処理する必要のあった 競合状態を、処理を2段階に 分割することでメモリ管理処理自身が持つロックの中に隠す 
Lock 
Lock 
Lock 
Lock 
Lock
ページの解放処理改善 
munmap/exit等 
free_pgtables() 
vmaのリストを元に 
Page tableをscan 
zap_pte_range() 
unmapして 
Page tableをクリア 
Page一覧を覚える 
tlb_flush_mmu_free() 
覚えておいたページを解放していく。 最大1万ページ分くらいをまとめて処理。 
1 
実はJohannes のパッチ以前は①の時点で課金を返却していたけど 
以後は②の時点で返却している。つまり、完全に誰も使わなくなってからのみ 
課金の返却を行うようにした。これでLockが外れる。 
2
消えた
ページ回収 
Page 
Active/Inactiveという2つのリストでLRU管理 
補充 
ユーザメモリ 
はActiveから 
ファイル 
はInactive 
Page 
Page 
Page 
Page 
Page 
Active List 
Inactive List 
Accessが無ければ 
Reclaim 
Access Test 
Access 
Test 
Access有
LRUによるページ回収 +memory cgroup 
P 
P 
P 
P 
P 
P 
cgroup 
Active List 
Inactive List 
Memory cgroup毎にLRU(Active/Inactive)を持つ システム全体のLRUは存在しない。
新Global LRU 
P 
P 
P 
P 
P 
P 
cgroup 
P 
P 
P 
P 
P 
P 
cgroup 
P 
P 
P 
P 
P 
P 
cgroup 
P 
P 
P 
P 
P 
P 
cgroup 
現在、システムの 
GLOBAL LRUは 
各memory cgroup 
を巡回してページ回収 
を行っている 
Root cgroupを起点に 
Depth First Search (pre-order) 
でヒエラルキーの木を探索
気になる所 
Q)所謂LRUではないんじゃないの? 
A)LRUではない。 
Q) Scan 順序は? 
A)Node を選択 -> Zoneを選択 -> cgroupを巡回 Q)全cgroupをscan するの? A)基本的には全cgroupを見て回る ->cgroupが多い場合、scan量が増える
Global なメモリ回収と memory cgroup limitのメモリ回収の差 
Globalな回収 
メモリ不足の起きた Node/Zoneからメモリを回収する 
公平性の為とか間違ったOOM判断を避けるために全 cgroupをスキャンする 
Memory Limitによる回収 
Round Robinでnode/zoneからメモリ回収 
ヒエラルキ上関連するcgroupからメモリを回収する 
必要なだけ回収をしたら回収を止める
Vmpressure notify 
“memory.pressure_level” 
メモリ回収動作から“メモリの獲得コスト”を予想する 
Low : メモリ回収は快調 
Medium : ちょっとかかるかも、swapするかも 
Critical : めっちゃ重い、ぶっちゃけ無理 
回収できなかったページ数/スキャンしたページ数 で予測 
512 page回収したら再計算をトリガーする。
今後の強化ポイント(予想) 
Kernel memory cgroupのメモリ回収処理を追加 
Blkio cgroupと連動しての buffered I/Oの制御 
Page付帯情報を16バイトから8バイトへ 
Soft Limit の再実装 
Kswapd per memory cgroup 
…….. 
不揮発メモリの扱い?
Fin.
1 of 54

Recommended

LinuxのFull ticklessを試してみた by
LinuxのFull ticklessを試してみたLinuxのFull ticklessを試してみた
LinuxのFull ticklessを試してみたHiraku Toyooka
10.5K views19 slides
Ethernetの受信処理 by
Ethernetの受信処理Ethernetの受信処理
Ethernetの受信処理Takuya ASADA
24.5K views62 slides
Yoctoで綺麗なkernel configを作る by
Yoctoで綺麗なkernel configを作るYoctoで綺麗なkernel configを作る
Yoctoで綺麗なkernel configを作るshimadah
3.8K views25 slides
ゼロからはじめるKVM超入門 by
ゼロからはじめるKVM超入門ゼロからはじめるKVM超入門
ゼロからはじめるKVM超入門VirtualTech Japan Inc.
22.2K views18 slides
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management) by
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)Mr. Vengineer
9.5K views76 slides
マルチコアとネットワークスタックの高速化技法 by
マルチコアとネットワークスタックの高速化技法マルチコアとネットワークスタックの高速化技法
マルチコアとネットワークスタックの高速化技法Takuya ASADA
16.9K views69 slides

More Related Content

What's hot

Linux の hugepage の開発動向 by
Linux の hugepage の開発動向Linux の hugepage の開発動向
Linux の hugepage の開発動向Naoya Horiguchi
2.3K views18 slides
High Performance Networking with DPDK & Multi/Many Core by
High Performance Networking with DPDK & Multi/Many CoreHigh Performance Networking with DPDK & Multi/Many Core
High Performance Networking with DPDK & Multi/Many Coreslankdev
2.9K views38 slides
Linux kernel tracing by
Linux kernel tracingLinux kernel tracing
Linux kernel tracingViller Hsiao
16.9K views70 slides
ARM LinuxのMMUはわかりにくい by
ARM LinuxのMMUはわかりにくいARM LinuxのMMUはわかりにくい
ARM LinuxのMMUはわかりにくいwata2ki
6.7K views11 slides
一歩進んだXen仮想化環境構築 by
一歩進んだXen仮想化環境構築一歩進んだXen仮想化環境構築
一歩進んだXen仮想化環境構築VirtualTech Japan Inc.
1.7K views19 slides
マーク&スイープ勉強会 by
マーク&スイープ勉強会マーク&スイープ勉強会
マーク&スイープ勉強会7shi
5.7K views39 slides

What's hot(20)

Linux の hugepage の開発動向 by Naoya Horiguchi
Linux の hugepage の開発動向Linux の hugepage の開発動向
Linux の hugepage の開発動向
Naoya Horiguchi2.3K views
High Performance Networking with DPDK & Multi/Many Core by slankdev
High Performance Networking with DPDK & Multi/Many CoreHigh Performance Networking with DPDK & Multi/Many Core
High Performance Networking with DPDK & Multi/Many Core
slankdev2.9K views
Linux kernel tracing by Viller Hsiao
Linux kernel tracingLinux kernel tracing
Linux kernel tracing
Viller Hsiao16.9K views
ARM LinuxのMMUはわかりにくい by wata2ki
ARM LinuxのMMUはわかりにくいARM LinuxのMMUはわかりにくい
ARM LinuxのMMUはわかりにくい
wata2ki6.7K views
マーク&スイープ勉強会 by 7shi
マーク&スイープ勉強会マーク&スイープ勉強会
マーク&スイープ勉強会
7shi 5.7K views
GPU仮想化最前線 - KVMGTとvirtio-gpu - by zgock
GPU仮想化最前線 - KVMGTとvirtio-gpu -GPU仮想化最前線 - KVMGTとvirtio-gpu -
GPU仮想化最前線 - KVMGTとvirtio-gpu -
zgock6.8K views
ARM Trusted FirmwareのBL31を単体で使う! by Mr. Vengineer
ARM Trusted FirmwareのBL31を単体で使う!ARM Trusted FirmwareのBL31を単体で使う!
ARM Trusted FirmwareのBL31を単体で使う!
Mr. Vengineer13K views
PG-REXで学ぶPacemaker運用の実例 by kazuhcurry
PG-REXで学ぶPacemaker運用の実例PG-REXで学ぶPacemaker運用の実例
PG-REXで学ぶPacemaker運用の実例
kazuhcurry14.8K views
The Forefront of the Development for NVDIMM on Linux Kernel (Linux Plumbers c... by Yasunori Goto
The Forefront of the Development for NVDIMM on Linux Kernel (Linux Plumbers c...The Forefront of the Development for NVDIMM on Linux Kernel (Linux Plumbers c...
The Forefront of the Development for NVDIMM on Linux Kernel (Linux Plumbers c...
Yasunori Goto560 views
CXL_説明_公開用.pdf by Yasunori Goto
CXL_説明_公開用.pdfCXL_説明_公開用.pdf
CXL_説明_公開用.pdf
Yasunori Goto3.9K views
USENIX ATC 2017: Visualizing Performance with Flame Graphs by Brendan Gregg
USENIX ATC 2017: Visualizing Performance with Flame GraphsUSENIX ATC 2017: Visualizing Performance with Flame Graphs
USENIX ATC 2017: Visualizing Performance with Flame Graphs
Brendan Gregg674.4K views
Docker入門: コンテナ型仮想化技術の仕組みと使い方 by Yuichi Ito
Docker入門: コンテナ型仮想化技術の仕組みと使い方Docker入門: コンテナ型仮想化技術の仕組みと使い方
Docker入門: コンテナ型仮想化技術の仕組みと使い方
Yuichi Ito68.7K views
仮想化環境におけるパケットフォワーディング by Takuya ASADA
仮想化環境におけるパケットフォワーディング仮想化環境におけるパケットフォワーディング
仮想化環境におけるパケットフォワーディング
Takuya ASADA17.4K views
[Container Plumbing Days 2023] Why was nerdctl made? by Akihiro Suda
[Container Plumbing Days 2023] Why was nerdctl made?[Container Plumbing Days 2023] Why was nerdctl made?
[Container Plumbing Days 2023] Why was nerdctl made?
Akihiro Suda335 views
10GbE時代のネットワークI/O高速化 by Takuya ASADA
10GbE時代のネットワークI/O高速化10GbE時代のネットワークI/O高速化
10GbE時代のネットワークI/O高速化
Takuya ASADA59.4K views
ELFの動的リンク by 7shi
ELFの動的リンクELFの動的リンク
ELFの動的リンク
7shi 18K views
Blazing Performance with Flame Graphs by Brendan Gregg
Blazing Performance with Flame GraphsBlazing Performance with Flame Graphs
Blazing Performance with Flame Graphs
Brendan Gregg323.6K views

Viewers also liked

Linux女子部のご紹介 by
Linux女子部のご紹介Linux女子部のご紹介
Linux女子部のご紹介Manami Taira
2.2K views13 slides
ぼちぼちぼっち開発 with Raspberry Pi in 大阪 by
ぼちぼちぼっち開発 with Raspberry Pi in 大阪ぼちぼちぼっち開発 with Raspberry Pi in 大阪
ぼちぼちぼっち開発 with Raspberry Pi in 大阪catmoney
6.9K views33 slides
KVM+cgroup by
KVM+cgroupKVM+cgroup
KVM+cgroup(^-^) togakushi
4.3K views23 slides
FreeBSD VPSでLive Migration by
FreeBSD VPSでLive MigrationFreeBSD VPSでLive Migration
FreeBSD VPSでLive Migrationspg_games
1K views20 slides
第六回コンテナ型仮想化情報交換会_LinuxContainerLivemigrationCRIU by
第六回コンテナ型仮想化情報交換会_LinuxContainerLivemigrationCRIU第六回コンテナ型仮想化情報交換会_LinuxContainerLivemigrationCRIU
第六回コンテナ型仮想化情報交換会_LinuxContainerLivemigrationCRIUKengo Okitsu
1.9K views11 slides
こんてなぐらし!〜FreeBSD VPSでライブマイグレーション〜 by
こんてなぐらし!〜FreeBSD VPSでライブマイグレーション〜こんてなぐらし!〜FreeBSD VPSでライブマイグレーション〜
こんてなぐらし!〜FreeBSD VPSでライブマイグレーション〜furandon_pig
3.1K views16 slides

Viewers also liked(20)

Linux女子部のご紹介 by Manami Taira
Linux女子部のご紹介Linux女子部のご紹介
Linux女子部のご紹介
Manami Taira2.2K views
ぼちぼちぼっち開発 with Raspberry Pi in 大阪 by catmoney
ぼちぼちぼっち開発 with Raspberry Pi in 大阪ぼちぼちぼっち開発 with Raspberry Pi in 大阪
ぼちぼちぼっち開発 with Raspberry Pi in 大阪
catmoney6.9K views
FreeBSD VPSでLive Migration by spg_games
FreeBSD VPSでLive MigrationFreeBSD VPSでLive Migration
FreeBSD VPSでLive Migration
spg_games1K views
第六回コンテナ型仮想化情報交換会_LinuxContainerLivemigrationCRIU by Kengo Okitsu
第六回コンテナ型仮想化情報交換会_LinuxContainerLivemigrationCRIU第六回コンテナ型仮想化情報交換会_LinuxContainerLivemigrationCRIU
第六回コンテナ型仮想化情報交換会_LinuxContainerLivemigrationCRIU
Kengo Okitsu1.9K views
こんてなぐらし!〜FreeBSD VPSでライブマイグレーション〜 by furandon_pig
こんてなぐらし!〜FreeBSD VPSでライブマイグレーション〜こんてなぐらし!〜FreeBSD VPSでライブマイグレーション〜
こんてなぐらし!〜FreeBSD VPSでライブマイグレーション〜
furandon_pig3.1K views
IoTプラレールのしょうかい by Manami Taira
IoTプラレールのしょうかいIoTプラレールのしょうかい
IoTプラレールのしょうかい
Manami Taira11K views
โครงงานคอม โรคอ้วน เนื้อหา by Aoraoraor Pattraporn
โครงงานคอม โรคอ้วน เนื้อหาโครงงานคอม โรคอ้วน เนื้อหา
โครงงานคอม โรคอ้วน เนื้อหา
Casia have your say by pranav0289
Casia have your sayCasia have your say
Casia have your say
pranav0289224 views
Science is Fun | My Sims 4 Gallery by RachelRosebud
Science is Fun | My Sims 4 GalleryScience is Fun | My Sims 4 Gallery
Science is Fun | My Sims 4 Gallery
RachelRosebud234 views
Firecracker #BuildnShare01 by RachelRosebud by RachelRosebud
Firecracker #BuildnShare01 by RachelRosebudFirecracker #BuildnShare01 by RachelRosebud
Firecracker #BuildnShare01 by RachelRosebud
RachelRosebud365 views
Casia have your say by pranav0289
Casia have your sayCasia have your say
Casia have your say
pranav0289216 views
Sandtrap Red - Sims 4 Gallery Build by RachelRosebud
Sandtrap Red - Sims 4 Gallery BuildSandtrap Red - Sims 4 Gallery Build
Sandtrap Red - Sims 4 Gallery Build
RachelRosebud110 views
โครงงานคอม โรคอ้วน เนื้อหา by Aoraoraor Pattraporn
โครงงานคอม โรคอ้วน เนื้อหาโครงงานคอม โรคอ้วน เนื้อหา
โครงงานคอม โรคอ้วน เนื้อหา

Similar to Cgroupあれこれ-第4回コンテナ型仮想化の情報交換会資料

Open VZ by
Open VZOpen VZ
Open VZKazuaki Fujikura
2.6K views56 slides
Google Perf Tools (tcmalloc) の使い方 by
Google Perf Tools (tcmalloc) の使い方Google Perf Tools (tcmalloc) の使い方
Google Perf Tools (tcmalloc) の使い方Kazuki Ohta
5.8K views24 slides
MINCS – containers in the shell script by
MINCS – containers in the shell scriptMINCS – containers in the shell script
MINCS – containers in the shell scriptMasami Hiramatsu
6.1K views39 slides
UE4におけるLoadingとGCのProfilingと最適化手法 by
UE4におけるLoadingとGCのProfilingと最適化手法UE4におけるLoadingとGCのProfilingと最適化手法
UE4におけるLoadingとGCのProfilingと最適化手法エピック・ゲームズ・ジャパン Epic Games Japan
20.9K views65 slides
NVIDIA Japan Seminar 2012 by
NVIDIA Japan Seminar 2012NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012Takuro Iizuka
1.5K views38 slides
小二病でもGCやりたい by
小二病でもGCやりたい小二病でもGCやりたい
小二病でもGCやりたいdec9ue
1.8K views28 slides

Similar to Cgroupあれこれ-第4回コンテナ型仮想化の情報交換会資料(20)

Google Perf Tools (tcmalloc) の使い方 by Kazuki Ohta
Google Perf Tools (tcmalloc) の使い方Google Perf Tools (tcmalloc) の使い方
Google Perf Tools (tcmalloc) の使い方
Kazuki Ohta5.8K views
MINCS – containers in the shell script by Masami Hiramatsu
MINCS – containers in the shell scriptMINCS – containers in the shell script
MINCS – containers in the shell script
Masami Hiramatsu6.1K views
NVIDIA Japan Seminar 2012 by Takuro Iizuka
NVIDIA Japan Seminar 2012NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012
Takuro Iizuka1.5K views
小二病でもGCやりたい by dec9ue
小二病でもGCやりたい小二病でもGCやりたい
小二病でもGCやりたい
dec9ue1.8K views
GCをみればRTSが見えてくる、かも。。。 by dec9ue
GCをみればRTSが見えてくる、かも。。。GCをみればRTSが見えてくる、かも。。。
GCをみればRTSが見えてくる、かも。。。
dec9ue4.8K views
Principles of Transaction Processing Second Edition 9章 4~9節 by Yuichiro Saito
Principles of Transaction Processing Second Edition 9章 4~9節Principles of Transaction Processing Second Edition 9章 4~9節
Principles of Transaction Processing Second Edition 9章 4~9節
Yuichiro Saito656 views
Lxc cf201207-presen by Kouhei Maeda
Lxc cf201207-presenLxc cf201207-presen
Lxc cf201207-presen
Kouhei Maeda1.3K views
Concurrent Mark-Sweep Garbage Collection #jjug_ccc by Yuji Kubota
Concurrent Mark-Sweep Garbage Collection #jjug_cccConcurrent Mark-Sweep Garbage Collection #jjug_ccc
Concurrent Mark-Sweep Garbage Collection #jjug_ccc
Yuji Kubota115.2K views
不安定な環境の中でのバッチ処理~JobQueueシステムQudoを使った事例~ by Akabane Hiroyuki
不安定な環境の中でのバッチ処理~JobQueueシステムQudoを使った事例~不安定な環境の中でのバッチ処理~JobQueueシステムQudoを使った事例~
不安定な環境の中でのバッチ処理~JobQueueシステムQudoを使った事例~
Akabane Hiroyuki3.8K views
backbone としての timm 入門 by Takuji Tahara
backbone としての timm 入門backbone としての timm 入門
backbone としての timm 入門
Takuji Tahara7.4K views
自作コンピューターでなんかする - 第八回 カーネル/VM探検隊&懇親会 by Hirotaka Kawata
自作コンピューターでなんかする - 第八回 カーネル/VM探検隊&懇親会自作コンピューターでなんかする - 第八回 カーネル/VM探検隊&懇親会
自作コンピューターでなんかする - 第八回 カーネル/VM探検隊&懇親会
Hirotaka Kawata1.9K views
C++ Transactional Memory言語拡張の紹介 by yohhoy
C++ Transactional Memory言語拡張の紹介C++ Transactional Memory言語拡張の紹介
C++ Transactional Memory言語拡張の紹介
yohhoy4.8K views
Re: 運用に自動化を求めるのは間違っているだろうか by Masahito Zembutsu
Re: 運用に自動化を求めるのは間違っているだろうかRe: 運用に自動化を求めるのは間違っているだろうか
Re: 運用に自動化を求めるのは間違っているだろうか
Masahito Zembutsu23.6K views
Web時代の大富豪的プログラミングのススメ by Hideyuki Takeuchi
Web時代の大富豪的プログラミングのススメWeb時代の大富豪的プログラミングのススメ
Web時代の大富豪的プログラミングのススメ
Hideyuki Takeuchi7.3K views
【学習メモ#8th】12ステップで作る組込みOS自作入門 by sandai
【学習メモ#8th】12ステップで作る組込みOS自作入門 【学習メモ#8th】12ステップで作る組込みOS自作入門
【学習メモ#8th】12ステップで作る組込みOS自作入門
sandai2.8K views
[Basic 9] 並列処理 / 排他制御 by Yuto Takei
[Basic 9] 並列処理 / 排他制御[Basic 9] 並列処理 / 排他制御
[Basic 9] 並列処理 / 排他制御
Yuto Takei2.5K views
Bsd5.12.3 by K5_sem
Bsd5.12.3Bsd5.12.3
Bsd5.12.3
K5_sem758 views

Recently uploaded

システム概要.pdf by
システム概要.pdfシステム概要.pdf
システム概要.pdfTaira Shimizu
44 views1 slide
JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私 by
JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私
JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私修治 松浦
211 views36 slides
概要.pdf by
概要.pdf概要.pdf
概要.pdfTaira Shimizu
6 views1 slide
ウォーターフォール開発で生 産性を測る指標 by
ウォーターフォール開発で生 産性を測る指標ウォーターフォール開発で生 産性を測る指標
ウォーターフォール開発で生 産性を測る指標Kouhei Aoyagi
58 views13 slides
onewedge_companyguide1 by
onewedge_companyguide1onewedge_companyguide1
onewedge_companyguide1ONEWEDGE1
81 views22 slides
Najah Matsuo Self Introduction by
Najah Matsuo Self IntroductionNajah Matsuo Self Introduction
Najah Matsuo Self IntroductionNajahMatsuo
16 views29 slides

Recently uploaded(6)

JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私 by 修治 松浦
JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私
JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私
修治 松浦211 views
ウォーターフォール開発で生 産性を測る指標 by Kouhei Aoyagi
ウォーターフォール開発で生 産性を測る指標ウォーターフォール開発で生 産性を測る指標
ウォーターフォール開発で生 産性を測る指標
Kouhei Aoyagi58 views
onewedge_companyguide1 by ONEWEDGE1
onewedge_companyguide1onewedge_companyguide1
onewedge_companyguide1
ONEWEDGE181 views
Najah Matsuo Self Introduction by NajahMatsuo
Najah Matsuo Self IntroductionNajah Matsuo Self Introduction
Najah Matsuo Self Introduction
NajahMatsuo16 views

Cgroupあれこれ-第4回コンテナ型仮想化の情報交換会資料

  • 3. 自己紹介 亀澤 寛之(@hiro_kamezawa) 某F社 今の仕事はマネージャ 現役だったのは2年前 HPCじゃなくエンタープライズ系 元memory cgroupの開発者 最近面白そうなもの Dockerと周辺 kdbus、systemd
  • 4. Cgroup “Control Group” の略 -タスクのグループを作る -作ったグループに対し制限・パラメータ等を設定する ための機能 例えば、KVMのフロントエンドの “libvirt” は各 KVMを cgroupの下に突っ込んで動かすことで CPU,Memory等の リソース制御を行っている。
  • 5. Cgroup ? 実は元々、”Process Container ” って名前で開発が始まった。 +/* + * cgroup_create_dir - create a directory for an object. + * cont: the cgroup we create the directory for. + * It must have a valid ->parent field + * And we are going to fill its ->dentry field. + * dentry: dentry of the new container + * mode: mode to set on new directory. + */ 昔のコードを見ると“Container”の文字が結構あったりする “Process Container”機能だけじゃ”Container”にならないよね? とかそういう話もあって “Control Group”に
  • 6. 汎用性のために Cgroup を作っている最中には色々議論があって 特定用途でなく“汎用性”を重視すべきだとか。 それで今の形、cpu, memory etc…をバラバラに管理できるようになった。 名前も Control Groupに。 Kernel 2.6.24 (2007年)にマージ。 当時からgoogleのエンジニアがメンテナ(代替わりしたけど)。 =>結局、無駄に複雑にしたことで、後々問題になるんだけど
  • 7. 昔と今と なんだこのCgroup機能って、俺たちのコードを汚くする上に 性能を落とすだけの機能じゃねーか。 誰が使うんだこんなもん 昔の雰囲気 コンテナとかで使ってるみたいだからユースケースが あるんだろうが、ホットパスをいじる時は気をつけろよ 昔よりも根本的なところでコードをよくして行ける。
  • 8. Cgroupの機能 タスクをグループ化する グループは動的に生成・廃棄が可能 各グループはヒエラルキを作る 各ヒエラルキには“サブシステム”で様々な属性を付与 仮想ファイルシステムインタフェースで実装される mkdir で cgroupを作る タスクの子タスクは同一のグループに所属する 全てのタスクはいずれかのcgroupに所属する 所属していないように見えるタスクは “root” cgroupに所属
  • 9. 現在のsubsystem cpu cpuacct cpuset memory blkio device freezer net_class net_pio perf hugetlb
  • 11. ヒエラルキ② Subsystem毎に階層構造の効果が異なる! CPU のヒエラルキ メモリのヒエラルキ 増々カオス・・・ 基本的に上位のリソース を下位で分割してゆく 1/2 1/2 1/2 x 1/3 上位の影響をうけるかどうか スイッチで選べる
  • 12. ヒエラルキ③ A B C D 中間層にもタスクが所属可能! CPU のヒエラルキ 例えば、Aグループの下に B、C,D,グループがあるとする。 Aグループにタスクが3つ所属し、 B,C,Dにそれぞれタスクが 1つずつ所属する時、それぞれ のタスクが受け取るCPU リソースはいくつか? 1/2 1/2 1/2 x 1/3 わけわからん
  • 14. 自由度高杉問題 自由度を優先した実装だったんだけど・・・ 複雑なコード わけのわからんヒエラルキ Memory等はプロセス単位で管理されるのにスレッド単位で グループに所属可能 Cgroup間の連携が皆無 ⇒memory cgroup と blkio cgroupがバラバラになっている ため、buffered I/O にうまくタグ付けが出来ないから buffered I/O制限が実施できないとか。
  • 15. sane_behavior mount -t cgroup -o __DEVEL__sane_behavior cgroup $MOUNT_POINT 元々の実装がcgroupの使い方に制約を加えていないことへの怒りが生み出した “正しい”使い方 ヒエラルキ-はシステムに一つだけ(default ヒエラルキ-を作る) Remount/rename は不可 プロセス単位で管理。タスク単位では管理しない Taskの所属しないcgroup状態のnotification機能追加 プロセスを持たないグループだけがサブシステム効果を得る Memory, blkio cgroupはデフォルトでヒエラルキー効果が有効化 カーネル 3.19~20あたりでdefault化かな?
  • 16. 新ヒエラルキルール A B C D ヒエラルキ 例えば、Aグループの下に B、C,D,グループがあるとする。 AグループでCPU cgroupをenable した場合、BCDに効果が及ぶが Aにはタスクが所属できない。 BCDにのみタスクが所属可能 1/2 1/2 1/2 x 1/3
  • 17. cpusetの運命? cpuset はcgroupが出来る前からあったのだけど、似て るってことでcgroupに取り込まれた。 元々cpusetはスレッド単位でcpu bindの制御等ができた 今もできている sane_behaviorになると?
  • 18. systemd systemdが全てのcgroupを牛耳る! Systemdが有効なシステムではsystemdでcgroupを作る Unit file を使って作る DBUS APIで作る ….mkdir よりめんどくさい …けどsystemdのツール群は正直便利 ※ libvirt のcgroup関係もsystemdを使うよう書き直された
  • 19. 3つのslice systemd user.slice system.slice machine.slice
  • 20. ちなみに 今の所systemd から設定できるパラメータは限定的 CPUの”Share”は設定できても“Limit”は設定できない Memoryの上限は設定できても Swapの設定ができない Etc….. Systemdの開発者に聞いてところ、Linux Kernel側の Cgroupの再設計作業がひと段落してAPIが確定するまで 増やさないとのこと・・・ ⇒手動でどうぞ。
  • 22. Memory cgroup 1.メモリ使用量の上限を設定できる ユーザメモリとページ(ファイル)キャッシュ 2.メモリ+swap使用量の上限を設定できる 3.カーネルメモリの使用量上限を設定できる 4.TCPのバッファ量を制限できる 1~3は連携している。 ….実はTCPのバッファ量制御だけ仲間外れで他の3つとは独立 (元々network bufferのシステム上限制御のcgroup版だから なのだけど)
  • 23. ところで・・・・ Johannes Weiner が 2014/08/08 のコミットで 書き換えまくったので(綺麗になったし性能もよくなった) そのバージョンに基づいてしゃべります。 ※なので今手に入るカーネルとは少し違うかも。 昔はホットパス等に手を入れるのに反発もあったので かなり外付けコード風にmemory cgroupを作ってた。 最近は市民権?も出て来たのでよりスリム化している最中。
  • 24. ユーザメモリのアカウンティング ~ページフォルト~ プロセス実行 ページフォルト ページフォルトハンドラ Memory cgroup 課金する ページフォルトの際に アロケートされたメモリ に対し課金を行う
  • 25. ユーザメモリのアカウンティング② ~メモリ解放~ munmap() や exit() put_page() メモリ解放処理 Memory cgroup 使用量の返却
  • 26. ユーザメモリのアカウンティング③ ~swap out処理~ メモリ回収処理 ページを選択 スワップキャッシュに追加 unmap Swap out 宙ぶらりん フリー メモリ使用量を減らす スワップアウトしたことを記録 ユーザメモリはスワップに行った後も 開放されない場合があるのがいやらしい・・・
  • 27. ユーザメモリのアカウンティング ~swapin 処理~ プロセス実行 ページフォルト ページフォルトハンドラ Swapの記録域から Memory cgroup情報を 読み出して課金する Swap-in処理 実はswap inがくせもので、 SwapCacheにヒットして、既に課金済の ページを拾ってくることがある。 この辺、race conditionとかややこしい -> Johannesの改善で少しマシに。
  • 28. ページキャッシュのアカウンティング ページ 獲得 ページキャッシュに追加 メモリ使用量UP Radix-Tree ページキャッシュから削除 put_page() 時に メモリ使用量を返却 ページ 解放 最初にページを読んだ人に課金される。 共有されるページキャッシュの扱いが問題だったが・・・ 結局コンテナメインなら共有はあんまりかんがえなくていいよね?
  • 29. Kernelメモリのアカウンティング① 1.SLAB / SLUB アロケータからページを割り当てた場合 2.alloc_kmem_pages()を呼ぶ場合 …とはいえ、alloc_kmem_pages()はkmalloc()から 呼ばれる。 基本、kmallocやslab関係で page単位に課金される。
  • 30. Kernel メモリのアカウンティング② 今の所、カーネルメモリ課金は free()されたときに減算。 …..とはいえ、特定のmemory cgroup狙い撃ちでカーネル メモリを解放して行くようなルーチンはいまのところまだ無い。 つまり、memory cgroupを削除してもまだ課金されている状 態….ということもあるわけで、あんまり使わない方がいい。
  • 31. TCP bufferのアカウンティング 元々、システム全体でtcp bufferを制限するための仕組みが あり、それを流用。 Socket の data用のメモリ域をアロケートするところで判定す る。
  • 32. Memory cgroupの面倒なところ タスクのライフサイクルとメモリのライフサイクルが異なる 莫大な性能オーバヘッドがあると信じられている タスクに課金するわけじゃなくてページに課金しているので race conditionが多い ….少しずつ説明してみます。
  • 33. ライフサイクル 元々のcgroupデザイン時の期待値 Task がいなくなると参照が無くなる⇒削除可能 メモリcgroup Taskがいなくなっても以下が残る ページキャッシュ カーネルメモリ スワップキャッシュ(残ることがある) このあたりの処理をするためにリファレンスカウント処理等々を入れた おかげで性能に影響が出たり、race conditionが発生
  • 34. オーバヘッド Kernelは1ページ(4096byte)単位にPage構造体 (64バイト)を割り当てる。Memory cgroupは1ページごと に、16byte使用する。 => 1G毎に4Mバイト。 Cgroup毎にカウンターを一つ持つ。カウンターはスピンロック で保護される。課金情報はココで管理 Page 情報の管理のためにロック操作が必要だった ⇒ 2014/08 のパッチ群でJohannesが解決。
  • 35. Race condition ページに対して課金する ページマイグレーション時の課金の移動 Transparent Huge Page SwapCache ページの”dirty”等の属性のカウンティング Taskをcgroup間移動した際に課金情報を移動させる機 能がある ロックを使っていると性能に出てくる
  • 36. Memory cgroupの性能オーバヘッド① 一番最初のナイーブな実装 1ページの課金ごとにカウンタ(spinlock付)を操作 /::::i::::、:::ヽ、:::::\:ヽ:\::::::ヽ:::、::ヽ::、:', /::i|::l::ト、ヽ::、:::ヽ:、::::::\::ヽ::::l::::ヽ::i:::i:::! /:/:!:::!:|::ヽ:\ヽ::::、:\::::ヽ:::ヽ!::::::i::|:::!::! !ハ::|::::i::l:|心、:ヽ::\:ヽ_\、\:::ヽ:::|!::|:|i i、:!:|:、N{、ヒjヽゝ\ヾイ ヒj >、ヽi:、|!:|:l ヽ:!::トヽ ̄ l! ` ` ̄´ |::l::|:|j:,!:! 駄目だこいつ ト、::! u j |::/lj:::!リ ヾ、 丶 - u リイ:|リ 早くなんとかしないと…… リヽ ‐、ー- 、_ /イ:::i rー'"ト:l゙、  ̄ ./ , |::! / ヘ ヾ ヽ、 _,. ' / |:'
  • 37. ヒエラルキとカウンタ counter counter counter counter lock lock lock lock 一つカウントすると カウンタとlockを複数操作
  • 38. 性能オーバヘッド改善① ・・・・・ 各CPU struct { struct memcg *ptr; unsigned long nr_pages; } 中央のカウンタ 128kb 単位で課金 4kb 単位で課金 ス レ ッ ド 各CPU毎に128KBずつ、現在走行中のスレッド が所属するmemory cgroupから利用量をキャッシュ。 (スレッドが切り替わったら必要に応じて返却) CPU数が増えたらどうかと思ってたけど自動ヒュージページで影響が見えにくくなった。 課金処理オーバヘッドの削減 所属
  • 39. 性能オーバヘッド改善② メモリ解放処理等 Pagevec処理 Memory cgroupへの返却は put_page() のバッチ処理の中で複数のページ分を まとめてカウンタ操作していく。 今は数百ページ単位で処理。
  • 40. カウンタの誤差 Memory cgroup は性能のためにカウント誤差を許容 -課金の際には各CPUあたり最大128KB分の“前借り” -ページテーブルからメモリが剥がされても実際にページアロケー タに返却される直前までは課金が返済されない。 ファジーなカウンターと呼んだりするけど、Linuxの中にはファジー な値が結構ある。 例)タスク毎のrss accountingとか。
  • 41. Johannesの改善 今まで lock_page_cgroup() pc->memcg = memcg unlock_page_cgroup() これから lock_page_cgroup() pc->memcg = memcg unlock_page_cgroup() どうやったか?
  • 42. 課金処理 カウンタにチャージ Limit Hit ? Page単位に記録 メモリ回収 Lock Lock
  • 43. try-commit-cancel Race conditionを扱うためにmemory cgroupで使われるテクニック Try リソースを予約 メモリ関連の処理 commit ページ情報の記録 成功 失敗 cancel
  • 44. Johannes の改善:lock外し 改善前 メモリ獲得 課金処理 (Try+Commit) メモリ管理処理 改善後 メモリ獲得 課金処理(Try) メモリ管理処理 課金処理(Commit) 課金処理中に処理する必要のあった 競合状態を、処理を2段階に 分割することでメモリ管理処理自身が持つロックの中に隠す Lock Lock Lock Lock Lock
  • 45. ページの解放処理改善 munmap/exit等 free_pgtables() vmaのリストを元に Page tableをscan zap_pte_range() unmapして Page tableをクリア Page一覧を覚える tlb_flush_mmu_free() 覚えておいたページを解放していく。 最大1万ページ分くらいをまとめて処理。 1 実はJohannes のパッチ以前は①の時点で課金を返却していたけど 以後は②の時点で返却している。つまり、完全に誰も使わなくなってからのみ 課金の返却を行うようにした。これでLockが外れる。 2
  • 47. ページ回収 Page Active/Inactiveという2つのリストでLRU管理 補充 ユーザメモリ はActiveから ファイル はInactive Page Page Page Page Page Active List Inactive List Accessが無ければ Reclaim Access Test Access Test Access有
  • 48. LRUによるページ回収 +memory cgroup P P P P P P cgroup Active List Inactive List Memory cgroup毎にLRU(Active/Inactive)を持つ システム全体のLRUは存在しない。
  • 49. 新Global LRU P P P P P P cgroup P P P P P P cgroup P P P P P P cgroup P P P P P P cgroup 現在、システムの GLOBAL LRUは 各memory cgroup を巡回してページ回収 を行っている Root cgroupを起点に Depth First Search (pre-order) でヒエラルキーの木を探索
  • 50. 気になる所 Q)所謂LRUではないんじゃないの? A)LRUではない。 Q) Scan 順序は? A)Node を選択 -> Zoneを選択 -> cgroupを巡回 Q)全cgroupをscan するの? A)基本的には全cgroupを見て回る ->cgroupが多い場合、scan量が増える
  • 51. Global なメモリ回収と memory cgroup limitのメモリ回収の差 Globalな回収 メモリ不足の起きた Node/Zoneからメモリを回収する 公平性の為とか間違ったOOM判断を避けるために全 cgroupをスキャンする Memory Limitによる回収 Round Robinでnode/zoneからメモリ回収 ヒエラルキ上関連するcgroupからメモリを回収する 必要なだけ回収をしたら回収を止める
  • 52. Vmpressure notify “memory.pressure_level” メモリ回収動作から“メモリの獲得コスト”を予想する Low : メモリ回収は快調 Medium : ちょっとかかるかも、swapするかも Critical : めっちゃ重い、ぶっちゃけ無理 回収できなかったページ数/スキャンしたページ数 で予測 512 page回収したら再計算をトリガーする。
  • 53. 今後の強化ポイント(予想) Kernel memory cgroupのメモリ回収処理を追加 Blkio cgroupと連動しての buffered I/Oの制御 Page付帯情報を16バイトから8バイトへ Soft Limit の再実装 Kswapd per memory cgroup …….. 不揮発メモリの扱い?
  • 54. Fin.