tom__bo’s Blog

MySQL!! MySQL!! @tom__bo

Systems Performance 読んでいく (6章 その5)

Systems Performance: Enterprise and Cloudを読んでいく。

前回の続き。
6章7節以降、6章最後まで。

6.7 Experimentation

この節ではCPUパフォーマンスをテストするツールを紹介する。 バックグラウンドとして6.5.11 Micro-Benchmarkingを見るように。

6.7.1 AdHoc

$ while :; do :; done &

これは瑣末なもので何も計測しないが、1スレッドでCPU-boundな負荷を作れるので、これを計測ツールがどのように示すかを見るには便利である。

6.7.2 SysBench

SysBenchは1CPUのベンチを取るのに適している。
例えば以下のようにする。

f:id:tom__bo:20161211200131p:plain

これは8スレッドで実行した例で、これらを実際のシステムと比較するのに有効である。 詳しくは12章 Benchmarking.

6.8 Tuning

CPUにとっては最大のパフォーマンスへの貢献は不要な負荷をなくすことである。 この方法論や手法については6.5, 6.6節で述べた

6.8.1 Compiler Option

コンパイラのオプションは、アプリケーションの特性に大きな影響を与えるので、適切に設定する。

6.8.2 Scheduling Priority and Class

nice(1)コマンドによって優先度を適切に設定する。こ値は小さいほど優先度が高くなる。 範囲は-20~+19である。
Linuxではchtr(1)コマンドでスケジューリング優先度を直接設定したり確認したり出来る。 カーネル3.2.6のFedora16のデフォルトの設定の一部を表6.9に示す。

f:id:tom__bo:20161211200213p:plain

6.8.4 Process Binding

CPUキャッシュを有効に使うためにプロセスをCPUにbindすることも出来る。 Linuxではtaskset(1)コマンドで行う。

f:id:tom__bo:20161211200227p:plain

ここではPID10790をCPU7~10にbindしている。

6.8.5 Exclusiv CPU Sets

Linuxの提供する"cpusets"ではCPUをグループ化し、プロセスをこれに割り当てることが出来る。 これはCPU bindingと似たようにパフォーマンスを改善する一方で、排他的な"cpusets"の方がより効果的なこともある。
以下は"exclusiveset"を作成する例である。

f:id:tom__bo:20161211200236p:plain

6.8.6 Resource Controls

最近のOSではCPUの利用により良いリソースコントロールの方法が提供されている。
Linuxではcontainer groups(cgroups)がある。これはプロセスやプロセス群に対するResourcesの使用量を制御する方法である。
例えばCFSスケジューラはインターバルにおけるCPUサイクルを調整するために一定の上限(CPU band width)を設けることが出来る。

6.8.7 Processor Options(BIOS Tuning)

プロセッサはプロセッサレベルと言う性質をBIOSから設定できるようにしている。 大抵は最大のパフォーマンスを出せるように設定されているか、CPUベンチマークが一定のクロックレートで実行されるようにIntel Turbo Boostを着るように設定することもある。