0. 概要

HPCワークロードの高並列実行に於けるスケーラビリティは、いわゆるOSジッターの影響を受けるため、不要なOS常駐サービスを停止することで、これを改善できる場合があります。
ただこの場合、停止しようとするサービスは、以下の観点で事前に精査する必要があります。

  • 使用するリソースがどの程度か
  • 提供する機能が不要か

これらの調査を経て停止するサービスを特定したら、対象のサービスを停止し、HPCワークロードを実行します。

本テクニカルTipsは、HPCワークロード向けベアメタルシェイプ BM.Optimized3.36Oracle Linux 8ベースの HPCクラスタネットワーキングイメージ (※1)を使用するインスタンスを クラスタ・ネットワーク と共にデプロイするHPCクラスタを想定し、この計算ノードとしてのインスタンス上で不要サービスを停止することで、高並列時のスケーラビリティ向上を目的とするOSレベルのパフォーマンスチューニングを適用する方法を解説します。

※1)OCI HPCテクニカルTips集クラスタネットワーキングイメージの選び方1. クラスタネットワーキングイメージ一覧 のイメージ No.1 です。

以降の章は、本チューニングの趣旨に沿って以下の順に解説します。

  1. 調査用HPCクラスタ構築
  2. 不要サービス特定
  3. 不要サービス停止
  4. 不要サービス停止による効果確認
  5. プロダクション用HPCクラスタ構築

不要サービスの特定は、Linuxのプロセスアカウンティングを利用し、インスタンスデプロイ直後のワークロードを実行していない状態でCPUを使用しているプロセスを特定、このプロセスが提供する機能を考慮して不要サービスかどうかを判断、不要と判断したサービスを停止します。
また不要サービスを停止した後、再度プロセスアカウンティング情報を取得し、その効果を確認します。

自身の利用するHPCクラスタが本テクニカルTipsの想定と同じシェイプ・OSの場合は、本テクニカルTipsと同じサービスを停止するだけでチューニングを適用することが出来るため、1章、2章、及び4章は参照にとどめて3章と5章の手順を適用します。

これらが想定と異なる場合は、1章の手順から順次チューニングを進めます。
この場合は、対象となる不要サービスが本テクニカルTipsと異なる可能性があるため、自身で特定した不要サービスに合わせた停止方法を適用します。


1. 調査用HPCクラスタ構築

本章は、 BM.Optimized3.36Oracle Linux 8ベースの HPCクラスタネットワーキングイメージ (※1)でデプロイする2ノードの計算ノードを クラスタ・ネットワーク で接続する、不要サービスの特定とその効果確認に使用する調査用HPCクラスタを構築します。

※1)OCI HPCテクニカルTips集クラスタネットワーキングイメージの選び方1. クラスタネットワーキングイメージ一覧 のイメージ No.1 です。

この構築手順は、 OCI HPCチュートリアル集HPCクラスタを構築する(基礎インフラ手動構築編)HPCクラスタを構築する(基礎インフラ自動構築編) の手順に従い実施します。


2. 不要サービス特定

2-0. 概要

本章は、Linuxのプロセスアカウンティングを使用し、デプロイした計算ノード上で動作する不要サービスを特定します。

具体的には、以下の手順を実施します。

  • 計算ノードでpsacctを起動
  • アカウンティング情報取得
  • 不要サービス特定

また、通常プライベートサブネットに接続される計算ノードでは、ファイアーウォールやSELinuxを不要と判断出来る場合が多いため、本テクニカルTipsではこれらも不要サービスとして扱います。

本章の調査により、本テクニカルTipsでは以下を不要サービスと判断しています。

  • Performance Co-Pilot
  • 統合モニタリング・エージェント
  • dnf-makecache.timer
  • ksplice
  • firewalld

2-1. 不要サービス特定手順

本章は、2ノードの計算ノード上のうちの1ノードを使用し、不要サービスを特定します。

以下コマンドを計算ノードのopcユーザで実行し、psacctサービスを起動、プロセスアカウンティングのデータファイルが生成されることを確認します。

$ sudo systemctl start psacct
$ ls -l /var/account
-rw-r--r--. 1 root root 94144 Oct 25 17:17 /var/account/pacct

プロセスアカウンティングのデータファイルは、logrotateが同じディレクトリに日付をファイル名として日時でローテーションします。
このため、psacctサービスを起動した翌々日早朝まで放置し、起動翌日丸一日分のアカウンティング情報を含むファイル(以下の例ではpsacctサービス起動日を2023年10月25日としてpacct-20231027)が作成されているのを確認します。

$ ls -l /var/account/pacct*
-rw------- 1 root root  5896896 Oct 27 10:29 /var/account/pacct
-rw-r--r-- 1 root root  1069509 Oct 26 03:32 /var/account/pacct-20231026.gz
-rw------- 1 root root 20381632 Oct 27 03:33 /var/account/pacct-20231027
$ 

次に、以下コマンドを調査用HPCクラスタの計算ノードのopcユーザで実行し、CPU時間を消費している上位10プロセスを特定します。

$ sudo sa -ca /var/account/pacct-20231027 | head -11
   39493  100.00%  193325.80re  100.00%       4.99cp  100.00%         0avio      5410k
       1    0.00%       1.44re    0.00%       1.44cp   28.91%         0avio     56896k   pmlogcheck
      95    0.24%       1.44re    0.00%       1.44cp   28.85%         0avio      3368k   xz
      74    0.19%       2.29re    0.00%       0.90cp   18.03%         0avio     70350k   Timeout stdlib 
      16    0.04%       0.80re    0.00%       0.78cp   15.64%         0avio    123629k   dnf
      96    0.24%       0.19re    0.00%       0.17cp    3.49%         0avio     45776k   ksplice
    1140    2.89%  193276.00re   99.97%       0.13cp    2.64%         0avio         0k   kworker/dying*
      49    0.12%       4.52re    0.00%       0.07cp    1.40%         0avio     59392k   uptrack-upgrade
     151    0.38%       0.03re    0.00%       0.02cp    0.34%         0avio     11654k   ps
       3    0.01%       0.01re    0.00%       0.01cp    0.18%         0avio     43387k   pmdumplog
       8    0.02%       0.01re    0.00%       0.01cp    0.17%         0avio      1101k   sum
$

次に、対象期間中最もCPU時間を消費した(約29%)プロセスが pmlogcheck であり、このプロセスがパフォーマンス監視や記録のために使用する Performance Co-Pilot に関連するものであるため、不要サービスと判定します。

次に、対象期間中2番目にCPU時間を消費した(約29%)プロセスが xz であり、以下コマンドを調査用HPCクラスタの計算ノードのopcユーザで実行した結果、このプロセスの大部分がユーザ pcp で実行されており、これも Performance Co-Pilot に関連するものであることを特定します。

$ sudo lastcomm -f /var/account/pacct-20231027 --pid | grep ^xz
xz                     pcp      __         2.13 secs Sat Jul 27 03:25 101411 101410
xz                     pcp      __         0.00 secs Sat Jul 27 03:25 101215 101186
xz                     pcp      __         2.15 secs Sat Jul 27 02:55 100505 100504
xz                     pcp      __         0.00 secs Sat Jul 27 02:55 100309 100281
xz                     pcp      __         2.13 secs Sat Jul 27 02:25 99692 99691
xz                     pcp      __         0.00 secs Sat Jul 27 02:25 99496 99466
xz                     pcp      __         0.00 secs Sat Jul 27 01:55 98585 98557
xz                     pcp      __         2.12 secs Sat Jul 27 01:25 97973 97972
xz                     pcp      __         0.00 secs Sat Jul 27 01:25 97777 97749
xz                     pcp      __         2.11 secs Sat Jul 27 00:55 97058 97057
:
$

次に、対象期間中3番目にCPU時間を消費した(約18%)プロセスが Timeout stdlib であり、以下コマンドを調査用HPCクラスタの計算ノードのopcユーザで実行した結果、このプロセスの親プロセスIDが1(Systemd)で20分程度の間隔で実行されていることからSystemdタイマーから起動されていることを特定、

$ sudo lastcomm -f /var/account/pacct-20231027 --pid | grep "Timeout stdlib"
Timeout stdlib   S   X root     __         0.73 secs Sat Jul 27 03:42 101708 1
Timeout stdlib   S   X root     __         0.72 secs Sat Jul 27 03:24 100955 1
Timeout stdlib   S   X root     __         0.71 secs Sat Jul 27 03:07 100881 1
Timeout stdlib   S   X root     __         0.73 secs Sat Jul 27 02:49 100029 1
Timeout stdlib   S   X root     __         0.69 secs Sat Jul 27 02:24 99237 1
Timeout stdlib   S   X root     __         0.79 secs Sat Jul 27 01:59 99009 1
Timeout stdlib   S   X root     __         0.72 secs Sat Jul 27 01:35 98237 1
Timeout stdlib   S   X root     __         0.73 secs Sat Jul 27 01:12 97470 1
Timeout stdlib   S   X root     __         0.68 secs Sat Jul 27 00:50 96598 1
Timeout stdlib   S   X root     __         0.79 secs Sat Jul 27 00:27 96290 1
:
$

以下コマンドを調査用HPCクラスタの計算ノードのopcユーザで実行した結果と、このプロセスの実行間隔が15分以上の毎回異なる間隔で実行されていることから、このプロセスがアプリケーションからの カスタム・ログ を収集するエージェントである 統合モニタリング・エージェント から起動されていることを特定、不要サービスと判定します。
自身の環境に於ける 統合モニタリング・エージェント の要・不要は、OCI公式ドキュメントの ここ を参照してその判断を行ってください。

$ for sct in `sudo systemctl list-units --type=timer | grep timer | awk '{print $1}'`; do echo $sct; sudo systemctl cat $sct | grep ^OnUnit; echo; done
dnf-makecache.timer
OnUnitInactiveSec=1h

mlocate-updatedb.timer

pmie_check.timer

pmie_daily.timer

pmie_farm_check.timer

pmlogger_check.timer

pmlogger_daily.timer

pmlogger_farm_check.timer

sysstat-collect.timer

sysstat-summary.timer

systemd-tmpfiles-clean.timer
OnUnitActiveSec=1d

unbound-anchor.timer

unified-monitoring-agent_config_downloader.timer
OnUnitInactiveSec=15min

$

次に、対象期間中4番目にCPU時間を消費した(約16%)プロセスが dnf であり、以下コマンドを調査用HPCクラスタの計算ノードのopcユーザで実行した結果、このプロセスの親プロセスIDが1(Systemd)で20分程度の間隔で実行されていることからSystemdタイマーから起動されていることを特定、

$ sudo lastcomm -f /var/account/pacct-20231027 --command dnf --pid
dnf              S     root     __         3.72 secs Sat Jul 27 02:38 99968 1
dnf              S     root     __         0.21 secs Sat Jul 27 01:11 97465 1
dnf              S     root     __         0.22 secs Sat Jul 27 00:10 94549 1
dnf              S     root     __         2.41 secs Fri Jul 26 22:34 91642 1
dnf              S     root     __         0.21 secs Fri Jul 26 21:10 89149 1
dnf              S     root     __         0.21 secs Fri Jul 26 19:41 86503 1
dnf              S     root     __         2.34 secs Fri Jul 26 18:26 84496 1
dnf              S     root     __         0.21 secs Fri Jul 26 16:35 81333 1
dnf              S     root     __         0.20 secs Fri Jul 26 14:49 77964 1
dnf              S     root     __        24.32 secs Fri Jul 26 13:36 76176 1
:
$

以下コマンドを調査用HPCクラスタの計算ノードのopcユーザで実行した結果と、このプロセスの実行間隔が1時間以上の毎回異なる間隔で実行されていることから、このプロセスが有効なdnfレポジトリのパッケージメターデータを定期的に更新する dnf-makecache.timer から起動されていることを特定、OSアップデート等のパッケージ管理は定期的なメンテナンス時に適用する運用を想定し、不要サービスと判定します。
自身の環境に於けるdnf-makecacheの要・不要は、man dnfを参照してその判断を行ってください。

$ for sct in `sudo systemctl list-units --type=timer | grep timer | awk '{print $1}'`; do echo $sct; sudo systemctl cat $sct | grep ^OnUnit; echo; done
dnf-makecache.timer
OnUnitInactiveSec=1h

mlocate-updatedb.timer

pmie_check.timer

pmie_daily.timer

pmie_farm_check.timer

pmlogger_check.timer

pmlogger_daily.timer

pmlogger_farm_check.timer

sysstat-collect.timer

sysstat-summary.timer

systemd-tmpfiles-clean.timer
OnUnitActiveSec=1d

unbound-anchor.timer

unified-monitoring-agent_config_downloader.timer
OnUnitInactiveSec=15min

$

次に、対象期間中5番目にCPU時間を消費した(約3%)プロセスが ksplice であり、kspliceがOS稼働中にカーネル等のアップデートを適用するためのサービスで、OSアップデート等のパッケージ管理は定期的なメンテナンス時に適用する運用を想定し、不要サービスと判定します。
自身の環境に於けるkspliceの要・不要は、Oracle公式ドキュメントの ここ を参照してその判断を行ってください。


3. 不要サービス停止

3-0. 概要

本章は、先に不要と特定した以下サービスを停止します。

  • Performance Co-Pilot
  • 統合モニタリング・エージェント
  • dnf-makecache.timer
  • ksplice
  • firewalld

3-1. 不要サービス停止手順

本章は、先に特定した不要サービスを2ノードの計算ノードで停止します。

以下コマンドを計算ノードのopcユーザで実行し、 Performance Co-Pilot 関連パッケージを削除します。

$ sudo dnf remove -y pcp

次に、OCIコンソールにログインし、以下計算サーバの インスタンスの詳細 画面で Oracle Cloudエージェント タブをクリックし、 カスタム・ログのモニタリング プラグインを 無効 にし、 統合モニタリング・エージェント を停止します。

画面ショット

次に、以下コマンドを計算ノードのopcユーザで実行し、 dnf-makecache を停止します。

$ sudo systemctl disable --now dnf-makecache.timer

次に、以下コマンドを計算ノードのopcユーザで実行し、 ksplice 関連パッケージを削除します。

$ sudo dnf remove -y ksplice uptrack

次に、以下コマンドを計算ノードのopcユーザで実行し、ファイアーウォールを停止します。

$ sudo systemctl disable --now firewalld

次に、以下コマンドを計算ノードのopcユーザで実行し、OSを再起動します。

$ sudo shutdown -r now

OSが起動したら、ここまでに停止した不要サービスが起動していないことを確認します。


4. 不要サービス停止による効果確認

本章は、先に不要サービスを停止した状態で取得したプロセスアカウンティング情報を基に、以下の手順でその効果を確認します。

不要サービスを停止した翌々日早朝まで放置し、停止した翌日一日分のアカウンティング情報(以下の例ではpacct-20231029)が作成されているのを確認します。

    $ ls -l /var/account/pacct*
-rw------- 1 root root   34496 Oct 30 09:45 /var/account/pacct
-rw-r--r-- 1 root root 1069509 Oct 26 03:32 /var/account/pacct-20231026.gz
-rw------- 1 root root 2346813 Oct 27 03:33 /var/account/pacct-20231027.gz
-rw------- 1 root root 1581661 Oct 28 03:48 /var/account/pacct-20231028.gz
-rw------- 1 root root   16006 Oct 29 03:29 /var/account/pacct-20231029
$ 

以下コマンドを調査用HPCクラスタの計算ノードのopcユーザで実行し、CPU時間を消費している上位10プロセスを特定します。

$ sudo sa -ca /var/account/pacct-20231029 | head -11
    1865  100.00%   46226.87re  100.00%       0.03cp  100.00%         0avio     14329k
     698   37.43%   46203.15re   99.95%       0.02cp   69.05%         0avio         0k   kworker/dying*
      24    1.29%       0.01re    0.00%       0.01cp   23.21%         0avio    552581k   wlp-agent
       1    0.05%       0.00re    0.00%       0.00cp    2.98%         0avio      1221k   sar
       1    0.05%       0.00re    0.00%       0.00cp    2.38%         0avio      2396k   updatedb
       2    0.11%       0.34re    0.00%       0.00cp    1.19%         0avio     22368k   systemd
       1    0.05%       0.00re    0.00%       0.00cp    1.19%         0avio    638336k   Finalizer
     314   16.84%       0.00re    0.00%       0.00cp    0.00%         0avio     14641k   rpm
     165    8.85%       0.00re    0.00%       0.00cp    0.00%         0avio     19776k   systemd-cgroups
     145    7.77%       0.00re    0.00%       0.00cp    0.00%         0avio      2630k   sadc
      89    4.77%       0.00re    0.00%       0.00cp    0.00%         0avio     20560k   systemctl
$

不要サービスを停止する前の結果と比較し、停止したサービスによるCPU時間の消費が無いことを確認します。
本テクニカルTipsの環境では、今回のサービス停止で1日当たり約5秒(4.99秒 - 0.03秒)の不要サービスによるCPU消費を抑えられることが確認できました。


5. プロダクション用HPCクラスタ構築

本章は、不要サービスを停止した調査用HPCクラスタの計算ノードのうちの1ノードで カスタム・イメージ を取得し、これを元に必要なノード数の計算ノードを持つ、不要サービスが停止されているプロダクション用のHPCクラスタを構築します。

この手順は、 OCI HPCテクニカルTips集計算/GPUノードデプロイ時の効果的なOSカスタマイズ方法2. カスタム・イメージを使用したOSカスタマイズ の手順に従います。

更新日時: