LinuxのTransparent Huge Pagesを無効化する方法|MySQLやRedisのレイテンシスパイクを解消するTHP設定の実践

運営:リナックスマスター.JP(代表 宮崎智広)
HOME > Linux技術 リナックスマスター.JP(Linuxマスター.JP) > Linuxtips > LinuxのTransparent Huge Pagesを無効化する方法|MySQLやRedisのレイテンシスパイクを解消するTHP設定の実践
「MySQLのレスポンスが突然遅くなった」「Redisのレイテンシが数十ミリ秒単位でスパイクする」
原因を調べてみると、dmesgにエラーはなく、ディスクI/Oも問題ない。なのにパフォーマンスが安定しない。

こうした問題の原因として見落とされがちなのが、Transparent Huge Pages(THP)です。

LinuxカーネルはデフォルトでTHPを有効にしており、メモリのページサイズを自動的に2MBに拡大しようとします。この仕組みはメモリ管理のオーバーヘッドを下げるために設計されていますが、MySQLやRedisのように小さなメモリブロックを頻繁に割り当てるアプリケーションでは、逆にレイテンシのスパイクやCPU使用率の急増を引き起こすことがあります。

この記事では、RHEL 9系/Ubuntu 24.04 LTSを想定環境として、THPが問題を引き起こす仕組みを整理したうえで、THPを無効化する手順と再起動後も設定を維持する永続化方法を解説します。

この記事のポイント

・/sys/kernel/mm/transparent_hugepage/enabledの値で現在のTHP設定を確認できる
・echo neverを書き込むとTHPが即時無効になる(再起動で元に戻る)
・systemdサービスを作成すると再起動後も確実に無効を維持できる
・madvise設定にするとTHPを明示的に要求するアプリだけに適用できる


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Transparent Huge Pages(THP)とは何か

Linuxのメモリ管理は、通常4KBのページを単位として行います。THPはこの4KBのページを、条件が揃った場合に自動的に2MBの大きなページ(Huge Page)にまとめて管理する仕組みです。

大きなページを使うと、ページテーブルのエントリ数が減り、TLBミス(CPU内部のアドレス変換キャッシュのミス)が減少します。大量の連続したメモリを扱う科学計算やバッチ処理では効果的です。

一方、MySQLやRedisのようにメモリを細かく頻繁に割り当て・解放するアプリケーションでは、逆効果になることがあります。

具体的な問題は2点あります。

・khugepageによるCPU使用率の急増: Linuxは「khugepaged」というカーネルスレッドを通じて、4KBページを2MBページにまとめる作業を継続的に行います。この処理中にアプリケーションが一時的にブロックされ、レイテンシのスパイクが発生します
・ページ分割のコスト: 大きなページを確保した後に細かく解放すると、2MBページを再び4KBに分割する処理が発生します。この分割コストがデータベースの書き込みレイテンシに影響します

MySQL、Redis、MongoDBをはじめ主要なデータベースはいずれもTHPを無効化することを推奨しています。

THPが問題の原因かどうかを確認する

1. 現在のTHP設定を確認する

まず現在の設定値を確認します。

# THP(Transparent Huge Pages)の現在設定を確認する cat /sys/kernel/mm/transparent_hugepage/enabled

出力例(環境により異なります):

[always] madvise never

括弧で囲まれているのが現在の設定です。

・[always]:THPが常に有効(デフォルト値のディストリビューションが多い)
・[madvise]:アプリケーションが明示的に要求した場合のみ有効
・[never]:無効

defrag(ページ結合の積極度)も合わせて確認します。

# THPのデフラグ設定を確認する cat /sys/kernel/mm/transparent_hugepage/defrag

出力例(環境により異なります):

always defer defer+madvise [madvise] never

defragが「always」になっていると、khugepageによるページ結合処理が積極的に行われ、アプリケーションへの影響が大きくなります。

2. khugepageの活動をvmstatで確認する

# vmstatで1秒間隔でシステム状態を表示する vmstat 1 10

出力例(環境により異なります):

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 0 512000 12800 1024000 0 0 0 2 120 220 2 5 93 0 0 2 0 0 491000 12800 1024000 0 0 0 0 980 2100 5 20 75 0 0

「sy(システムCPU使用率)」の値が突然跳ね上がる瞬間があれば、khugepageが大きなページを構築中の可能性があります。sy列が平常時は2~3%程度なのに、突発的に15~20%に上昇するパターンはTHPの影響を疑う根拠になります。

THP(Transparent Huge Pages)を無効化する手順

1. 即時無効化(再起動で元に戻る)

次のコマンドを実行すると、THP設定がすぐに変更されます。

# THPを無効化する(rootで実行) echo never > /sys/kernel/mm/transparent_hugepage/enabled echo never > /sys/kernel/mm/transparent_hugepage/defrag

設定が変わったことを確認します。

# 設定が反映されたことを確認する cat /sys/kernel/mm/transparent_hugepage/enabled cat /sys/kernel/mm/transparent_hugepage/defrag

出力例(環境により異なります):

always madvise [never] always defer defer+madvise madvise [never]

「[never]」になっていれば無効化できています。この変更はサーバーを再起動すると元の状態に戻ります。

再起動後も無効化を維持する(永続化)

1. systemdサービスを作成する方法

systemdサービスとして登録するのが、設定の意図が明確で管理しやすい方法です。

# サービスユニットファイルを作成する cat > /etc/systemd/system/disable-thp.service << 'EOF' [Unit] Description=Disable Transparent Huge Pages (THP) After=sysinit.target local-fs.target Before=mongod.service mysqld.service redis.service [Service] Type=oneshot ExecStart=/bin/bash -c 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' ExecStart=/bin/bash -c 'echo never > /sys/kernel/mm/transparent_hugepage/defrag' RemainAfterExit=yes [Install] WantedBy=multi-user.target EOF

# サービスを有効化して起動する systemctl daemon-reload systemctl enable --now disable-thp

# サービスの状態を確認する systemctl status disable-thp

出力例(環境により異なります):

* disable-thp.service - Disable Transparent Huge Pages (THP) Loaded: loaded (/etc/systemd/system/disable-thp.service; enabled; preset: disabled) Active: active (exited) since Mon 2026-11-10 18:00:01 JST; 1s ago

「active (exited)」と表示されれば正常に設定されています。

「再起動しても設定が消えた」という場面は、/sys配下への直接書き込みだけで済ませてしまい、サービスへの登録を忘れたケースがよくあります。変更を永続化するには必ずsystemctl enableまで実行してください。

2. カーネルパラメータで無効化する方法(RHEL 9系)

GRUBのカーネルパラメータでも設定できます。

# GRUBの設定ファイルを開く vi /etc/default/grub

GRUB_CMDLINE_LINUXの末尾に「transparent_hugepage=never」を追記します。

# 変更後のGRUB_CMDLINE_LINUXの例 GRUB_CMDLINE_LINUX="crashkernel=1G-4G:192M rd.lvm.lv=rhel/root rhgb quiet transparent_hugepage=never"

# GRUB設定ファイルを再生成する(RHEL 9系) grub2-mkconfig -o /boot/grub2/grub.cfg

再起動後にTHPが無効の状態で起動します。

サーバー公開前のカーネルパラメータ設定はサーバー設計の一部です。設計段階からTHPの要否を判断しておくと、後からのトラブルを防げます。体系的なLinuxサーバー設計の学び方はこちら。

アプリケーションごとにTHPを制御する(madvise設定)

THPを完全に無効化するのではなく、madvise設定にすることで「明示的にTHPを要求したアプリのみ有効」という折衷案を取ることができます。

# defragをmadviseモードに変更する echo madvise > /sys/kernel/mm/transparent_hugepage/enabled echo defer+madvise > /sys/kernel/mm/transparent_hugepage/defrag

madviseモードでは、アプリケーションがmadvise(MADV_HUGEPAGE)システムコールを呼び出した場合のみTHPが有効になります。最近のJVM(Java仮想マシン)やPostgreSQLはこの呼び出しに対応しているため、THPの恩恵を受けつつ問題を回避できる可能性があります。

ただし、madviseモードでもパフォーマンスへの影響はワークロードによって異なります。変更後はクエリ応答時間やvmstatのsy値を観察して判断してください。

Redisの公式ドキュメントはmadviseを含めてTHPを有効にしないことを推奨しているため、Redisを使っている環境ではneverを選択してください。

本記事のまとめ

やりたいこと コマンド・設定箇所
現在のTHP設定を確認する cat /sys/kernel/mm/transparent_hugepage/enabled
THPのdefrag設定を確認する cat /sys/kernel/mm/transparent_hugepage/defrag
THPを即時無効化する(一時的) echo never > /sys/kernel/mm/transparent_hugepage/enabled
THP無効化を再起動後も維持する systemdサービス(disable-thp.service)を作成してenable
GRUBカーネルパラメータで無効化する(RHEL 9系) grub2-mkconfig → transparent_hugepage=never
アプリが要求した場合のみTHPを有効にする echo madvise > /sys/kernel/mm/transparent_hugepage/enabled
THPはデフォルトで有効になっているため、データベースサーバーを構築した後に気づかずに放置されるケースが少なくありません。MySQLやRedisのパフォーマンスが不安定な場合は、まず/sys/kernel/mm/transparent_hugepage/enabledを確認してください。

無効化後は、vmstatのsy値やアプリケーションのレイテンシを改めて観察することをお勧めします。THPが原因だった場合、変更後すぐに安定する場合がほとんどです。設定変更だけで解決しない場合は、メモリ全体の使用量や他のカーネルパラメータも合わせて見直してください。

現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、

THPの設定をはじめとするLinuxカーネルパラメータのチューニングや、データベースサーバーの安定運用に必要な設計の考え方を、2日間のハンズオンで体系的に学べます。Linux Master Pro Seminarでは少人数制で、実際にサーバーを構築しながら学べます。

>> Linux Master Pro Seminarの詳細・申込はこちら

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録

運営

リナックスマスター.JP(代表 宮崎智広)

株式会社イーネットマーキュリーが運営するLinux教育サイトです。代表の宮崎智広は現役のLinuxサーバー管理者として20年以上の実務経験を持ち、累計3,100名以上のエンジニアを指導してきました。実践型のLinuxセミナーや無料マニュアルの配布を通じてLinux人材の育成に取り組んでいます。