.NETのSystem.Management
のものを使用して、WMIを使用して一部のマシンを監視しています。私はよく知られている式を使用してCPU使用率%を計算することから、過去のWMI、負のCPU使用率とTimestamp_Sys100NS
SELECT Timestamp_Sys100NS, PercentProcessorTime
FROM Win32_PerfRawData_PerfOS_Processor
WHERE Name='_Total'
:
double cpu_usage = (1 - (double)delta_cpu/delta_time) * 100;
それは非常によく、すべてのマシンが、1つを(これまでに)働く私が使用していたクエリはこれです。
問題は、Windows 2003サーバー(ハイパースレッディングが有効な場合は重要)の1台のマシンで、CPU使用率がマイナスになることがあります。換言すれば、という表現は数字> 1
を生成する。私はなぜこれが起こっているかもしれないかのヒントについてウェブを検索しましたが、何も見つかりませんでした。
このWindows 2003サーバーは特定ですか?それともハイパースレッディング関連の問題ですか?または、それはちょうど期待されていると私はちょうどいくつかの範囲にCPU使用量の値またはcpu_delta
の値をクランプする必要がありますか?
編集:私はこの1台のマシンで観察しています 二奇妙なことは、Timestamp_Sys100NS
値は、日付のようなFILETIME
を示していないことである(エポック1600年1月1日以降ティック)が、代わりに、それはブート時以来ティックのように見えます。
EDIT 2: この問題は、多くのWindows 2003サーバーで確認されています。そして私は明らかにnot the only one with the same problemです。
EDIT 3: 私はWin32_OperatingSystem
からLastBootUpTime
を照会し、Timestamp_Sys100NS
の値が過去に遠すぎるときTimestamp_Sys100NS
にそれを追加することにより、タイムスタンプの問題を解決しました。それは正しい日時を与えるようです。その後、boot_time
単に時間に加算されて...
WbemScripting.SWbemDateTime swbem_time = new WbemScripting.SWbemDateTime();
swbem_time.Value = date_str;
string time_as_file_time_str = swbem_time.GetFileTime(true);
return new DateTimeOffset(epoch.Ticks + long.Parse(time_as_file_time_str),
swbem_time.UTCSpecified
? TimeSpan.FromMinutes(swbem_time.UTC)
: TimeSpan.Zero);
...その後UTCに調整...
boot_time = boot_time.UtcDateTime;
:それはWin32_OperatingSystem
から取得された後の日付を操作するコードは次のようになります。スタンプ(current
は)... Timestamp_Sys100NS
フィールドにWMIによってで返さ
if (time.Year < 2000)
time = boot_time + current;
EDIT 4: それはTimestamp_Sys100NS
に関してシステムの3つのクラスがあることが表示されます。
- はまず
Timestamp_Sys100NS
はUTCにおけるエポックからのティックの時間であるVistaの+システムです。 - 第2に、妥当な時間を得るため
Timestamp_Sys100NS
をWin32_OperatingSystem.LastBootUpTime
に追加する必要があるWindows 2003システムがあります。 - 第3クラスは、上記の追加を行うことで、依然として正しい日時の日付が失われるシステムです。
EDIT 5:影響を受けたマシンのいくつかは、仮想マシンではなく、それらのすべてだったかもしれません。
これはCPUがあなたを使用していることを意味します:) –
どのようにしてLastBootUpTimeをTimeStamp_Sys100NSに追加しましたか?どのような変換をしましたか? – raz3r
@ raz3r:私は 'System.DateTime(Int64)' ctor(ティックを取る)を使用しています。それをLastBootUpTimeに追加します。私は明日の正確な詳細のみを確認することができます。 – wilx