概要
- Ubuntu Server 22.04 LTS の記事になります。ミドルウェア の要件として、OS の THP 無効化が記載されているケースがあります。(例: Oracle Database や Splunk など)
- 今回、Ubuntu 22.04 にて、THPの無効化を行いました。手順を記載します。
THP とは
- 先ず、THP とはTransparent Huge Page (透過的Huge Pages) のことです。UNIX OS に詳しい方は、Large Pages の方が馴染みがあるかもしれませんね!
- OS のメモリ管理には、仮想メモリと呼ばれる仕組みが使われています。この仮想メモリは仮想アドレスと物理アドレスの変換を行うわけですが、この変換にはページテーブルと呼ばれる表が使用されます。デフォルトのページサイズは 4KB です。OSでHuge Pages を有効化した場合、デフォルトのサイズより大きいページが使用可能となります。大規模な物理メモリを搭載したサーバでは、このHuge Pages を利用することでメモリの管理が効率化され、パフォーマンスが上がるといったメリットがあります。
- THP (透過的Huge Pages)は、カーネルによって自動的に Huge Page がプロセスに割り当てられるため、Huge Page を手動で予約する必要がありません。
- THP の説明は、こちらのlogmi_tech を参照ください。詳しく紹介されています。
THP が有効かを確認する
- 以下のコマンドを実行して、THP が有効かを確認します。
- [ ] 括弧で括られている値が現在の設定値です。
$ cat /sys/kernel/mm/transparent_hugepage/enabled always [madvise] never
THP の設定
- THP を有効にするには、次のコマンドを実行します。
echo always > /sys/kernel/mm/transparent_hugepage/enabled
- THP をシステム全体では無効にして必要以上のメモリリソースの割り当てを防ぎ、madvise()のシステムコール(MADV_HUGEPAGE (Linux 2.6.38 以降))で指定された個々のプロセスにのみHuge Page を割り当てる場合は、次のコマンドを実行します。
echo madvise > /sys/kernel/mm/transparent_hugepage/enabled
- THP を無効にするには、次のコマンドを実行します。
echo never > /sys/kernel/mm/transparent_hugepage/enabled
ミドルウェアの要件にあるTHP 無効化のランスクリプトを配置
- 最後に、Ubuntu Server 22.04 LTS の環境に、ミドルウェアの要件に記載されたTHP 無効化のランスクリプトを作成、配置します。
- THP 無効化のスクリプトは、下記です。
#!/bin/sh if test -f /sys/kernel/mm/redhat_transparent_hugepage/enabled; then echo never > /sys/kernel/mm/redhat_transparent_hugepage/enabled fi if test -f /sys/kernel/mm/redhat_transparent_hugepage/defrag; then echo never > /sys/kernel/mm/redhat_transparent_hugepage/defrag fi if test -f /sys/kernel/mm/transparent_hugepage/enabled; then echo never > /sys/kernel/mm/transparent_hugepage/enabled fi if test -f /sys/kernel/mm/transparent_hugepage/defrag; then echo never > /sys/kernel/mm/transparent_hugepage/defrag fi exit 0
- /etc/rc.d/rc.local にスクリプトを作成し、実行権を付与します。
- /etc/rc.local にシンボリックリンクを作成します。OS再起動後、THP 無効化に変わったことを確認します。
$ cat /sys/kernel/mm/transparent_hugepage/enabled always [madvise] never $ ls -l /etc/rc.d/rc.local ls: cannot access '/etc/rc.d/rc.local': No such file or directory $ sudo mkdir /etc/rc.d $ sudo vi /etc/rc.d/rc.local $ cat /etc/rc.d/rc.local $ ls -l /etc/rc.d/rc.local -rw-r--r-- 1 root root 508 Oct 6 00:06 /etc/rc.d/rc.local $ sudo chmod +x /etc/rc.d/rc.local $ ls -l /etc/rc.d/rc.local -rwxr-xr-x 1 root root 508 Oct 6 00:06 /etc/rc.d/rc.local $ sudo ln -s /etc/rc.d/rc.local /etc/rc.local $ ls -l /etc/rc.local lrwxrwxrwx 1 root root 18 Oct 6 00:08 /etc/rc.local -> /etc/rc.d/rc.local ** インスタンス再起動 ** $ cat /sys/kernel/mm/transparent_hugepage/enabled always madvise [never] $