2017-02-15 5 views
3

이것은 정말보기 흉한 질문입니다.forking에 의한 메모리 누수 완화

가 나는 루프에서 다음을 수행하는 C++ 프로그램이 : JMS 메시지

  • 에 대한

    • 대기를 일부 데이터

    응답 JMS 메시지를 보냅니다 계산 내 프로그램 ("Bob"이라고 부름)은 다소 심각한 메모리 누수가 있습니다. 메모리 누수는 다른 사람이 작성한 공유 라이브러리에 있습니다.이 라이브러리는 사용해야하지만 액세스 권한이없는 소스 코드입니다.

    이 메모리 누수로 인해 루프의 "일부 데이터를 계산합니다"단계에서 Bob이 손상됩니다. 이것은 다른 프로그램이 Bob의 응답을 기다리고 있기 때문에 문제이며, 응답을받지 못하면 매우 혼란 스럽습니다.

    다양한 제한 사항 (예 : X/Y 문제이므로 내가 못생긴다고 말씀 드렸습니다) 만 수행 가능한 전략은 루프에서 다음을 수행하도록 Bob을 수정하는 것입니다.

    JMS 메시지
  • 에 대한
    • 대기가이 경우에 "너무 많은"메모리
    • 를 사용하여 위험의 여부를 확인하기 위해 응답
    • 확인을
    • 가 JMS 메시지를 보냅니다 일부 데이터를 계산하므로, 포크와 간부 사람 같아 자체 복사하고 우아하게

    내 질문은 다음과 같다 종료 :

    우리는 "너무 많은"메모리를 사용하고 있는지 여부를 감지하는 가장 좋은 (신뢰할하지만 너무 비효율적 인) 방법은 무엇입니까? 내 생각은 getrlimit(RLIMIT_AS) rlim_curgetrusage(RUSAGE_SELF) ru_maxrss과 비교하는 것입니다. 그 맞습니까? 그렇지 않다면 더 좋은 방법이 무엇입니까? Bob은 다양한 호스트 컴퓨터의 Linux VM에서 실행됩니다. 모두 다른 양의 메모리를 사용합니다.

  • +4

    "일부 데이터 계산"단계에서 메모리 누수가 발생한다고 가정하고, 별도의 프로그램으로 해당 부분을 리팩터링하고 별도의 메모리 공간에서 실행하도록 포크 아웃하는 것이 더 합리적인지 궁금합니다. 그렇게하면 문제가되는 코드를 분리하고 나중에 메모리를 거의 사용하지 않을 때 프로그램을 다시 시작함으로써 문제를 마스킹하지 않고 나중에 코드를 쉽게 대체 할 수 있습니다. 그것은 단지 생각입니다. 코드를 보지 않고도 그것이 코드가 실행 가능한 옵션인지 여부는 말할 수 없습니다. 해결 방법은 –

    +2

    입니다. 계산이 완료 될 때마다 종료하지 않고 매번 프로그램을 다시 시작하는 것이 어떻습니까? –

    +0

    진, 가능한 극단적 인 끝에. 엄격하게 필요한 경우에만 다시 시작하여 오버 헤드를 줄이는 것이 가능한지 궁금합니다. – Arandur

    답변

    1

    "일부 데이터 계산"단계에서 메모리 누수가 발생한다고 가정하면이 부분을 별도의 프로그램으로 리팩터링하고 자체 프로세스에서 실행하도록 포크 아웃하는 것이 합리적 일 수 있다고 생각합니다. 그렇게하면 문제가되는 코드를 분리하고 나중에 메모리를 거의 사용하지 않을 때 프로그램을 다시 시작함으로써 문제를 마스킹하지 않고 나중에 코드를 쉽게 대체 할 수 있습니다.

    "일부 데이터 계산"부분은 주 프로그램의 요청을 기다리고 필요시 자체를 다시 시작하는 장기 실행 프로세스 일 수 있으며, (더 간단 할지라도) 단지 하나의 완료 프로그램 일 수 있습니다 데이터를 *argv에 가져 와서 그 결과를 stdout에게 보냅니다. 그렇다면 메인 루프는 매번 포크 아웃하고 실행할 수 있으며, 돌아올 때 결과를 읽을 수 있습니다. 가능하다면 나는 더 간단한 옵션을 사용 하겠지만, 물론 당신의 필요에 따라 달라질 것입니다.

    0

    프로그램 자체를 다시 시작하거나 "일부 데이터 계산"섹션을 별도의 프로세스로 분기하면 어떤 경우에도 메모리 소비를 확인해야합니다. 리눅스를 사용하고 있기 때문에 이것을 확인하는 쉬운 방법은 관심있는 프로세스의 PID 번호를 얻고 파일 /proc/$PID/statm의 내용을 읽는 것입니다. 두 번째 숫자는 상주 세트의 크기입니다.

    이러한 proc 파일을 읽는 것은 top 및 htop과 같은 도구가 프로세스에 대한 데이터를 얻는 방법입니다. ~ 30-in-memory 파일을 주기적으로 읽어 메모리 누수를 검사하는 것은 비효율적이지 않습니다.

    누수가 규칙적이어서 조금 더 세련되게하려면 증가율을 추적하고 이에 따라 수표 비율을 조정할 수도 있습니다.