私は巨大なページが割り当てられたlxcで実行されるプロセスを持っています。ただし、lxcが終了すると、hugepagesはまだ割り当てられますが、それを所有するプロセスはありません。
$ grep huge /proc/*/numa_maps
/proc/5801/numa_maps:7f7b00000000 prefer:0 file=/mnt/hugepages/rtemap_5 huge dirty=1 N0=1
$ virsh -c lxc:/// destroy <container>
$ grep huge /proc/*/numa_maps
$ cat /proc/meminfo | grep -i huge
HugePages_Total: 6
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 1048576 kB
このページをリサイクルする方法について提案がありますか?キャッシュをフラッシュしてみましたが、役に立ちませんでした。
$ sync; echo 3 > /proc/sys/vm/drop_caches
答え1
この問題に対する一般的な解決策は、マッピング後すぐにアプリケーション内からサポートファイルを削除することです。したがって、ファイルは削除済みとしてマークされますが、アプリケーションが終了すると事実上削除されます。つまり、伝統的な生産方法は次のとおりです。
- ファイルを開く巨大なLBFSファイルシステム==>ファイル記述子(fd)のインポート
- 呼ぶftruncate(fd...)必要な数の大きなページにファイルを拡張する
- mmap(...fd...) を使用してファイルをメモリにマッピングする
- ファイルを閉じます。終了(FD)
- ファイルの削除:解く(...)
- マッピングは最後まで進行する過程で可能です。
- いずれにせよ、プロセスが終了すると、システムは手順5で削除されたとマークされたファイルを削除します。
詳細を提供ここ。
答え2
私の意見では、次のファイルを削除すると、ページが復元されたことがわかり、アプリがクラッシュしたことを示しているようです。バグのあるアプリの回避策として他の人に役立つようにこの記事を投稿してください。
$ cd /dev/hugepages
$ ls
rtemap_0 rtemap_1 rtemap_2 rtemap_3 rtemap_4 rtemap_5
$ /bin/rm rte*
$ cat /proc/meminfo | grep -i huge
AnonHugePages: 133120 kB
HugePages_Total: 6
HugePages_Free: 6 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 1048576 kB