[Linux] Huge Page の概要

Linux システムは、hugetlbfs の特別なファイル システムを使用して、2MB および 1GB のヒュージ ページ メモリのサポートを追加します。設定するには、まず CPU がそれをサポートしているかどうかを確認します。

# cat  /proc/cpuinfo |grep --color pse
# cat  /proc/cpuinfo |grep --color pdpe1gb

カーネルが以下をサポートしているかどうかを確認します。

# grep  -i hugetlb /boot/config-4.18.0-193.el8.x86_64 
CONFIG_ARCH_WANT_GENERAL_HUGETLB=y
CONFIG_CGROUP_HUGETLB=y

# 以下两种都为y则标识支持
CONFIG_HUGETLBFS=y 
CONFIG_HUGETLB_PAGE=y

CPU 機能リストには、2MB メモリのヒュージ ページをサポートする pse フラグと、1GB メモリのヒュージ ページをサポートする pdpe1gb が含まれています。
巨大なページのメモリ使用量を表示する

# grep Huge /proc/meminfo
AnonHugePages:   4089856 kB
ShmemHugePages:        0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:               0 kB

ここには次のように書かれています。

ページ サイズは次のとおりです: Hugepagesize: 2048 kB

メモリ内の巨大ページの数は次のとおりです: HugePages_Total: 0

NUMA アーキテクチャのビュー:

[root@localhost ~]# cat /sys/devices/system/node/node*/meminfo|fgrep Huge
Node 0 AnonHugePages:    153600 kB
Node 0 HugePages_Total:     0
Node 0 HugePages_Free:      0
Node 0 HugePages_Surp:      0
Node 1 AnonHugePages:     30720 kB
Node 1 HugePages_Total:     0
Node 1 HugePages_Free:      0
Node 1 HugePages_Surp:      0

この NUMA マシンにはラージ ページ メモリが割り当てられていないことがわかります。

HugePages_Total: 0

2MB のラージ ページ メモリを割り当てるのが比較的簡単な場合は、次のコマンドで置き換えることができます。

echo 1024> /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
1024 の 2MB ヒュージ ページの解像度は、2GB のヒュージ ページ メモリをコピーすることを意味します。

NUMA アーキテクチャの場合、以前に添付した各追加部分で次のようになります。

echo 1024> /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
echo 1024> /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages

1GB を超える巨大ページ メモリを割り当てたい場合は、Linux のスタートアップ項目で設定してマウントする必要があります。
1) インストールする

yum install libhugetlbfs

2) 割り当て変更起動ファイルに以下を追加します。

transparent_hugepage=never 
default_hugepagesz=1G 
hugepagesz=1G 
hugepages=4

それぞれ 1G の 4 つの大きなメモリ ページを割り当てます。centos6 で、
/etc/grub.conf
centos7 を変更して英語の /etc/grub2.cfg ファイルを変更します。3) マウントすると、巨大なページ メモリが空のディレクトリにマップされます。

# mkdir    /mnt/myhuge
# mount -t hugetlbfs nodev /mnt/myhuge

電源投入時に自動的に設定したい場合:

# vim /etc/fstab
nodev /mnt/myhuge hugetlbfs pagesize=1GB 0 0

メモリ不足を防ぐために起動時にすぐに設定できるDPDKなどの専用設定ツールも用意されていますが、巨大なページメモリには連続した領域が必要です。

プログラムの使用

これは研究に基づいていますが、私は試していません。

HUGETLB_MORECORE=はい

LD_PRELOAD=libhugetlbfs.so

./あなたのプログラム

4ページのメリットとデメリット

アドバンテージ:

1) ラージページメモリのページテーブルは非常に小さく、TLB に配置できます。ページフォールト中断が少なく、メモリアクセスパフォーマンスが向上します。大量のメモリを占有するプログラムの場合、パフォーマンスの向上は明らかです。 50% 程度まで改善できるものもあります。

2) ヒュージ ページ メモリのメモリ ページはディスクにスワップされません。

欠点:

1) 特定の方法で使用する必要があり、mmap でマップするか、上記の方法で指定する必要があります。

2) プログラムは少量のメモリを使用しますが、メモリ割り当ての最小単位はページであるため、メモリの大きなページを適用します。これによりメモリの無駄が発生します。

3) 不適切に使用すると、メモリが無駄に消費され、他のプログラムが大きなページ メモリを使用できなくなる可能性があります。

5 つのラージ ページ メモリによって引き起こされる悲劇
長い間話してきましたが、ラージ ページ メモリによって引き起こされる悲劇については話していません。 。

Top コマンドを使用して、プログラム メモリの占有量が 1G 未満であることを確認します。その時点で、残りのメモリは 300MB しかありませんでした。残りのメモリはどこに行ったのでしょうか?

メモリ割り当てを分析します。

# cat /proc/meminfo|grep Huge
HugePages_Total:    1035
HugePages_Free:     1033
HugePages_Rsvd:       62
HugePages_Surp:        0
Hugepagesize:       2048 kB

より良いツールは、top を使用してチェックし、巨大なページ メモリが最大 2GB のメモリを占有していることを確認することですが、あまり使用されていません。

解決

## 禁用大页缓存
# vi /etc/sysctl.conf
vm.nr_hugepages = 0
vm.nr_hugepages_mempolicy = 0

## 生效
sysctl -p

コマンドの実行後は即時に効果があり、システム メモリの半分を占める 2GB のメモリが一度に解放されるため、ラージ ページ メモリを使用するかどうかを考慮する必要があります。そうしないとメモリが無駄に浪費されます。

プログラムのメモリ使用量が多くても、TLB のミスが多い場合は、TLB のミス数を確認する方法をパフォーマンス ツールで分析できます。

perf record -e dTLB-loads -e faults -p pid
perf report

おすすめ

転載: blog.csdn.net/imliuqun123/article/details/131046393