2009-10-14 4 views
0

Linux에서 프로세스의 스레드 기반 메모리 사용량을 얻는 방법은 무엇입니까? 우리는/proc/pid/task/tid/statm을 사용할 수 있다는 것을 알고 있지만 내 경우에는 도움이되지 않습니다. 모든 스레드는 PID의 statm과 동일한 값과 동일한 값을 표시합니다.프로세스의 스레드 레벨 메모리 사용량

우리는 valgrind를 할 수 있지만 잘못된 읽기/쓰기 또는 누출을 찾지 않습니다. Valgrind는 스레드 수준 정보를 알려주지 않습니다.

다른 제안 사항이 있으십니까?

편집 : 내 코드의 프로필을 작성하려면 어떻게해야합니까? 함수/줄 번호 등에서 할당 된 메모리 양은 어느 정도입니까?

+1

잘 들어 top -H -p <PID>

의 출력에 나열된 TID와 일치시킬 수 있습니다 진수로, 개념적으로, 모든 스레드는 같은 메모리 풀에 액세스 할 수 있습니다 그래서 그들은 모두 같은 금액을 사용합니다. 추적하고자하는 것은 스레드 당 할당 수입니다. glibc 나 커널이 그렇게하지 않는다고 생각합니다. 그리고 고려하십시오 : 어떻게 한 스레드에서 할당되고 다른 메모리에서 해제 된 메모리 블록을 계산합니까? –

+0

malloc 위에 래퍼를 작성할 수 있습니다. malloc 위에 통계를 수집 할 수 있지만 malloc을 많이 사용하여 거대한 코드를 프로파일 링하는 것은 어렵습니다. – Jack

+0

'gettid (2)'를 호출하는 malloc 주위에 래퍼를 사용하는 것은 어떻습니까? 그렇게하면 래퍼를 호출하는 스레드를 추적하면서 호출 코드를 동일하게 유지할 수 있습니다. –

답변

2

모든 스레드는 동일한 주소 공간을 공유하며 동일한 힙을 사용하므로 스택을 제외하고 모두 동일한 메모리 사용량을 나타내야합니다.

top -H -p<PID> 

명령 헤더를 다음과 같이 결과를 나열합니다 당신은 옵션 -H-p와 명령 top을 사용할 수 있습니다

CPU와 메모리의 스레드 수준의 사용을 볼 수있는 리눅스의 옵션이 있습니다

+0

답변 해 주셔서 감사합니다. 내 질문을 다시 말해 보자. 바이너리를 스레드 수준에서 프로파일 링하려면 어떻게해야합니까? 코드의 어느 시점에 얼마나 많은 메모리가 할당 되었습니까? 내 스레드는 일반적으로 메모리 블록을 공유하지 않습니다. 그들은 단지 fds, IPC 파일 등을 공유합니다. – Jack

+0

내가 받아 본 유일한 대답은 다음과 같습니다. D 동일한 mem 사용법을 보여주는 것에 동의합니다. 그 이상을 할 수 없었습니다 .. – Jack

0

이 경우에는 PID을 TID (스레드 ID)로 읽어야합니다.

PID USER  PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND` 

java 프로세스의 경우 다음과 같이 매우 명확합니다. 당신은 프로세스의 스레드 덤프를 생성하고 스레드 ID를 변환 할 경우