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 時間」カウンターだけでなく、他のカウンターも同様に減少しているのを見てきました。

もう 1 つの興味深い点は、偽のサンプルは常に 1 つだけであるように見えることです。2 つのサンプルが互いに近くにあることは決してありません。他のすべてのサンプルは、予想される割合で単調に増加しています。これにより、カウンターがカーネルで何らかの形でリセットされる可能性が排除されるようです。

ここで何が起こっているかの手がかりはありますか?

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

2 に答える 2

1

マルチコア マシンを使用している場合は、プロセスが 1 つのプロセッサ コアから別のプロセッサ コアに移行されたときに、これが発生しているかどうかを確認できます。プロセスが実行中の場合、実行中prstatの CPU が表示されます。ロックの競合を最小限に抑えるために、頻繁に更新されるデータはプロセッサ固有のメモリ領域で更新され、他のプロセッサのデータのコピーと同期されることがあります。

于 2010-02-20T01:01:08.507 に答える
0

推測です。NTP を一時的に無効にして、問題が引き続き発生するかどうかを確認することをお勧めします。

于 2010-02-19T13:10:15.357 に答える