2012-08-30 2 views
7

소켓에서 데이터를 받아들이고 일부 품질 제어를하고 다른 컨디셔닝을 여러 가지 프로그램에서 수행 한 다음 명명 된 파이프에 쓰는 프로그램이 있습니다. 나는 valgrind를 실행하고 원래 있던 메모리 누수를 모두 고쳤습니다. 필자는이 프로그램을 실행하는 32 개의 인스턴스가있는 시스템에서 '데모'환경을 만들었습니다. 각각의 인스턴스에는 고유 한 데이터가 공급되고 각 파이프는 자체 파이프로 출력됩니다. 우리는 그것을 시험했고 모든 것이 잘 보였다. 그런 다음 데이터가 불합리한 속도로 전송되는 속도를 높이고 처음에는 상황이 좋게 보인다고 스트레스 테스트를 시도했지만 리소스가 남아 있지 않을 때까지 내 프로그램은 점점 더 많은 메모리를 소비했습니다.메모리 누수를 추적하는 방법 valgrind는 존재하지 않는다고 말합니까?

나는 valgrind를 돌려서 valgrind를 실행하는 각 프로그램이 leak-check = full을 사용하는 것을 제외하고는 똑같은 설정을 실행했습니다. 몇 가지 이상한 일이 일어났습니다. 첫째, 메모리가 누출되었지만 각 프로그램이 내 메모리의 .9 %를 소비 한 지점에서만 (이전에는 가장 큰 메모리 돼지가 내 메모리의 6 %를 차지함). valgrind가 실행 된 프로그램의 CPU 비용을 실행하고 거대한 부하 평균을 가진 100 % cpu에 있었기 때문에 사용 가능한 CPU가 부족하여 프로그램이 너무 느리게 실행되어 누수가 너무 오래 실행되어 매니 페스트가 표시되지 않을 수도 있습니다 . valgrind가 이러한 직접적인 메모리 누수를 보여주지 못했을 때 메모리 누수 가능성을 보여 주었지만 체크 한 결과 실제 메모리 누수를 나타내지는 않습니다. 또한 프로그램이 100MB 이상을 소비하는 동안 가능한 메모리 누수가 수 킬로바이트로 표시되었습니다. valgrind가보고 한 도달 가능한 (유출되지 않은) 메모리도 KB 범위에 있었기 때문에 valgrind는 내 프로그램이 Top에서 사용하는 메모리 중 일부를 사용하고 있다고 생각하는 것 같습니다.

몇 가지 다른 테스트를 실행하여 이상한 결과가 나타납니다. 하나의 프로그램은 원래의 메모리 누수가 발견 된 속도의 세 배로 실행 되더라도 0.9 % 이상의 메모리를 소비하지 않는 것으로 보이며 2 개의 프로그램은 각각 1.9와 1.3 %의 메모리가 누출되지만 더 이상은 없습니다. 유출 된 메모리의 양과 누수되는 비율은 한 번에 얼마나 많은 프로그램 인스턴스가 실행되고 있는지에 따라 달라집니다. 의미가 없으므로 각 인스턴스는 다른 인스턴스와 100 % 독립적이어야합니다.

또한 valgrind 인스턴스를 실행중인 인스턴스가 하나 인 32 개의 인스턴스를 실행하면 valgrind 인스턴스가 실행되는 경우에도 발견됩니다. 메모리가 누출되지만 valgrind 외부에서 실행되는 인스턴스보다 느린 속도로 실행됩니다. valgrind 인스턴스는 여전히 직접 누수가없고 톱 메모리보다 적은 메모리 소비를보고합니다.

저는이 결과를 초래할 수있는 요인과 valgrind가 메모리 누수를 인식하지 못하는 이유에 대해 다소 혼란스러워합니다. 나는 이것이 외부 라이브러리일지도 모른다고 생각했지만, 외부 라이브러리를 실제로 사용하지는 않는다. 그냥 기본적인 C++ 함수/객체. 또한 버퍼가 무한정 커지도록 출력 파이프에 기록 된 데이터 일 수 있다고 생각했지만 1) 버퍼가 커질 수있는 상한선이 있어야하고 2) 데이터를 삭제하면 메모리가 누출되었습니다. 입력 속도는 메모리가 소비하지 않고 아무것도 적당하지 않은 상태로 천천히 내려갑니다.

내가 어디에서 봐야할지 아무에게도 힌트를 줄 수 있습니까? 나는 왜 기억이 이런 식으로 행동하는지에 대해 완전히 혼란 스럽다.

감사합니다.

+2

프로그래밍 누출이 아니라 메모리 누수가 확실합니까? 대산 괴를 시험해 보셨습니까? – PlasmaHH

+0

필자는 비슷한 문제를 직접 겪었으나 (기발한 것은 아니지만) 나는 여러분이 얻은 피드백에 매우 관심이 있습니다. 한 가지 제안 : 사용중인 OS/버전을 명확히 할 수 있습니까? Linux dist라고 가정합니다. –

+0

Valgrind는 샌드 박스에서 프로그램을 실행하고 많은 양의 처리를 수행합니다. valgrind가 부족한 동일한 응용 프로그램보다 훨씬 높은 CPU 사용량과 훨씬 낮은 성능을 기대할 수 있습니다. 나는 스트레스 테스트를하는 동안 프로그램이 파이프를 만들지 못하고 성장할 수있는 데이터를 보유 할 여분의 버퍼를 생성하는지 여부를 고려할 것입니다 (누출이 아니라 단지 속도를 유지할 수 없기 때문에). –

답변

1

이것은 최근에 내가 가진 문제와 같습니다.

프로그램이 데이터를 허용하고 제한없이 내부적으로 버퍼링하는 경우 데이터를 출력 할 수있는 것보다 빠르게 읽고 버퍼링 할 수 있습니다. 이 경우 메모리 사용은 제한없이 계속 증가 할 것입니다.

실행하는 프로그램의 인스턴스가 많을수록 각 인스턴스가 더 느리게 실행되고 버퍼가 빨라집니다.

이것은 문제 일 수도 있고 아닐 수도 있지만 더 자세한 정보가 없으면 내가 할 수있는 최선입니다.

+0

이것은 정확함에 가장 가깝습니다. 나는 매 x 초마다 한 번씩 데이터를 출력한다고 가정했다. 하지만 버그 때문에 내 타임 아웃 시간을 저장 한 카운터가 시작시 incorectly 증가하므로 분당 + 데이터를 저장하고있었습니다. 시스템에 여분의 부담이 생겨 버그가 발생하여 시작시에 더 자주 발생하는 타임 아웃 카운터가 증가했습니다. 나를 올바른 방향으로 인도 해준 대산 괴를 언급하면서 플라스마에게 감사 드린다. memcheck이 메모리 사용량이 많지 않아서 내부 메모리 사용을 고려하지 않았다고 생각했습니다. 나는 apparntly memcheck을 잘못 읽었다. – dsollen

2

먼저 소프트 누출이 있는지 확인해야합니다. 정적 또는 싱글 톤이 버퍼 또는 컨테이너를 점차 증가시키고 휴지통을 수집 할 때 발생합니다. 기술적으로 누수가 아니지만 그 효과는 나쁘다.

1

MemoryScape를 사용해 볼 것을 제안 할 수 있습니까? 이 도구는 메모리 누수 탐지에 매우 효과적입니다. 자유롭지는 않지만 시간과 에너지를 소비한다면, 시도해 볼 가치가 있습니다.

관련 문제