메모리 누수가 사용자 공간에서 발생하는지 아니면 커널 공간에서 발생하는지 확인하는 방법은 무엇입니까?

메모리 누수가 사용자 공간에서 발생하는지 아니면 커널 공간에서 발생하는지 확인하는 방법은 무엇입니까?

나는 독점 OpenGL 라이브러리인 Wayland Weston과 Linux 커널의 독점 그래픽 드라이버를 사용하는 대규모 다중 스레드 오픈 소스 응용 프로그램을 가지고 있습니다. 이 드라이버는 현재 개발 중이므로 버그가 있을 수 있습니다.

나는 다음과 같은 증상을 관찰했습니다.

  1. free -m내 응용 프로그램을 실행할 때 사용 가능한 메모리()가 지속적으로 소모됩니다. 정상 상태에서는 약 1MB/5분을 소비합니다.

  2. 앱을 계속 중지하고 시작하면 기억 상실 속도가 빨라질 수 있습니다. 애플리케이션을 다시 시작할 때마다 약 0.5MB가 손실되는 것 같습니다.

  3. 응용 프로그램을 중지하면 메모리가 시스템에 반환되지 않습니다. 메모리는 전원을 껐다 켠 후에만 복원됩니다.

  4. 메모리 사용량을 기록하고 사진을 찍기 시작했습니다 /proc/<pid>/smaps. 어떤 스레드가 메모리를 소비하고 있는지 확인할 수 있으며 더 자세히 조사해 보겠습니다.

  5. smaps 파일을 조사해 보면 오래된 스냅샷이 시간이 지남에 따라 더 많은 메모리를 소비하는 것으로 나타났습니다. anon_inode:dmabuf이전 스냅샷에는 다음 문제와 유사한 항목이 더 있습니다.

    https://stackoverflow.com/questions/28097766/where-does-the-dev-zero-deleted-anon-inodedmabuf-comes-from-in-proc-p

    https://bugs.freedesktop.org/show_bug.cgi?id=100298

이 메모리 누수는 사용자 공간 메모리 누수 또는 커널 메모리 누수일 가능성이 더 높습니까?

누출 원인의 범위를 좁히기 위해 어떤 다른 진단을 수행할 수 있습니까?

답변1

응용프로그램이 mmap()을 통해 익명 메모리 할당을 수행합니까?
RAM 디스크에 데이터나 로그 파일이 기록되고 있습니까? 계속 시작하고 끝나는 스레드가 있습니까? 스레드 종료를 올바르게 처리합니까? (가보니 누수가 있다는 걸 알았습니다.) 조금만 기다리면 동적 구조가 해제되면서 커널 메모리 사용량이 줄어들까요?

누가 메모리 누수를 할 확률이 99%보다 높다고 생각합니다.

관련 정보