巨大なページが使用中ですが、アロケータはありません。

巨大なページが使用中ですが、アロケータはありません。

私は巨大なページが割り当てられた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

この問題に対する一般的な解決策は、マッピング後すぐにアプリケーション内からサポートファイルを削除することです。したがって、ファイルは削除済みとしてマークされますが、アプリケーションが終了すると事実上削除されます。つまり、伝統的な生産方法は次のとおりです。

  1. ファイルを開く巨大なLBFSファイルシステム==>ファイル記述子(fd)のインポート
  2. 呼ぶftruncate(fd...)必要な数の大きなページにファイルを拡張する
  3. mmap(...fd...) を使用してファイルをメモリにマッピングする
  4. ファイルを閉じます。終了(FD)
  5. ファイルの削除:解く(...)
  6. マッピングは最後まで進行する過程で可能です。
  7. いずれにせよ、プロセスが終了すると、システムは手順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

関連情報