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