저는 여러 사용자 정의 하드웨어가 연결된 Linux(Ubuntu 14.04.3)를 실행하는 시스템(x86_64 기반)을 개발했습니다. 저는 맞춤형 하드웨어용 드라이버와 제어 소프트웨어를 작성했습니다.
이 시스템에서 오랜 시간(며칠) 테스트를 실행한 후 사용 가능한 메모리 양( 명령으로 표시됨 cat /proc/meminfo
) 이 free
꾸준히 감소하는 것을 확인했습니다. 내 사용자 공간 프로세스에서 사용하는 메모리 양은 적당합니다. 페이지 캐시를 지웠지만 사용 가능한 메모리 양에는 거의 영향을 미치지 않았습니다.
시스템을 재부팅하고 간단한 테스트를 500번 반복하고 페이지 캐시를 지운 다음 출력을 /proc/meminfo
파일에 쓰는 스크립트를 작성했습니다. 그런 다음 이 스크립트를 며칠 동안 실행하여 일부 데이터 포인트를 수집합니다. 결과 데이터를 분석한 후 여유 메모리(MemFree, MemAvailable도 포함)의 양은 선형 방식으로 꾸준히 감소하는 반면 다른 범주는 거의 균일하게 유지되는 것을 확인했습니다. 여기에 게시하기에는 너무 많은 데이터를 수집했지만 여기에 첫 번째와 마지막 데이터 포인트가 있습니다.
_Run 1_ _Run 650_
MemTotal: 65738276 65738276
MemFree: 65182220 30881420
MemAvailable: 65124632 30824008
Buffers: 2292 2064
Cached: 101204 100816
SwapCached: 0 0
Active: 174772 195008
Inactive: 82924 82444
Active(anon): 154304 174712
Inactive(anon): 66624 66628
Active(file): 20468 20296
Inactive(file): 16300 15816
Unevictable: 0 0
Mlocked: 0 0
SwapTotal: 66978812 66978812
SwapFree: 66978812 66978812
Dirty: 188 184
Writeback: 0 0
AnonPages: 154296 180848
Mapped: 99760 99360
Shmem: 66672 66676
Slab: 46836 48352
SReclaimable: 17000 18008
SUnreclaim: 29836 30344
KernelStack: 4176 4128
PageTables: 7244 6680
NFS_Unstable: 0 0
Bounce: 0 0
WritebackTmp: 0 0
CommitLimit: 99847948 99847948
Committed_AS: 433008 417576
VmallocTotal: 34359738367 34359738367
VmallocUsed: 1886988 1886956
VmallocChunk: 34357817344 34357817344
HardwareCorrupted: 0 0
AnonHugePages: 106496 126976
CmaTotal: 0 0
CmaFree: 0 0
HugePages_Total: 0 0
HugePages_Free: 0 0
HugePages_Rsvd: 0 0
HugePages_Surp: 0 0
Hugepagesize: 2048 2048
DirectMap4k: 93872 93872
DirectMap2M: 1894400 1894400
DirectMap1G: 67108864 67108864
시스템의 64GB 메모리 중 절반 이상이 어떤 방식으로든 소비되는 반면, 다른 범주에서는 크게 증가하지 않은 것으로 보입니다.
문제를 해결하기 위해 제가 수행한 작업은 다음과 같습니다.
- 나는 커널 메모리 누수가 내 드라이버 중 하나에 의해 발생했을 수 있다고 즉시 의심하여 모든 드라이버 코드를 감사했습니다. 나는 명백한 문제를 보지 못했습니다.
- 또한 커널의 kmemleak 검사기를 활성화하고 이전에 언급한 테스트 스크립트를 다시 실행했습니다. 누출이 발견되지 않았습니다.
- 최근에 활성화했습니다페이지 소유자정기적인 출력을 수집하는 동안 커널 기능을 디버깅하고 스크립트를 다시 실행합니다. 출력물을 정렬하고 비교한 결과 약간의 델타가 표시되지만(내 계산에 따르면 총 델타는 10,872페이지 또는 약 42MB임) 소비된 양은 거의 30GB에 가깝습니다.
나는 완전히 당황했고 빠르게 아이디어가 고갈되었습니다.
현재 상황에 대한 아이디어 및/또는 이 문제를 해결하는 방법에 대한 제안 사항이 있는 사람이 있습니까?