原因を調べてみると、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を明示的に要求するアプリだけに適用できる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
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
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
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]
再起動後も無効化を維持する(永続化)
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
「再起動しても設定が消えた」という場面は、/sys配下への直接書き込みだけで済ませてしまい、サービスへの登録を忘れたケースがよくあります。変更を永続化するには必ずsystemctl enableまで実行してください。
2. カーネルパラメータで無効化する方法(RHEL 9系)
GRUBのカーネルパラメータでも設定できます。# GRUBの設定ファイルを開く vi /etc/default/grub
# 変更後の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の要否を判断しておくと、後からのトラブルを防げます。体系的な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モードでもパフォーマンスへの影響はワークロードによって異なります。変更後はクエリ応答時間や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 |
無効化後は、vmstatのsy値やアプリケーションのレイテンシを改めて観察することをお勧めします。THPが原因だった場合、変更後すぐに安定する場合がほとんどです。設定変更だけで解決しない場合は、メモリ全体の使用量や他のカーネルパラメータも合わせて見直してください。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、
THPの設定をはじめとするLinuxカーネルパラメータのチューニングや、データベースサーバーの安定運用に必要な設計の考え方を、2日間のハンズオンで体系的に学べます。Linux Master Pro Seminarでは少人数制で、実際にサーバーを構築しながら学べます。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます