무엇이 메모리를 소비하는지 알아내는 방법은 무엇입니까?

무엇이 메모리를 소비하는지 알아내는 방법은 무엇입니까?

저는 여러 사용자 정의 하드웨어가 연결된 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에 가깝습니다.

나는 완전히 당황했고 빠르게 아이디어가 고갈되었습니다.

현재 상황에 대한 아이디어 및/또는 이 문제를 해결하는 방법에 대한 제안 사항이 있는 사람이 있습니까?

관련 정보