CFSによるマルチタスキング ▌CFS (Completely Fair Scheduler) n Linuxのタスクスケジューラ ▌各タスクを公平に仮想的に分割されたCPUの上で実⾏ n 周期的に細かく実⾏タスクを切り替え(応答性にも配慮) n コンテキスト切り替えのオーバーヘッドあり(キャッシュも含め) CFS basically models an "ideal, precise multi-tasking CPU" on real hardware. https://www.kernel.org/doc/Documentation/scheduler/sched-design-CFS.txt
スレッド数のチューニングについて ▌CPUを回せる状態のタスクの数をコア数に対して適切に n I/Oの完了待ち(%iowait)のタスクはCPUを他に譲る n 負荷のピーク時のコンテキスト切り替えのオーバーヘッドを考慮 n ワーキングセットが⼩さければロードアベレージが⾼くても問題ない場合あり n アプリのスレッドプールのスレッドを使い切っている状態での応答性を考慮
仮想マシンのスケジューリング ▌KVMの仮想マシンはVCPUスレッドをスケジューリング n 仮想CPUの数だけホスト上でVCPUスレッドが起動 n VCPUスレッドがスケジュールされるとCPUがゲスト実⾏⽤のモードに n Intelの場合は VMX non-root モード n ゲストモードの間はゲストカーネルを含むゲスト命令を実⾏ n ゲストカーネルはゲスト内のタスクをスケジュールして実⾏
コンテナのスケジューリング ▌ホストカーネルの管理するプロセスグループとしてスケジューリング n 実態はcgroupで管理されたプロセスグループ n グループとしてcgroupのコントローラで制御可能 n 例︓コンテナAにコンテナBの倍くらいCPUを使わせる n ホスト上の top などでもCPU使⽤率を確認可能 n PID などは namespace により内外で⾒え⽅が違う
CPUのオーバーコミットについて ▌仮想マシンもコンテナもオーバーコミットは可能 n 全仮想マシンのVCPUスレッド数の総和 > CPUのコア数 n 全コンテナのプロセス数の総和 > CPUのコア数 ▌同時に全ての環境が⾼負荷にならないように注意 n コンテナの場合は通常のロードアベレージ⾼騰と同じ n VCPUはアイドル度合いによる
メモリ ▌主記憶装置、RAM ▌CPUの処理で命令やデータが置かれる n プログラムをロードしたり処理するデータを保持したり ▌記憶階層の中でCPUキャッシュと⼆次記憶(ディスク)の間 n 遅いか速いかは相対的なもの CPUキャッシュのヒット率を⾼める性能最適化(メモリにアクセスさせたら負け)もあるし、 オンメモリでの処理を増やす最適化(ディスクにアクセスさせたら負け)もある。
ヒュージページ(ラージページ)の活⽤話 ▌仮想アドレスから物理アドレスへの変換もメモリを消費する n ページテーブルは他のデータと同様にメモリに保存されている n TLB というアドレス変換専⽤のキャッシュもある n ページテーブル⽤のページも読み込むとデータキャッシュに n ページの単位を4KBから2MBや1GBにすると消費量が減る
使⽤するプログラミング⾔語によるメモリ使⽤特性に注意 ▌Javaアプリのメモリ使⽤量はサーバ管理者には⾒積もりやすい n JVMのヒープという形でまとめて確保されるので n ただしJVMのGCの特性について把握する必要あり ▌動的メモリ確保に依存したアプリをサーバで使⽤する際は注意 n サーバ管理者は重要度の⾼くないアプリ起因でのOOMに注意 n サーバ⽤のアプリ開発者は他のプロセスに迷惑をかけないように
DBMSのメモリ管理 ▌Oracle, MySQL, PostgreSQL などのメモリ管理は独特 n カーネルのメモリ管理に⼲渉されたがらない n しかし半分利⽤したりもする(PostgreSQL のダブルバッファリング) ▌Forest の MySQL は InnoDB のバッファプールに強く依存 n データ読み込みがほぼ完全にバッファにヒットするように設計
cgroup ▌control group ▌プロセスをグループ化して管理する Linux の機能 n プロセスを階層的にグループ化 n ユーザ空間からはファイルシステムのインタフェースを利⽤して管理 n グループに各種コントローラを適⽤可能 n サービスやコンテナの全体で使⽤可能なリソースの制御など
CPU のリソース制御 ▌CFS のクォータベースでの制御 n プロセスグループが⼀定周期内で使⽤可能なCPU時間を制限 n CFS の時分割をグループ単位に拡張して制御している感じ ▌cpuset による使⽤可能なコアの制御 n cpuset は NUMA のリソース制御に使えるもの n CPU に関してはプロセスグループが使⽤可能なコアを静的指定可能 参考︓CFS Bandwidth Control と cpuset https://www.kernel.org/doc/Documentation/scheduler/sched-bwc.txt https://www.kernel.org/doc/Documentation/cgroup-v1/cpusets.txt