
커널 공간에서 메모리 누수가 발생한 것 같습니다. slab에서는 kmalloc-4096이 시스템의 모든 RAM 리소스를 독점하고 스왑을 강제할 때까지 균일한 클립을 지속적으로 증가시키는 것을 보여줍니다.
Free는 이러한 메모리 사용량의 대부분을 캐시로 표시하지만 필요에 따라 해제를 거부하거나 수동으로 지우도록 플래그가 지정된 경우에도 해제를 거부합니다. 우리가 보고 있는 것의 예:
$ sudo su -c "free -h && sync && echo 3 > /proc/sys/vm/drop_caches && free -h"
total used free shared buff/cache available
Mem: 15G 4.4G 166M 280M 10G 104M
Swap: 15G 7.8G 8.1G
total used free shared buff/cache available
Mem: 15G 4.4G 186M 280M 10G 115M
Swap: 15G 7.8G 8.1G
누출 위치를 확인하기 위해 kmalloc을 프로파일링해야 합니까? 그렇다면 어떻게 해야 그렇게 할 수 있을까요?
이것은 Intel i5 Skylake에 기본 Ubuntu 16.04 설치입니다.
$ uname -a
Linux fire 4.4.0-78-generic #99-Ubuntu SMP Thu Apr 27 15:29:09 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
답변1
'동기화'는 버프/캐시를 줄이는 것이 아니라 단지 데이터가 블록 장치로 이동하도록 요청하는 것뿐입니다. 캐시의 요점은 데이터가 RAM 캐시에 남아 있다는 것입니다. drop_caches에 3을 보내도 캐시가 삭제될 때까지 기다리지 않습니다. '무료' 앞에 '수면 60시간'을 추가해 주실 수 있나요? 무료로 보고하기 전에 메모리가 지워지는 데 약간의 시간이 걸릴 수 있습니다.
'watch -n60 cat /proc/meminfo'를 그대로 두면 증가하는 메모리 영역을 표시하는 데 도움이 될 수 있지만 캐시와 버프는 단독으로 누출되는 것이 아니며 메모리를 소비함으로써 목적을 달성하고 시스템의 사용 가능한 기능을 최대한 활용합니다. 자원.
프로세스가 디스크로 교체되었다고 해서 자동으로 문제가 발생했다는 의미는 아닙니다. 해당 프로세스가 모든 페이지를 사용하지 않고 유휴 상태가 된다면 커널은 올바른 일을 하고 있는 것입니다. 웹 서버에서 www 루트의 콘텐츠가 실행 중인 mutt의 복사본보다 먼저 필요할 가능성이 높습니다. 예를 들어 사용자가 로그아웃했을 때의 GNU 화면입니다.
여전히 커널이 모듈을 통해 RAM을 소비하고 있다고 생각한다면 다음을 사용하여 이를 좀 더 검사할 수 있습니다.
awk '{ print $2" "$1 }' /proc/modules | sort -n
ZFS를 사용하고 있습니까? RAM이 많이 부족하지만 캐시와 마찬가지로 필요한 경우를 대비해 디스크 IO를 RAM에 유지하려고 합니다.