Linux での透過的巨大ページの使用と無効化の概要

Linux での透過的巨大ページの使用と無効化の概要

導入

コンピューティングのニーズが拡大し続けるにつれて、アプリケーションのメモリに対する需要も増加しています。仮想メモリ管理メカニズムを実装するために、オペレーティング システムはメモリ上でページング管理を実装します。メモリの「ページング メカニズム」が提案されて以来、メモリ ページのデフォルト サイズは 4096 バイト (4 KB) に設定されています。メモリ ページ サイズは原則として構成可能ですが、ほとんどのオペレーティング システムの実装では、デフォルトの 4 KB ページが依然として使用されています。 「ページング機構」が提案された当時は、メモリサイズが数十メガバイトしかなかったため、4KB ページは妥当でした。しかし、物理メモリ容量が数 GB、さらには数十 GB にまで増大した現在でも、オペレーティングシステムは依然として 4KB をページの基本単位として使用しています。これはまだ妥当なのでしょうか?

Linux オペレーティング システムで大量のメモリを必要とするアプリケーションを実行する場合、使用されるデフォルトのページ サイズは 4 KB であるため、TLB ミスとページ フォールトがさらに発生し、アプリケーションのパフォーマンスに大きな影響を与えます。オペレーティング システムが 2MB 以上のページング ユニットを使用すると、TLB ミスとページ フォールトの数は大幅に減少し、アプリケーションのパフォーマンスが大幅に向上します。これは、Linux カーネルがラージ ページのサポートを導入した直接的な理由でもあります。利点は明らかです。アプリケーションが 2MB のメモリを必要とするとします。オペレーティング システムがページングの単位として 4KB を使用する場合、512 ページが必要となり、TLB に 512 エントリが必要になります。同時に、512 のページ テーブル エントリも必要になります。オペレーティング システムは、2MB のアプリケーション空間全体を物理メモリにマッピングするために、少なくとも 512 の TLB ミスと 512 のページ フォールトを経験する必要があります。ただし、オペレーティング システムがページングの基本単位として 2MB を使用する場合、2MB のアプリケーション空間の仮想から実へのマッピングを確立するために必要なのは 1 つの TLB ミスと 1 つのページ フォールトのみであり、操作中に TLB ミスとページ フォールトの割り込みは必要ありません (TLB エントリの置き換えとスワップが発生しないと仮定)。

最低コストで大規模ページのサポートを実現するために、Linux オペレーティング システムでは、hugetlbfs 特殊ファイル システムに基づく 2M バイトの大規模ページのサポートを使用します。特別なファイル システムの形式で大きなページをサポートするこの方法により、アプリケーションは 2 MB の大きなページの使用を強制されることなく、必要に応じて仮想メモリ ページ サイズを柔軟に選択できます。

Linux で Redis を起動すると、通常はWARNING you have Transparent Huge Pages (THP) support enabled in your kernel

透明な大きなページについては、公式の紹介を見てみましょう

RHEL 6 では、すべてのアプリケーションに対して Transparent Huge Pages (THP) がデフォルトで有効になっています。カーネルは可能な限り hugepages を割り当てようとし、mmap 領域が自然に 2MB に揃えば、Linux プロセスは 2MB ページを受け取ります。メイン カーネル アドレス空間自体は hugepages でマップされ、カーネル コードからの TLB 負荷が軽減されます。Hugepages の一般的な情報については、「Huge Pages とは何ですか。また、Huge Pages を使用する利点は何ですか。」を参照してください。

カーネルは常に、hugepages を使用してメモリ割り当てを満たそうとします。hugepages が利用できない場合 (たとえば、物理的に連続したメモリが利用できないため)、カーネルは通常の 4KB ページにフォールバックします。THP はスワップも可能です (hugetlbfs とは異なります)。これは、hugepage を小さな 4KB ページに分割し、通常どおりスワップ アウトすることで実現されます。

しかし、hugepages を効果的に使用するには、カーネルは要求を満たすのに十分な大きさで、適切に整列された物理的に連続したメモリ領域を見つける必要があります。このために、khugepaged カーネル スレッドが追加されました。このスレッドは、現在使用されている小さなページを hugepage 割り当てに置き換えることを時々試み、THP の使用を最大化します。

ユーザーランドでは、アプリケーションを変更する必要はありません (したがって透過的です)。ただし、その使用を最適化する方法はあります。hugepages を使用するアプリケーションの場合、posix_memalign() を使用すると、大規模な割り当てが huge page (2MB) 境界に揃えられるようになります。

また、THP は匿名メモリ領域に対してのみ有効です。tmpfs とページ キャッシュのサポートを追加する予定です。THP の調整可能パラメータは、/sys/kernel/mm/redhat_transparent_hugepage の下の /sys ツリーにあります。

透過的な巨大ページが有効になっているかどうかを確認する

1: コマンド cat /sys/kernel/mm/redhat_transparent_hugepage/enabled このコマンドはRed Hat Enterprise Linuxシステムに適用可能です

[root@getlnx06 ~]# /etc/issue の詳細
 
Red Hat Enterprise Linux Server リリース 6.6 (サンティアゴ)
 
カーネル \r と \m
 
[root@getlnx06 ~]# cat /sys/kernel/mm/redhat_transparent_hugepage/enabled
 
[常に]決して勧めない

2: コマンド cat /sys/kernel/mm/transparent_hugepage/enabled このコマンドは他のLinuxシステムにも適用できます

[root@getlnx06 ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
 
いつもアドバイスする[決して]
 
[root@getlnx06 ~]#

コマンドを使用して表示すると、出力結果が [always] の場合、透過的巨大ページが有効になっていることを意味します。 [never]は透過的な巨大ページが無効であることを意味し、[madvise]は

3: HugePages_Total が 0 を返す場合、透過的な巨大ページが無効になっていることを意味します。

[root@getlnx06 ~]# grep -i HugePages_Total /proc/meminfo 
 
巨大なページの合計: 0

4: cat /proc/sys/vm/nr_hugepages は 0 を返します。これも透過的な巨大ページが無効になっていることを意味します。

[root@getlnx06 ~]# cat /proc/sys/vm/nr_hugepages 

0

透過的な巨大ページ機能を無効または有効にする

方法 1: システムの起動時に無効になるように /etc/grub.conf ファイルを設定します。

[root@getlnx06 ~]# vi /etc/grub.conf
# anaconda によって生成された grub.conf
#
# このファイルを変更した後、grubを再実行する必要はありません。
# 注意: /boot パーティションがあります。これは、
# すべてのカーネルお​​よび initrd パスは /boot/ からの相対パスです。例:
# ルート (hd0,0)
# カーネル /vmlinuz-version ro ルート=/dev/mapper/VolGroup--LogVol0-LogVol01
# initrd /initrd-[generic-]バージョン.img
#boot=/dev/sda
デフォルト=0
タイムアウト=5
スプラッシュイメージ=(hd0,0)/grub/splash.xpm.gz
隠しメニュー
タイトル Red Hat Enterprise Linux 6 (2.6.32-504.el6.x86_64)
    ルート (hd0,0)
    カーネル /vmlinuz-2.6.32-504.el6.x86_64 ro ルート=/dev/mapper/VolGroup--LogVol0-LogVol01 rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=VolGroup-LogVol0/LogVol01 rd_LVM_LV=VolGroup-LogVol0/LogVol00 KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
    initrd /initramfs-2.6.32-504.el6.x86_64.img
透明な巨大ページ=決して

方法2: /etc/rc.localファイルを設定する

[root@getlnx06 ~]# vi /etc/rc.local
#!/bin/sh
#
# このスクリプトは、他のすべての init スクリプトの *後に* 実行されます。
# ここに独自の初期化用コードを入れることもできます
# 完全な Sys V スタイルの init 処理を実行したい。
/var/lock/subsys/local をタッチする
テスト -f /sys/kernel/mm/redhat_transparent_hugepage/enabled; の場合
  エコーなし > /sys/kernel/mm/redhat_transparent_hugepage/enabled
フィ

上記の設定を使用した後、設定を有効にするにはオペレーティング システムを再起動する必要があります。オペレーティング システムを再起動せずに次のコマンドを実行することもできます。

[root@getlnx06 ~]# echo never > /sys/kernel/mm/redhat_transparent_hugepage/enabled
[root@getlnx06 ~]# cat /sys/kernel/mm/redhat_transparent_hugepage/enabled
いつもアドバイスする[決して]
[root@getlnx06 ~]#

ヒント:

1: RedHat 6、OEL 6、SLES 11、UEK2 カーネル以降では、Transparent HugePages がデフォルトで有効になっています。これは、メモリ管理のパフォーマンスを向上させるために使用されます。Transparent HugePages は、以前のバージョンの huge Page に似ています。主な違いは、Transparent HugePages はリアルタイムで構成でき、構成を有効にするために再起動する必要がないことです。

2: Transparent Huge Pages は 32 ビット RHEL 6 ではサポートされていません。

3: ORACLE は、RedHat 6、OEL 6、SLES 11、UEK2 カーネルを使用する場合に Transparent HugePages を有効にすることを公式には推奨していません。これは、Transparent HugePages にいくつかの問題があるためです。

  • RAC環境における透過的なHugePagesは、異常なノードの再起動やパフォーマンスの問題を引き起こす可能性がある。
  • スタンドアロン環境では、Transparent HugePages によって異常なパフォーマンスの問題が発生する可能性もあります。

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。これについてもっと知りたい場合は、次のリンクをご覧ください。

以下もご興味があるかもしれません:
  • Linux の透過的巨大ページの詳細な紹介
  • Linux の透過的巨大ページ機構の紹介

<<:  Centos7でmysql5.7.19のデータ保存場所を移動する方法

>>:  DPlayer.js ビデオ再生プラグインの使い方

推薦する

Mysql の読み取り/書き込み分離期限切れに対する一般的な解決策

MySQLの読み書き分離の落とし穴読み取りと書き込みの分離の主な目的は、メイン データベースの負荷を...

HTML 画像 img タグ_Powernode Java アカデミー

まとめプロジェクトの説明形式<img src="..."> H2+ ...

Dockerfile における VOLUME と docker -v の違い

Dockerfile でのボリュームのマウントと docker -v コマンドによるマウントには明ら...

HTML でさまざまなスペースの特徴と表現を探る (推奨)

I. 概要HTML テンプレートを作成するときに、テキスト レイアウトの手段としてスペースが使用さ...

MySQL8.0.18 複数マスターと 1 スレーブの構成

目次1. 現実的な背景2. 合意3. マスターを構成する3.1. 起動パラメータの設定3.2. パラ...

時点別のMySQLデータベース復旧実績

はじめに: 時間ポイントによる MySQL データベースの復旧どの企業にとっても、データは最も価値の...

Linux システムでの nginx サーバーのインストールと負荷分散構成の詳細な説明

nginx (エンジン x) は、高性能な HTTP およびリバース プロキシ サーバー、メール プ...

Vue.jsは画像切り替え機能を実装する

この記事では、画像切り替え機能を実装するためのVue.jsの具体的なコードを参考までに共有します。具...

SSDストレージを有効にしたMySQLインスタンスの詳細な説明

SSDストレージを有効にしたMySQLインスタンスの詳細な説明特に OS と MySQL が同じディ...

JSはフロントエンドのページング効果を実現します

この記事の例では、フロントエンドのページング効果を実現するためのJSの具体的なコードを参考までに共有...

Centos システムの指定された場所に Nginx をインストールする方法

Centos システムの指定された場所に Nginx をインストールするにはどうすればいいですか?は...

HTML 要素に注釈を付けるときにクラスと ID のどちらが優れているかを分析する

Web ページには、非常に複雑な HTML 構造があります。CSS を使用して関連するスタイルを定義...

内部 IP アクセスのみを許可する Nginx プロキシ設定を追加する方法

位置 / { インデックス index.jsp; proxy_next_upstream http...

MYSQLクエリデータの結果に自動的に番号を付ける方法

序文実際、クエリ中に結果に番号が付けられるこのような状況に遭遇したことは一度もありません。同僚が転職...

Vue.js で AntV X6 を使用する手順の例

目次0x0 はじめに0x1 インストール0x2 ノードサイドバー0x3 統合例0x0 はじめにプロジ...