3月版 トレーサ関連に大きな進展、ftraceがデファクトに?
小崎資広
2009/4/8
機能・速度ともに大幅に改善されたmemory cgroup
2.6.29のマージウィンドウでは、大量のmemory cgroup(略してmemcg)のパッチがLinusツリーに流入しました。memcg関連だけで100パッチを超えたんじゃないかと思います。代表的な変更を挙げてみましょう。
■ヒエラルキーのサポート
従来のmemcgのメモリ制限は、グループの親子関係を考慮していませんでした。つまり、/cgroupファイルシステムに例1のようにグループを作成した場合と、例2のように作成した場合の動作はまったく同じでした。
例1: | ||
/cgroup/A | 制限1GB | |
/cgroup/B | 制限500MB | |
例2: | ||
/cgroup/A | 制限1GB | |
/cgroup/A/B | 制限500MB |
これはどういうことかというと、例2において、グループAが1GB、グループBが500MBで合計1.5GBのメモリを使用できるということです。
しかしながら、世の中にはユーザーXさんのメモリ使用量を全体で1GBに制限し、かつその中でもワークロードYのメモリ使用量は500MB以下に制限したい……というように、階層的に制約したいという状況がしばしばあります。
こういった要求に応えるため、Balbir Singhの手によりヒエラルキー機能が実装されました。上述の例の場合、グループAのmemory.use_hierarchyオプションをONにすることにより、ユーザーXとワークロードYの両方の制約を実現することができます。
この方式では、グループごとに動作を変更できるので非常に柔軟に制約条件を記述することができ、管理の手間を大幅に低減してくれると考えられています。
■Mem+Swap controller
半年ほど前にNishimura Daisuke氏が取り組んでいたswap controllerについてお伝えしましたが、紆余(うよ)曲折の末、その発展形とでもいうべきKAMEZAWA Hiroyuki氏のmem+swapコントローラがとうとうマージされました。
何を問題にしていたかというと、(不適切なメモリ制限値の設定などにより)memcgのメモリ制限下のプロセスがメモリを浪費し、少数のプロセスが全スワップスペースを使い切ってしまう現象を招くことがあります。これは、それ以外のグループのプロセスから見ると、使用可能スワップスペースがいつの間にかゼロになってしまうということであり、アンフェアーなOOM Killerを招いていました。
もともと提案されていたswap controllerは、この問題への対応策として、memcgから完全に独立してスワップ使用量をアカウントし、その最大値を制限する機能を提供していました。
しかしながらこのアプローチは、swap制限値が小さ過ぎた場合、メモリ制限より前にスワップ制限が掛かる場合がありました。その場合、スワップアウトすべき不要なメモリにもかかわらずスワップアウトできなくなるという、好ましくない影響をシステムに与えることになります。
そこで、コンセプトを若干変更し、メモリ量とスワップ量の合計値に基づいて制限する機能が開発されました。
例えば、システムのメモリ量とスワップ量がそれぞれ500MB、かつグループA、Bという2つのグループの制限値がそれぞれ500MBに設定されていたとしましょう。グループBのプロセスが不活性なプロセスばかりだった場合は、Linuxの通常のページングメカニズムにより、グループAがメモリを500M、グループBがスワップを500M使うよう自動的に調整されていくので、システム全体としてのリソース使用効率を上げることができます。
この機能も従来のメモリ制限値と組み合わせて使用できるので、非常に柔軟なポリシー設計を可能にしてくれます。
■Split-LRU reclaim balancing for memcg
2.6.28にて登場したSplit-LRU VMは、匿名ページとファイルキャッシュのどちらのページを優先的に回収するのかを、ワークロードに合わせて自動的に調整する機能があります。しかしこの機能は、実装者のRik van Rielがmemcgに詳しくなかったこともあり、memcg reclaimには実装されていませんでした。それが今回KOSAKI Motohiroの手によりmemcgに無事移植され、memcg使用時により賢いアルゴリズムで回収ページを決定してくれるよう変更されています。
■per cgroup swappiness
Linuxには従来より、/proc/sys/vm/swappinessというパラメータにより、匿名ページとファイルキャッシュの回収のされやすさを変更することができました。しかしながら「最適な匿名ページ数:ファイルキャッシュ」の比率はワークロード依存であり、システム全体の設定値ではなかなか使いづらいものでした。
そのため、KOSAKI Motohiroによりグループ単位で設定できるインターフェイスが実装されました。ファイルキャッシュがあまり意味を持たないワークロードでは、この値を低く設定することにより、より積極的にファイルキャッシュから回収してくれるようになります。逆もまたしかりです。
-stableの進ちょく
エンドユーザーが使い始めたこともあり、ext4関係でものすごい数のバグフィックスが流入しています。当面は収束の気配が見えません。また、IntelドライバのGEM関係も問題が多いようです。
■2.6.27.y:
- 割愛します。2.6.28.yとほぼ同じなので、そちらを参照願います。
■2.6.28.y:
- 2.6.28.5(2月12日):Greg K-H
・"rlimit:permit setting RLIMIT_NOFILE to RLIM_INFINITY" パッチを取り消し
・x86:AMD Fam10h CPUで32bit kernelがハングする問題を修正
・mm:mlockが誤った復帰値を返すことがあったのを修正
・shm:!CONFIG_SHMEMの場合に、ipcsコマンドがハングする問題を修正
ほか、54パッチ
- 2.6.28.6(2月17日):Greg K-H
・x86:AMDのマイクロコードのロード処理におけるCPU idの判定を正しくした
・mm:CONFIG_UNEVICTABLE_LRUがON、かつXENを使用した場合プロセス終了処理において解放後のページにアクセスする場合があった問題を修正
・Berkeley DB性能がregressionしていた問題を修正
ほか、50パッチ
- 2.6.28.7(2月20日):Og
・ext4:ディレイドアロケーション時のアロケートブロックを正しいオフセットで行うようにした
・ext4:1つしかBGがないファイルシステムをマウントしたときにエラーになってしまう問題を修正
・ext4:allocation_contextのac_statusを上書きしないようにしてデッドロックを回避した
・ext4:FSリサイズ時の処理がおかしかったのを修正
・ext4:リサイズ時にEXT4_GROUP_INFO_NEED_INIT_BITを使うようにした
・ext4:解放済みであるが、まだコミットされていないブロックを使わないようにした
・ext4:read_block_bitmap()とmark_diskspace_used()のレースを修正
・ext4:read_inode_bitmap()とext4_new_inode()にレースを修正
・ext4:未初期化のグループはオンディスクビットマップも未初期化であるため、buffer_headにフラグを追加して、チェックできるようにした
・ext4:blocks/inode ビットマップをグループ末尾移行は1とマークする
・ext4:ブロックアロケーション中は新しいグループを追加できないようにする
・ext4:バディキャッシュの構築時にページを初期化するようにした
・ext4:nodelalloc、かつブロックアロケーションが失敗したときに、s_dirty_blocks_counterが正しくなかった問題を修正
・ext4:htreeのハッシュアルゴリズムがcharがsignedであると仮定していたのを修正
・jbd2:XENがIOが完了するまでバリアの非サポートを正しく通知してくれないので、コミット時のバリアサポート有無のテストをやめた
・ext4:マウント時のスーパーブロックのチェックをより厳格にした
・ext4:i_size_high を通常ファイルの時のみ使うようにした
・ext4:make_indexed_dirにチェックを追加した
・ext4:FSリサイズ時にグループディスクリプタを正しく初期化するようにした
・ext4:8K以上のブロックサイズにおいてカーネルがパニックしてしまう問題を修正
・mqueue:si_pidが正しくない値になることがある問題を修正
ほか、40パッチ
- 2.6.28.8(3月16日):Greg K-H
・x86、vmi:VMIもnativeと同じようにTSCの逆行に対するチェックを入れた
・ext4:ABBAデッドロックになり得るlockの依存関係を修正した
・ext4:preallocationのlist_headを適切に初期化するようにした
・ext4:delayed allocation使用時にデッドロックになり得る問題を修正
・ext4:EXT4_IOC_MIGRATE ioctl(ext3からext4へのマイグレーション処理)の処理中にエラーが発生した場合、NULL参照をしてしまっていた
・timerfd:引数チェックが甘かったのを修正
・ext4:wait on all pending commits in ext4_sync_fs()パッチを取り消
・jbd2:jbd2_journal_begin_ordered_truncate()関数の処理中にNULL参照する可能性がある問題を修正
・ext4:ext4_write_begin()とext4_da_write_begin()でデッドロックする可能性がある問題を修正
・CONFIG_TASK_XACCTが有効のときに固定小数点エラーでクラッシュしてしまうことがある問題を修正
・proc:/proc/kpageflagsがPG_lockedフラグを誤って常に0と出力していた問題を修正
・inotify:デッドロックを修正
・mm:特殊なメモリホールを持つマシンにおいて起動に失敗する問題を修正
・intel-agp:GTTエントリ不足によりパニックする問題を修正
・fs:inodeのi_stateが壊れてしまう問題を修正
・pipeのfasync処理のエラーハンドリングにミスがありクラッシュする可能性がある問題を修正
・x86-64:存在しないシステムコールを呼び出したときに正しく-ENOSYSを返していなかった問題を修正
・ext4:64kブロックサイズの時に空のディレクトリのreadが正しく処理されない問題を修正
・proc:/proc/kpageflagsのフラグコピー処理において、すべての処理においてsrcとdstを逆に渡していたため、正しく処理されていなかった問題を修正
ほか、114パッチ
- 2.6.28.9(3月23日):Greg K-H
・eventfd:IRQコンテキストからfput()呼び出していた問題を修正
・drm/i915:コーナーケースをいくつか修正
・カーネルコンパイルオプションに'-fwrapv'を追加
ほか、45パッチ
2/2 |
|
|
||||
|
連載 Linux Kernel Watch |
Linux Squareフォーラム Linuxカーネル関連記事 |
連載:Linux Kernel Watch(連載中) Linuxカーネル開発の現場ではさまざまな提案や議論が交わされています。その中からいくつかのトピックをピックアップしてお伝えします |
|
連載:Linuxファイルシステム技術解説 ファイルシステムにはそれぞれ特性がある。本連載では、基礎技術から各ファイルシステムの特徴、パフォーマンスを検証する |
|
特集:全貌を現したLinuxカーネル2.6[第1章] エンタープライズ向けに刷新されたカーネル・コア ついに全貌が明らかになったカーネル2.6。6月に正式リリースされる予定の次期安定版カーネルの改良点や新機能を詳しく解説する |
|
特集:/procによるLinuxチューニング[前編] /procで理解するOSの状態 Linuxの状態確認や挙動の変更で重要なのが/procファイルシステムである。/procの概念や/procを利用したOSの状態確認方法を解説する |
|
特集:仮想OS「User
Mode Linux」活用法 Linux上で仮想的なLinuxを動かすUMLの仕組みからインストール/管理方法やIPv6などに対応させるカーネル構築までを徹底解説 |
|
Linuxのカーネルメンテナは柔軟なシステム カーネルメンテナが語るコミュニティとIA-64 Linux IA-64 LinuxのカーネルメンテナであるBjorn Helgaas氏。同氏にLinuxカーネルの開発体制などについて伺った |
|
|
- 【 pidof 】コマンド――コマンド名からプロセスIDを探す (2017/7/27)
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、コマンド名からプロセスIDを探す「pidof」コマンドです。 - Linuxの「ジョブコントロール」をマスターしよう (2017/7/21)
今回は、コマンドライン環境でのジョブコントロールを試してみましょう。X環境を持たないサーバ管理やリモート接続時に役立つ操作です - 【 pidstat 】コマンド――プロセスのリソース使用量を表示する (2017/7/21)
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、プロセスごとのCPUの使用率やI/Oデバイスの使用状況を表示する「pidstat」コマンドです。 - 【 iostat 】コマンド――I/Oデバイスの使用状況を表示する (2017/7/20)
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、I/Oデバイスの使用状況を表示する「iostat」コマンドです。
|
|