【memo】CentSO7 チューニング機能

#チューニングについて
代表的な項目
・CPUの動作周波数や省電力モードの設定
・メモリの有効利用
・ディスクIOの性能向上
・ネットワークの送受信に関する調整
など

これらは通常カーネルパラメータの値を調整することで行われるが、膨大なカーネルパラメータの値をすべて理解するのは非現実的であり、代表的なパラメータに関してチューニングを行うtunedコマンドが用意されている

#tuned
tunedはOSを稼働したままチューニングが可能なため、パラメータを動的に変化させることで単一のシステムを時間帯ごとに異なる用途で利用する場合にも有用

```Ruby:/etc/tuned/tuned-main.conf
# Global tuned configuration file.

# Whether to use daemon. Without daemon it just applies tuning. It is
# not recommended, because many functions don't work without daemon,
# e.g. there will be no D-Bus, no rollback of settings, no hotplug,
# no dynamic tuning, ...
daemon = 1

# Dynamicaly tune devices, if disabled only static tuning will be used.
dynamic_tuning = 0 ←動的チューニングOFF

# How long to sleep before checking for events (in seconds)
# higher number means lower overhead but longer response time.
sleep_interval = 1

# Update interval for dynamic tunings (in seconds).
# It must be multiply of the sleep_interval.
update_interval = 10

# Recommend functionality, if disabled "recommend" command will be not
# available in CLI, daemon will not parse recommend.conf but will return
# one hardcoded profile (by default "balanced").
recommend_command = 1

# Whether to reapply sysctl from the e.g /etc/sysctl.conf, /etc/sysctl.d, ...
# If enabled these sysctls will be re-appliead after Tuned sysctls are
# applied, i.e. Tuned sysctls will not override system sysctls.
reapply_sysctl = 1

# Default priority assigned to instances
default_instance_priority = 0

# Udev buffer size
udev_buffer_size = 1MB
```
プロファイルを確認すると、9個あり現在適用されているプロファイルが「virtual-guest」ということが分かる

```
[root@localhost tuned]# tuned-adm list
Available profiles:
- balanced                    - General non-specialized tuned profile
- desktop                     - Optimize for the desktop use-case
- latency-performance         - Optimize for deterministic performance at the cost of increased power consumption
- network-latency             - Optimize for deterministic performance at the cost of increased power consumption, focused on low latency network performance
- network-throughput          - Optimize for streaming network throughput, generally only necessary on older CPUs or 40G+ networks
- powersave                   - Optimize for low power consumption
- throughput-performance      - Broadly applicable tuning that provides excellent performance across a variety of common server workloads
- virtual-guest               - Optimize for running inside a virtual guest
- virtual-host                - Optimize for running KVM guests
Current active profile: virtual-guest
```
これらのプロファイルは「/usr/lib/tuned」ディレクトリ配下にある

・適用するプロファイルを変更
`tuned-adm profile balanced`
・ロードしたプロファイルのログ
`/var/log/tuned/tuned.log`

#memory
・ページサイズ

```ruby:/etc/sysctl.conf
vm.nr_hugepages=8192
```

・キャッシュ
Linuxのメモリに関わるキャッシュには、ページキャッシュとスラブキャッシュがある
ページキャッシュ : ストレージシステム上に保持しているデータをメモリ上にページ単位でロードする機構で、ファイルの読み込みの高速化を担っている
スラブキャッシュ : Linuxカーネルの内部的なメモリ資源ごとのキャッシュで、Linuxシステム全体のメモリの利用効率を高める役目を担っている

性能試験の際には、事前に両方をクリアするのが一般的であり、以下のようにする

```
[root@localhost /]# vi /etc/sysctl.conf
vm.drop_caches=1
[root@localhost /]#
[root@localhost /]# sysctl -p
vm.drop_caches = 1
[root@localhost /]#
[root@localhost /]# cat /proc/sys/vm/drop_caches
1
```
ページキャッシュのクリアは「1」を、スラブキャッシュのクリアは「2」を、両方のクリアは「3」をセットする

・スワップ頻度
スワップの頻度は、0~100までの間で設定が可能であり、値が小さくなるほどスワップを消極的に行う
Hadoopクラスタやスパコンなどでは性能向上の観点から、0とするのが推奨される

```
[root@localhost /]# vi /etc/sysctl.conf
vm.swappiness=0
[root@localhost /]#
[root@localhost /]# sysctl -p
vm.swappiness = 0
```

#ディスクI/O
・I/Oエレベータ
ストレージデバイスに対してIO操作を送信する際にはいくつかのアルゴリズムがあり、このアルゴリズムをIOエレベータと呼ぶ
CentOS7では以下3つが利用可能
Noop : FIFOのスケジューリングアルゴリズムを持ち、スケジューラに到着したIOをFIFOでストレージデバイスに流す。CPUコストが低いスケジューラとされている。低遅延のSSDや高速半導体ディスクなどで利用される
Deadline : CentOS7におけるデフォルトのIOスケジューラであり、デバイス当り2つのキューを持ち、1つは読み込みキューであり、もう1つは書き込みキューである。一般に、遅延を回避したい場合に使われる。デフォルトでは書き込みよりも読み込みが優先される。複数のプロセスが稼働するアプリケーションやエンタープライズ向けのストレージで利用される。
CDQ : プロセスが3つの状態(リアルタイム、ベストエフォート、アイドル)にクラス分けされる。デフォルトではベストエフォートになる。ルートファイルシステムがマウントされるような比較的低速のSATAディスクなどに利用される。

IOエレベータの設定は、ブートパラメータとして指定が可能
`elevator=[deadline|cfq|noop]`
・現在の設定確認

```
[root@localhost /]# cat /sys/block/sda/queue/scheduler
noop [deadline] cfq
```
・SSDの性能劣化問題
SSDの性能を引き出すために、IOスケジューリングを適切に設定しなければならない場合がある
IOスケジューラにCFQを設定し、数百秒間の間に1回から数回程度の割合でIO性能の低下が発生するといったことが見られる場合は、対処方法としてnoopに変更することにより改善される場合がある

#tuna
・CPUアフィニティ設定確認
`tuna -Q`
・CPUコアの所属ソケット確認
`numactl --hardware`
・CPUコアの割り当て変更
`tuna -S 1 -q 'eth*' -x`
-S : ソケット番号
-q : IRQリスト
-x : コア割り当て

`tuna -c 1 -t rsyslogd -m` or
`tuna -c 0-2 -t rsyslogd -m`
-c : コア番号
-t : スレッド
-m : CPUコアの移動を明示
・確認

```
[root@localhost /]# tuna -t rsyslogd -P
                      thread       ctxt_switches
    pid SCHED_ rtpri affinity voluntary nonvoluntary             cmd
  1331   OTHER     0        1        33            0        rsyslogd
```
・tunaのGUI起動
`tuna -g`

※参考
CentOS7 実践ガイド