2010-02-18 16 views
1

我正嘗試使用/ proc文件系統中的數據來確定Solaris 10中特定進程中特定LWP的CPU利用率。我遇到的問題是有時使用計數器減少了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); 

在prusage_t結構報告納秒的數量從每個的LWP改變狀態時記錄的時間戳的。該功能稱爲microstate accounting。聽起來不錯,但是經常「系統調用cpu時間」計數器減少約1-10毫秒。

更新:它不僅僅是「系統調用cpu時間」計數器,我也看到其他計數器也在減少。

另一個好奇心是,它似乎總是隻有一個樣品是假的 - 從來沒有兩個彼此靠近。所有其他樣本都以預期的速率單調遞增。這似乎排除了計數器在內核中重置的可能性。

任何關於這裏發生了什麼的線索?

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

你得到了這個答案嗎? – jasonk 2013-05-15 12:32:21

回答

1

如果您使用的是多核計算機,則可以檢查當進程從一個處理器核心遷移到另一個處理器核心時是否發生這種情況。如果你的進程正在運行,prstat將顯示它們運行的​​CPU。爲了最小化鎖爭用,經常更新的數據有時在處理器專用的存儲區中更新,然後與其他處理器的任何數據副本同步。

+0

好主意。謝謝,我會看看這個方向。 – Andrew 2010-02-21 23:29:00

+0

我從來沒有發現這種或那種確鑿的證據,但我同意這可能是發生了什麼事情。 – Andrew 2013-08-16 13:37:19

0

只是一個猜測。您可能需要暫時禁用NTP並查看問題是否仍然出現。

+0

NTP已禁用,謝謝! – Andrew 2010-02-19 14:50:55

相關問題