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