こんにちは、エンジニアのid:eichisandenです。
CentOS6からCentOS7にバージョンアップした時に謎の性能劣化に苦しめられたことがありました。
今更CentOS7という感じもありますが、恐らくCentOS8にも通じる話なのと、
CentOS6のサポートが2020/11/30に切れるのでバージョンアップする方もいると思い記事にしてみました。
- 同じ条件で性能を比較してみる
- 特定の処理が顕著に性能劣化した
- そもそもOS単体の性能はどうなのか
- ターボ・ブーストが有効になっているかの確認
- ターボ・ブーストは有効だった
- CPUガバナーをperformanceに変更してみる
- tunedの設定を変更する
- CPUの脆弱性パッチの存在に気づく
- 試しに脆弱性パッチを無効にしてみる
- さいごに
同じ条件で性能を比較してみる
まず、ほぼ同じスペックの物理サーバを2台用意して、同じアプリ、同じデータ、同じ処理を流して性能比較を行いました。
特定の処理が顕著に性能劣化した
あるバッチ処理はCentOS6では148秒で終わっていたのにCentOS7では168秒もかかる結果になりました。
ちょっと取得タイミングがずれちゃってますがvmstatをグラフ化して見てみます。
CentOS7
CentOS6
やけにCPUのsys(Linuxカーネルが使っているCPU使用率)の赤が目立つのと若干コンテキストスイッチが多いことが目についたのでCPU周りを疑うことにしました。
そもそもOS単体の性能はどうなのか
OS単体の性能はどうなのかということでUnixBenchを取得しました。
結果をみると、Dhrystone 2 using register variables
という整数演算以外はCentOS6の圧勝という結果に。
測定したアプリに違いはないため環境自体の問題と疑っていましたので予想通りの結果になりました。
と言うことで、続けてOSの設定にミスがないかを見ていきます。
ターボ・ブーストが有効になっているかの確認
ターボ・ブーストというのは負荷がかかっているコアに対して定格の動作周波数よりも高い周波数で動かすインテルのCPUの仕組みです。
検証に使用したのはターボ・ブーストに対応したXeonですが、これが無効になっていないのでは?と疑ってみました。
ターボ・ブーストは有効だった
cpupowerコマンド見ると、boost state support
がActive: 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はperformance
とpowersave
しかサポートしていませんが、powersave
はondemand
を選んだ時のように必要に応じて周波数を上げるような動きをすることが分かりました。
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対策のパッチで性能劣化するという記事を見つけました。
IntelがSpectreとMeltdown修正による0〜21パーセントのパフォーマンス低下を公表
この観点で見ていくと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関連の脆弱性パッチが当たっており、
全てのパッチを無効にしての検証が出来ないため想像になりますが、性能劣化の原因はこのあたりという結論に自分の中では落ち着きました。
ここから先はチューニングで補う方向に方針を切り替え、調査としては一旦完了としました。
さいごに
大きな構成変更をした時には前後の性能比較をすることが非常に大事だと改めて感じました。
性能測定する環境の条件は極力揃えるというのも教訓になりました。
原因が分かれば対策のしようがあるので、しつこく調べた甲斐がありました。
以上になります。最後まで読んでいただきありがとうございました。
エンジニア中途採用サイト
ラクスでは、エンジニア・デザイナーの中途採用を積極的に行っております!
ご興味ありましたら是非ご確認をお願いします。
https://career-recruit.rakus.co.jp/career_engineer/カジュアル面談お申込みフォーム
どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。
以下フォームよりお申込みください。
forms.gleイベント情報
会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! rakus.connpass.com