나는 독점 OpenGL 라이브러리인 Wayland Weston과 Linux 커널의 독점 그래픽 드라이버를 사용하는 대규모 다중 스레드 오픈 소스 응용 프로그램을 가지고 있습니다. 이 드라이버는 현재 개발 중이므로 버그가 있을 수 있습니다.
나는 다음과 같은 증상을 관찰했습니다.
free -m
내 응용 프로그램을 실행할 때 사용 가능한 메모리()가 지속적으로 소모됩니다. 정상 상태에서는 약 1MB/5분을 소비합니다.앱을 계속 중지하고 시작하면 기억 상실 속도가 빨라질 수 있습니다. 애플리케이션을 다시 시작할 때마다 약 0.5MB가 손실되는 것 같습니다.
응용 프로그램을 중지하면 메모리가 시스템에 반환되지 않습니다. 메모리는 전원을 껐다 켠 후에만 복원됩니다.
메모리 사용량을 기록하고 사진을 찍기 시작했습니다
/proc/<pid>/smaps
. 어떤 스레드가 메모리를 소비하고 있는지 확인할 수 있으며 더 자세히 조사해 보겠습니다.smaps 파일을 조사해 보면 오래된 스냅샷이 시간이 지남에 따라 더 많은 메모리를 소비하는 것으로 나타났습니다.
anon_inode:dmabuf
이전 스냅샷에는 다음 문제와 유사한 항목이 더 있습니다.
이 메모리 누수는 사용자 공간 메모리 누수 또는 커널 메모리 누수일 가능성이 더 높습니까?
누출 원인의 범위를 좁히기 위해 어떤 다른 진단을 수행할 수 있습니까?
답변1
응용프로그램이 mmap()을 통해 익명 메모리 할당을 수행합니까?
RAM 디스크에 데이터나 로그 파일이 기록되고 있습니까? 계속 시작하고 끝나는 스레드가 있습니까? 스레드 종료를 올바르게 처리합니까? (가보니 누수가 있다는 걸 알았습니다.) 조금만 기다리면 동적 구조가 해제되면서 커널 메모리 사용량이 줄어들까요?
누가 메모리 누수를 할 확률이 99%보다 높다고 생각합니다.