2010-02-18 3 views
1

/proc 파일 시스템의 데이터를 사용하여 Solaris 10의 특정 프로세스에서 특정 LWP의 CPU 사용률을 확인하려고합니다. 문제는 사용 카운터가 인 경우가으로 줄어들 때가 있습니다. prusage_t 구조체보고 나노초 번호가 LWP 상태가 변경 될 때마다 기록 타임 스탬프로부터 유도된다Solaris 10/proc 파일 시스템의 사용 카운터가 어떻게 감소합니까?

// we'll be reading from the file named /proc/<pid>/lwp/<lwpid>/lwpusage 
std::stringstream filename; 
filename << "/proc/" << pid << "/lwp/" << lwpid << "/lwpusage"; 
int fd = open(filename.str().c_str(), O_RDONLY); 
// error checking 
while(1) 
{ 
    prusage_t usage; 
    ssize_t readResult = pread(usage_fd, &usage, sizeof(prusage_t), 0); 
    // error checking 

    std::cout << "sec=" << usage.pr_stime.tv_sec 
       << "nsec=" << usage.pr_stime.tv_nsec << std::endl; 
    // wait 
} 
close(fd); 

:

여기의 요지이다. 이 기능을 microstate accounting이라고합니다. 좋은 소리지만, 흔히 "시스템 호출 CPU 시간"카운터 인 약 1 ~ 10 밀리 초가 감소합니다.

업데이트 : "시스템 호출 CPU 시간"카운터뿐만 아니라 다른 카운터도 감소하는 것을 보았습니다.

또 다른 호기심은 항상 정확히 하나의 표본 인 것처럼 보이지만 서로 가깝지 않습니다. 다른 샘플은 예상 속도로 단조롭게 증가합니다. 이것은 카운터가 커널에서 어떻게 든 리셋 될 가능성을 배제하는 것으로 보입니다.

여기에 무슨 일이 일어나는가에 대한 단서가 있습니까?

> uname -a 
SunOS cdc-build-sol10u7 5.10 Generic_139556-08 i86pc i386 i86pc 
+0

이 답변을 얻었습니까? – jasonk

답변

1

멀티 코어 컴퓨터를 사용하는 경우 프로세스가 하나의 프로세서 코어에서 다른 프로세서 코어로 마이그레이션 될 때이 문제가 발생하는지 확인할 수 있습니다. 프로세스가 실행중인 경우 prstat은 실행중인 CPU를 표시합니다. 잠금 경합을 최소화하기 위해 종종 자주 업데이트되는 데이터가 프로세서 특정 메모리 영역에서 업데이트 된 다음 다른 프로세서의 데이터 복사본과 동기화됩니다.

+0

좋은 아이디어. 고마워, 나는이 방향을 살펴볼 것이다. – Andrew

+0

나는 확실한 증거를 찾지 못했지만 이것이 아마도 계속되고있는 것에 동의합니다. – Andrew

0

그냥 추측하십시오. 일시적으로 NTP를 사용하지 않고 문제가 계속 나타나는지 확인하는 것이 좋습니다.

+0

NTP가 비활성화되었습니다. 감사합니다! – Andrew