1

我正在尝试使用 /proc 文件系统中的数据确定 Solaris 10 中特定进程中特定 LWP 的 CPU 利用率。我遇到的问题是,有时利用率计数器会减少

这是它的要点:

// 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 更改状态时记录的时间戳。此功能称为微状态会计。听起来不错,但“系统调用 cpu 时间”计数器每隔一段时间就会减少大约 1-10 毫秒。

更新:它不仅仅是“系统调用 cpu 时间”计数器,我已经看到其他计数器也在减少。

另一个好奇心是,它似乎总是只有一个样本是伪造的——从来没有两个彼此靠近。所有其他样本都以预期的速率单调增加。这似乎排除了计数器在内核中以某种方式重置的可能性。

关于这里发生了什么的任何线索?

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

2 回答 2

1

如果您在多核机器上,您可能会检查当进程从一个处理器内核迁移到另一个处理器内核时是否发生这种情况。如果您的进程正在运行,prstat将显示它们正在运行的 cpu。为了最大限度地减少锁争用,经常更新的数据有时会在特定于处理器的内存区域中更新,然后与其他处理器的任何数据副本同步。

于 2010-02-20T01:01:08.507 回答
0

只是一个猜测。您可能想暂时禁用 NTP 并查看问题是否仍然出现。

于 2010-02-19T13:10:15.357 回答