valgrind와 같은 메모리 누수 감지 도구의 지원 없이 프로세스에 메모리 누수가 있다고 어떻게 결론을 내릴 수 있습니까?

valgrind와 같은 메모리 누수 감지 도구의 지원 없이 프로세스에 메모리 누수가 있다고 어떻게 결론을 내릴 수 있습니까?

프로세스의 RSS 값(top 또는 ps 명령을 통해 얻은 값)이 급격히 증가하는 경우 메모리 누수로 간주할 수 있습니다. 코드 수정을 위한 규정이 적고 메모리 사용량을 추적하기 위한 새 유틸리티 설치에 대한 지원이 충분하지 않다고 가정합니다.

독점 애플리케이션이므로 여기에 코드를 제공할 수 없습니다. 문제를 좁혀봤습니다. 클라이언트와 서버 데몬 사이에 열리고 닫히는 모든 openSSL 연결에는 일부 메모리 누수가 발생합니다. 서버 데몬은 지속적으로 연결을 기다리는 일반적인 서버이며, 연결이 수락되면 클라이언트 요청을 처리하기 위한 스레드를 생성합니다. openSSL1.0.1 버전입니다. 링크에 따르면:https://stackoverflow.com/questions/29845527/how-to-properly-uninitialize-openssl

서버 측에 관심이 있기 때문에 서버 클래스 소멸자에 다음 정리를 추가했습니다.

void ServerClass::doCleanUp()
{
    CRYPTO_cleanup_all_ex_data();
    ERR_free_strings();
    ERR_remove_state(0);
    ERR_remove_thread_state(NULL);
    CRYPTO_set_locking_callback(NULL);
    CRYPTO_set_id_callback(NULL);
}

여러 반복에 대해 연결 열기 및 닫기 테스트를 수행한 후 RSS 값에 약간의 차이가 있습니다. 즉, (RSS_value_after_test_completion - RSS_value_at_startup)이 양수입니다. 그렇다면 이 +ve 차이가 메모리 누수로 간주될 수 있습니까? 또한 stackoverflow 링크에 따르면 애플리케이션 수준 정리와 스레드 수준 정리라는 개념이 있습니다. 이전 솔루션에서는 EVP_cleanup()을 사용했는데 다른 테스트 사례에서 문제가 발생하여 동일한 상황이 되돌려졌습니다. 서버가 항상 실행 중이어야 하기 때문에 DH 매개변수 언로드와 관련된 활동을 수행할 수 없습니다. 내가 뭐 놓친 거 없니? 추가 안내를 주시면 감사하겠습니다.

몇 가지 관찰 사항: 관찰 1: 5, 10, 30, 60회 반복에 대한 켜기 및 끄기 테스트를 수행했을 때 프로세스의 RSS 값이 특정 값(37.7MB)에 도달하면 해당 값에서 증가하지 않는 것을 관찰했습니다. . 참고:- 테스트 반복 순서는 언급된 것과 다를 수 있습니다.
관찰 2: 한 번의 테스트 반복을 통해 RSS 값이 약 7MB 증가하는 것을 볼 수 있습니다. 관찰 3: 테스터는 특정 반복(예: 100)에 대해 테스트를 실행하므로 RSS 값에는 항상 +ve 차이가 있으며 누출이 주장됩니다.

답변1

불필요한:

  • 귀하의 애플리케이션은 더 이상 사용되지 않는 항목을 주기적으로 확인하고 제거하는 메모리 내 데이터베이스를 유지 관리하고 있을 수 있습니다.
  • Java와 같은 애플리케이션은 정기적으로 가비지 수집을 거칠 수 있습니다.

메모리가 부족하더라도 구성이 잘못되었을 가능성이 높습니다(주기적인 확인/청소 상태에 도달할 수 없음).

관련 정보