커널 공간에서 메모리 누수가 발생한 것 같습니다. 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"를 그대로 두면 증가하는 메모리 영역을 표시하는 데 도움이 될 수 있지만 캐시와 버퍼는 별도의 누출이 아니며 메모리를 소비함으로써 목적을 달성하고 시스템의 여유 공간 리소스를 최대한 활용합니다.
프로세스가 디스크로 교체되었다고 해서 자동으로 나쁜 일이 발생했다는 의미는 아닙니다. 프로세스가 모든 페이지를 사용하지 않고 유휴 상태라면 커널이 올바른 작업을 수행하고 있는 것입니다. 그러면 웹 서버에서 mutt의 복사본이 계속 실행되기 전에 www 루트의 내용이 필요할 가능성이 높습니다. 예를 들어 사용자가 GNU 화면에서 로그아웃할 때입니다.
여전히 커널이 모듈을 통해 RAM을 소비하고 있다고 생각되면 다음 명령을 사용하여 추가로 확인할 수 있습니다.
awk '{ print $2" "$1 }' /proc/modules | sort -n
ZFS를 사용하고 있습니까? 이는 RAM을 많이 소모하지만 캐시와 마찬가지로 필요한 경우를 대비해 디스크 IO를 RAM에 유지하려고 합니다.