CPU
▌計算機のプログラム実⾏処理の中⼼となるユニット
▌ALUによる単純な算術演算だけではない
n MMUによるページング
n 各種キャッシュ(TLB, L1, L2, …)
n KVMの使う仮想化⽀援機能
Slide 4
Slide 4 text
計算資源としてみたCPUのイメージ
▌CPU使⽤率
n 「サーバのCPU使⽤率が⾼い」
▌CPU時間
n 「プロセスAによるCPU時間の消費が激しい」
Slide 5
Slide 5 text
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
Slide 6
Slide 6 text
マルチコア環境でのタスクの並列実⾏
▌複数コアを搭載したCPUの上でのタスクの並列実⾏
n 仮想的な時分割マルチタスキングと違い物理的に並列実⾏
▌同時刻に実⾏可能なタスクが複数存在する場合に活⽤
n 無関係なプロセスでも同⼀アプリ内のスレッドでも良い
Slide 7
Slide 7 text
スレッド数のチューニングについて
▌CPUを回せる状態のタスクの数をコア数に対して適切に
n I/Oの完了待ち(%iowait)のタスクはCPUを他に譲る
n 負荷のピーク時のコンテキスト切り替えのオーバーヘッドを考慮
n ワーキングセットが⼩さければロードアベレージが⾼くても問題ない場合あり
n アプリのスレッドプールのスレッドを使い切っている状態での応答性を考慮
Slide 8
Slide 8 text
仮想マシンのスケジューリング
▌KVMの仮想マシンはVCPUスレッドをスケジューリング
n 仮想CPUの数だけホスト上でVCPUスレッドが起動
n VCPUスレッドがスケジュールされるとCPUがゲスト実⾏⽤のモードに
n Intelの場合は VMX non-root モード
n ゲストモードの間はゲストカーネルを含むゲスト命令を実⾏
n ゲストカーネルはゲスト内のタスクをスケジュールして実⾏
Slide 9
Slide 9 text
コンテナのスケジューリング
▌ホストカーネルの管理するプロセスグループとしてスケジューリング
n 実態はcgroupで管理されたプロセスグループ
n グループとしてcgroupのコントローラで制御可能
n 例︓コンテナAにコンテナBの倍くらいCPUを使わせる
n ホスト上の top などでもCPU使⽤率を確認可能
n PID などは namespace により内外で⾒え⽅が違う
Slide 10
Slide 10 text
CPUのオーバーコミットについて
▌仮想マシンもコンテナもオーバーコミットは可能
n 全仮想マシンのVCPUスレッド数の総和 > CPUのコア数
n 全コンテナのプロセス数の総和 > CPUのコア数
▌同時に全ての環境が⾼負荷にならないように注意
n コンテナの場合は通常のロードアベレージ⾼騰と同じ
n VCPUはアイドル度合いによる
Slide 11
Slide 11 text
メモリ
▌主記憶装置、RAM
▌CPUの処理で命令やデータが置かれる
n プログラムをロードしたり処理するデータを保持したり
▌記憶階層の中でCPUキャッシュと⼆次記憶(ディスク)の間
n 遅いか速いかは相対的なもの
CPUキャッシュのヒット率を⾼める性能最適化(メモリにアクセスさせたら負け)もあるし、
オンメモリでの処理を増やす最適化(ディスクにアクセスさせたら負け)もある。
Slide 12
Slide 12 text
CPUキャッシュ
[07/02 23:30]takuya_yoshikawa@devboot-3:~$ lscpu
…
CPU(s): 40
On-line CPU(s) list: 0-39
Thread(s) per core: 2
Core(s) per socket: 10
Socket(s): 2
NUMA node(s): 2
Vendor ID: GenuineIntel
CPU family: 6
Model: 63
Model name: Intel(R) Xeon(R) CPU E5-2660 v3 @ 2.60GHz
Stepping: 2
CPU MHz: 1313.710
CPU max MHz: 3300.0000
CPU min MHz: 1200.0000
BogoMIPS: 5201.50
Virtualization: VT-x
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 25600K
…
Slide 13
Slide 13 text
ヒュージページ(ラージページ)の活⽤話
▌仮想アドレスから物理アドレスへの変換もメモリを消費する
n ページテーブルは他のデータと同様にメモリに保存されている
n TLB というアドレス変換専⽤のキャッシュもある
n ページテーブル⽤のページも読み込むとデータキャッシュに
n ページの単位を4KBから2MBや1GBにすると消費量が減る
Slide 14
Slide 14 text
Linuxサーバのメモリ⽤途
▌Anonymous メモリ(無名メモリ)
n プログラムのヒープやスタックなど
n ファイルシステム上のデータと紐づかない(代わりにスワップ)
▌ページキャッシュ
n ファイルを読んだ際にメモリ上にキャッシュする場所
使⽤するプログラミング⾔語によるメモリ使⽤特性に注意
▌Javaアプリのメモリ使⽤量はサーバ管理者には⾒積もりやすい
n JVMのヒープという形でまとめて確保されるので
n ただしJVMのGCの特性について把握する必要あり
▌動的メモリ確保に依存したアプリをサーバで使⽤する際は注意
n サーバ管理者は重要度の⾼くないアプリ起因でのOOMに注意
n サーバ⽤のアプリ開発者は他のプロセスに迷惑をかけないように
Slide 17
Slide 17 text
DBMSのメモリ管理
▌Oracle, MySQL, PostgreSQL などのメモリ管理は独特
n カーネルのメモリ管理に⼲渉されたがらない
n しかし半分利⽤したりもする(PostgreSQL のダブルバッファリング)
▌Forest の MySQL は InnoDB のバッファプールに強く依存
n データ読み込みがほぼ完全にバッファにヒットするように設計
Slide 18
Slide 18 text
cgroup
▌control group
▌プロセスをグループ化して管理する Linux の機能
n プロセスを階層的にグループ化
n ユーザ空間からはファイルシステムのインタフェースを利⽤して管理
n グループに各種コントローラを適⽤可能
n サービスやコンテナの全体で使⽤可能なリソースの制御など
Slide 19
Slide 19 text
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