2009-09-16 7 views
7

다른 응용 프로그램을 관찰하고 자원 소비를 추적하는 Linux 응용 프로그램을 작성하고 있습니다. Java로 작업 할 계획이지만 프로그래밍 언어는 중요하지 않습니다. 목표는 중요하므로 다른 기술로 전환하거나 모듈을 사용할 수 있습니다. 내 응용 프로그램은 선택한 타사 응용 프로그램을 하위 프로세스로 실행합니다. 대부분 자식 소프트웨어는 그래프, 문자열 검색 등과 같은 알고리즘을 해결합니다. 관찰자 프로그램은 작업을 끝내는 동안 하위 리소스를 추적합니다.추적 스레드 메모리 및 CPU 사용량

자식 응용 프로그램이 다중 스레드 인 경우 어쩌면 얼마나 많은 자원이 각 스레드를 소비 하는지를 추적 할 수 있습니까? Java 스레드, Boost 스레드, POSIX 스레드, OpenMP 및 기타 다른 분산 메모리 스레드 기술을 사용하여 응용 프로그램을 작성할 수 있습니다.

+1

영감을 얻으려면 OProfile을 보았습니까? http://oprofile.sourceforge.net –

+0

아니요, 이것은 제 석사 학위 일입니다. 어쩌면 내 강사가 보였습니다. :-) 그러나 OProfile은 재미있어합니다. 고마워. – Pawka

답변

5

현대 Linux 시스템 (2.6)에서 각 스레드는 PID와 거의 동일한 처리 방법을 가진 별도의 식별자를 가지고 있습니다. 공정 표 (최소한 htop 프로그램)에 표시되며 별도의 /proc 항목 (예 : /proc/<tid>/stat)이 있습니다.

stat, statm, status 등을 확인하십시오. 관심있는 정보를 찾아야합니다.

유일한 장애물은이 스레드 식별자를 얻는 것입니다. 프로세스 ID가 인 경우 이 다릅니다! 나는. 모든 스레드에서 getpid() 호출은 동일한 값을 반환합니다. 실제 스레드 식별자를 얻으려면, 당신은 (C 프로그램 내에서)를 사용한다 :

pid_t tid = syscall(SYS_gettid); 

을 그건 그렇고, 자바 가상 머신 (적어도 그것의 오픈 JDK 리눅스 구현) 내부적으로 수행하고에 디버깅을 위해 그것을 사용 그 백엔드는 Java 인터페이스에 공개하지 않습니다.

4

메모리는 스레드에 할당되지 않으며 종종 스레드간에 공유됩니다. 이것은 일반적으로 스레드의 메모리 소비에 대해 이야기하는 것이 불가능하고 적어도 의미가 없습니다.

예제는 11 개의 스레드가있는 프로그램 일 수 있습니다. 1 개체 만들기 및 10 개체 사용. 대부분의 작업은이 10 개의 스레드에서 수행되지만 모든 메모리는 객체를 만든 하나의 스레드에 할당됩니다. 이제 어떻게 그 일이 일어날까요?

+0

당신이 옳지 않다고 말할 수는 없습니다.그러나 단일 스레드 메모리 사용량은 특정 스레드가 현재 시간에 작동하는 메모리 양이라고 가정 할 수 있습니다. 대부분의 쓰레드는 데이터와 함께 작동하면서 semophores 또는 뮤텍스로 메모리를 잠급니다. – Pawka

+0

죄송하지만 아직 이해가되지 않습니다. 읽기 전용 메모리는 전혀 잠글 필요가 없습니다. 뮤텍스가 사용되면 코드로 이동하지 않고 어떤 메모리를 보호하는지 결정할 합당한 방법이 없습니다. – MSalters

+0

나는 읽기 전용 메모리에 대해 말하는 것이 아닙니다. 우리는 여전히 스레드의 메모리 소비를 계산할 수 있습니다. 예를 들어, 일부 그래프 작업, 일부 계산을위한 노드 작성 등이 각각의 데이터는 하나의 스레드가 액세스 할 수 있으며, 자체적으로 작성되고 작업 완료 후 정리 될 수 있습니다. – Pawka

1

이 좀 봐 펄을 사용하고자하는 경우 : Sys-Statistics-Linux

내가 여러 프로세스에 대한 시스템 리소스 사용 그래프를 생성하기 위해 GD의 그래프 패키지의 일부와 함께 사용.

조심해야 할 것은 - proc을 읽고 jiffies를 이해할 필요가 있습니다 - 맨 페이지에서 제대로 문서화되지 않은 것으로 보았을 때 아마 커널 소스를 읽을 필요가있을 것입니다 - 그들이 커널을 구현하는 방법을 동일 걸 이외의

http://lxr.linux.no/#linux+v2.6.18/include/linux/jiffies.h

또한, 리눅스에서 스레드 및 프로세스 사이의 유일한 차이는 쓰레드가 메모리를 공유하는 것을 기억하십시오.

+0

Sys-Statistics-Linux 링크가 깨졌습니다. –

관련 문제