거대한 페이지가 사용 중이지만 할당자가 없습니다.

거대한 페이지가 사용 중이지만 할당자가 없습니다.

나는 거대한 페이지가 할당된 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

관련 정보