第24回:Linux/Oracle Database構築時のTransparentHugePage(THP)設定

技術者向け・データベースの技術情報発信

昨今、Oracle Databaseはクラウド上で構成される事例が大勢を占めていますが、基幹システムについては、クラウド上の制約・性能から、オンプレミスが選択されるケースもあるかと思います。
今回は、Linux/Oracle Databaseをオンプレミスとして構成する場合のTransparentHugePage(透過的なHugePages)設定の注意点について、詳しくご紹介します。

1. LinuxOSのメモリ制御

Oracle DatabaseをLinuxOS上に構成する場合、LinuxOSのメモリ制御がどのようになっているのか理解しておくことが重要です。ここでは、Oracle Database構成時に必要となる、OSのHugePages/TransparentHugePageTunedサービスの関係についてご説明します。

HugePages

LinuxOSのメモリ・ページサイズのデフォルトは通常4KBですが、昨今、Oracle DatabaseのSGA要件(メモリ要件)は大きく、デフォルトのページサイズではOSが管理するメモリページ数が多くなり過ぎてCPUコストが大きくなる傾向にあり、HugePagesの利用がインストール・マニュアル上でも推奨されています。Oracle CloudのOCI/ExaCSやAWSのRDSでもHugePagesがデフォルトで構成されるようになっていることから、スタンダードな設定と言えます。

TransparentHugePage

TransparentHugePageとはHugePagesの利用を想定していないアプリケーションでも、透過的にHugePagesを利用させることが出来るようになる機能です。自動的にHugePagesが活用されるようになり、全体的な性能向上を目的に実装されています。
一見、有効な機能に見受けられますが、Oracle Database + HugePagesの組み合わせ時は、HugePagesが利用できなくなるケースもあり、インストール・マニュアル上では無効化するよう明記されています。

Tunedサービス

TunedサービスはLinuxOS上のサービスで、OSで管理しているCPU、ディスク等の省電力化に関わる制御を行っている機能となりますが、その中に上記「TransparentHugePage」の有効化/無効化の制御が含まれることに注意が必要です。

2. TransparentHugePageの無効化

Oracle Databaseのインストール・ガイドには「TransparentHugePageの無効化」について明記されていますが、OS設定となることから詳しくは記載されていません。
ここでは設定に必要な手順について解説していきます。(下記手順は全てrootユーザにて実行が必要)

THP無効化の確認方法

# cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]

※[never] がTransparentHugePage(THP)の無効化状態を示します。

THP無効化の設定手順

以下、3つ(①②③)の無効化手順がありますが、可能であれば全て設定することが望ましいと考えられます(②の設定のみではHugePagesのメモリ不足が発生した場合、THPの無効化が解除されてしまう事象が確認されています)。

<注意>カーネル起動パラメータを修正する手順が含まれることから、事前にシステムバックアップの取得をご検討ください。
また、本手順はLinux7の標準的なOS構成での設定例となります。その他バージョンやブート構成をカスタマイズされている場合は、その環境に合わせた設定が必要となります。

①カーネル起動パラメータを変更する

・ /etc/default/grub ファイルの GRUB_CMDLINE_LINUX 行に、「transparent_hugepage=never」を追加

GRUB_CMDLINE_LINUX="rd.lvm.lv=rhel/... transparent_hugepage=never"
                                    ---------------------------------------------★追加

・ grub2-mkconfig コマンドを実行して grub.cfg ファイルを再作成し、カーネルブートオプションを有効化

# grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg

・ OSを再起動

# shutdown -r now

・ カーネル起動パラメータを確認

# cat /proc/cmdline

・ 「transparent_hugepage=never」が設定されていることを確認

②Tunedサービスのプロファイルを変更する

・ 現在設定されているプロファイルを確認(デフォルトはthroughput-performance)

# tuned-adm active
Current active profile: throughput-performance
                          ---------------------------------------★確認

・ 上書きするプロファイルを作成

# cd /etc/tuned/
# mkdir /etc/tuned/oracle-profile
# cd oracle-profile/
# vi tuned.conf

以下を記載(throughput-performance の部分は★で確認した内容にする)

-------------------------------------------------
[main]
include= throughput-performance

[vm]
transparent_hugepages=never
-------------------------------------------------

・ 作成したプロファイルを反映

# tuned-adm profile oracle-profile

・ THPが無効化[never]になったことを確認

# cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]

③Tunedサービスを停止/無効化する

# systemctl stop tuned
# systemctl disable tuned

3. 設定有無の効果

TransparentHugePageの無効化設定:なし

dbexpt24_1.png

TransparentHugePageの無効化設定:あり

dbexpt24_2.png

※TransparentHugePageの設定以外の違いはなく、業務負荷的にはほぼ同等。
(「無効化設定:あり」は上記「THP無効化の設定手順」①+②を設定し確認)

Oracle Database インストール・ガイド(引用)

透過的なHugePagesを使用すると、実行中にメモリー割当ての遅延が生じます。パフォーマンスの問題を回避するために、透過的なHugePagesはすべてのOracle Databaseサーバーで無効にすることをお薦めします。かわりに標準のHugePagesを使用すると、パフォーマンスが向上します。

設定効果

TransparentHugePageの無効化設定で業務システムの直接的なパフォーマンス向上は確認できなかったものの、CPU負荷低減の効果は明確に確認されました。
※TransparentHugePageが有効な状態であっても、DBのスローダウン/ハング等の問題は確認されませんでした。

4. 備考

Linux7のデフォルト設定

手順①:未設定
手順②:未設定(throughput-performanceが有効)
手順③:未設定(Tunedサービスが有効)

Oracle Exadata Cloud Service のデフォルト設定(2020年8月時点)

手順①:設定済
手順②:未設定(Tunedサービスが未構成)
手順③:未設定(Tunedサービスが未構成)

5. おわりに

TransparentHugePageの設定については、無効化が設定されていなくてもデータベースの利用上問題とならない場合もあることから、見過ごされるケースも多いのではないかと思います。オンプレミスでOracle DatabaseをLinuxOSで動作させている場合は、是非確認してみて下さい。