RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのITエンジニアによる技術ブログです。

OSバージョンアップによる性能劣化と格闘した話

f:id:tech-rakus:20200716192402p:plain

こんにちは、エンジニアのid:eichisandenです。

CentOS6からCentOS7にバージョンアップした時に謎の性能劣化に苦しめられたことがありました。
今更CentOS7という感じもありますが、恐らくCentOS8にも通じる話なのと、
CentOS6のサポートが2020/11/30に切れるのでバージョンアップする方もいると思い記事にしてみました。

同じ条件で性能を比較してみる

まず、ほぼ同じスペックの物理サーバを2台用意して、同じアプリ、同じデータ、同じ処理を流して性能比較を行いました。

特定の処理が顕著に性能劣化した

あるバッチ処理はCentOS6では148秒で終わっていたのにCentOS7では168秒もかかる結果になりました。
ちょっと取得タイミングがずれちゃってますがvmstatをグラフ化して見てみます。

  • CentOS7 f:id:eichisanden:20200710124640p:plain

  • CentOS6 f:id:eichisanden:20200710124714p:plain

やけにCPUのsys(Linuxカーネルが使っているCPU使用率)の赤が目立つのと若干コンテキストスイッチが多いことが目についたのでCPU周りを疑うことにしました。

そもそもOS単体の性能はどうなのか

OS単体の性能はどうなのかということでUnixBenchを取得しました。
結果をみると、Dhrystone 2 using register variablesという整数演算以外はCentOS6の圧勝という結果に。
測定したアプリに違いはないため環境自体の問題と疑っていましたので予想通りの結果になりました。

と言うことで、続けてOSの設定にミスがないかを見ていきます。

ターボ・ブーストが有効になっているかの確認

ターボ・ブーストというのは負荷がかかっているコアに対して定格の動作周波数よりも高い周波数で動かすインテルのCPUの仕組みです。
検証に使用したのはターボ・ブーストに対応したXeonですが、これが無効になっていないのでは?と疑ってみました。

ターボ・ブーストは有効だった

cpupowerコマンド見ると、boost state supportActive: yesになっているので有効になっているようです。

# cpupower frequency-info
analyzing CPU 0:
  driver: intel_pstate
  CPUs which run at the same hardware frequency: 0
  CPUs which need to have their frequency coordinated by software: 0
  maximum transition latency:  Cannot determine or is not supported.
  hardware limits: 800 MHz - 3.50 GHz
  available cpufreq governors: performance powersave
  current policy: frequency should be within 800 MHz and 3.50 GHz.
                  The governor "powersave" may decide which speed to use
                  within this range.
  current CPU frequency: 1.20 GHz (asserted by call to hardware)
  boost state support:
    Supported: yes
    Active: yes

同時に、このCPUの周波数は3GHzですが、800MHzから3.5GHzの範囲で動くこと、
このコマンドを叩いた瞬間は1.2GHzの周波数で動いていたことがコマンドの結果から分かります。

低い周波数で動作しているのはCPUガバナーがpowersaveになっていることが原因なようです。
powersaveは最低周波数に固定して動作するという記事もあったのですが、
UnixBench中の負荷が掛かった状態で見てみると負荷が掛かれば最大周波数で動作するようでした。

# cpupower frequency-info
analyzing CPU 0:
  driver: intel_pstate
  CPUs which run at the same hardware frequency: 0
  CPUs which need to have their frequency coordinated by software: 0
  maximum transition latency:  Cannot determine or is not supported.
  hardware limits: 800 MHz - 3.50 GHz
  available cpufreq governors: performance powersave
  current policy: frequency should be within 800 MHz and 3.50 GHz.
                  The governor "powersave" may decide which speed to use
                  within this range.
  current CPU frequency: 3.50 GHz (asserted by call to hardware)
  boost state support:
    Supported: yes
    Active: yes

検証に使用したサーバーのCPUはperformancepowersaveしかサポートしていませんが、powersaveondemandを選んだ時のように必要に応じて周波数を上げるような動きをすることが分かりました。

CPUガバナーをperformanceに変更してみる

負荷が掛かれば周波数が最大まで上がるので意味がなさそうと思いつつperformanceに変更してみます

# cpupower frequency-set --governor performance
Setting cpu: 0
Setting cpu: 1
Setting cpu: 2
Setting cpu: 3

再度性能測定したところ、168秒掛かっていたのが、159秒にまで一気に早くなりました!!
powersaveでも最終的にはブーストが効くのでここまで差が出るとは思っておらず意外な結果でした。
ただ、まだ思った性能が出ていないので検証を続けます。

tunedの設定を変更する

CPUガバナーだけを設定してもよいのですが、CentOS7から導入されたtunedという各種パラメータを便利に設定できる仕組があるのでそれを使用して設定します。
検証に使用したサーバーはbalancedがデフォルトで設定されていたので、 throughput-performanceに変更しました。

# デフォルトの設定
# tuned-adm recommend
balanced

# 現在の設定を確認
# tuned-adm active
Current active profile: balanced

# throughput-performanceに変更
# tuned-adm profile throughput-performance

CPUガバナーがperformanceになる以外にもいくつかのパラメータがパフォーマンス寄りの設定になりますが、どんな設定になるかは設定ファイルで確認できます。

# cat /lib/tuned/throughput-performance/tuned.conf |grep -e "^[^#]"
[main]
summary=Broadly applicable tuning that provides excellent performance across a variety of common server workloads
[cpu]
governor=performance
energy_perf_bias=performance
min_perf_pct=100
[disk]
readahead=>4096
[sysctl]
kernel.sched_min_granularity_ns = 10000000
kernel.sched_wakeup_granularity_ns = 15000000
vm.dirty_ratio = 40
vm.dirty_background_ratio = 10
vm.swappiness=10

CPUの脆弱性パッチの存在に気づく

まだCentOS6の性能に及ばないので色々調べていると、2018年はじめに問題になったSpectreとMeltdown対策のパッチで性能劣化するという記事を見つけました。

https://www.infoq.com/jp/news/2018/02/intel-spectre-performance/

この観点で見ていくとCentOS6の検証に使ったサーバのカーネルはアップデートされておらず、
対してCentOS7は脆弱性パッチがしっかり当たっているので、
それが速度の違いの要因だといういうことが見えてきました。

試しに脆弱性パッチを無効にしてみる

本番環境の脆弱性のパッチを無効にするつもりはありませんが、
Meltdownのパッチを無効にすることが設定ファイルの書き換えだけで出来たので試しにやってみました。

# cat /sys/kernel/debug/x86/pti_enabled
1
# cat /sys/kernel/debug/x86/retp_enabled
1
# cat /sys/kernel/debug/x86/ibrs_enabled
0
# echo 0 > /sys/kernel/debug/x86/pti_enabled
# echo 0 > /sys/kernel/debug/x86/retp_enabled

無効にしてベンチマークを取ると僅かですが性能向上していました。
CentOS7の方は他にいくつもCPU関連の脆弱性パッチが当たっており、
全てのパッチを無効にしての検証が出来ないため想像になりますが、性能劣化の原因はこのあたりという結論に自分の中では落ち着きました。
ここから先はチューニングで補う方向に方針を切り替え、調査としては一旦完了としました。

さいごに

大きな構成変更をした時には前後の性能比較をすることが非常に大事だと改めて感じました。
性能測定する環境の条件は極力揃えるというのも教訓になりました。
原因が分かれば対策のしようがあるので、しつこく調べた甲斐がありました。
以上になります。最後まで読んでいただきありがとうございました。

Copyright © RAKUS Co., Ltd. All rights reserved.