Windowsドメインには多数のWindows7x64ラップトップDellLatitudeE5550があります。 Cca 1-2(-3?)週間前、すべてが1日のうち数秒間ランダムに数回フリーズし始めました。
フリーズとは、Windowsが完全に応答しなくなり、numlockライトの切り替えがしばらく機能し、その後も機能しなくなり、通常の応答性に戻ることを意味します。プロセス全体が非常にランダムに繰り返され、フリーズ期間は数秒から最大になります。 cca 20〜30秒。
問題のあるKB3114717をアンインストールしようとしましたが、改善されていません。 AVGアンチウイルス、Office 2013、Windows 7x64を使用します。
これでは答えを出すのに十分ではないことは理解していますが、Sysinternals ProcessMonitorのように、CPUが50%以上のようにヒットしたかどうかを確認できる設定やフィルターはありますか?
問題が発生すると、perfmonは空白を報告します。これは、単純なプロセスが原因ではなく、カーネルまたはドライバー内の問題である必要があることを意味していると思います...?
さらなる分析から、問題はProcess
に関連しているようです。つまり、次のカウンターはフリーズの直前に急上昇します。
しかし、PerfMonデータでこれを引き起こしたプロセスごとの情報を見つけることができません。
トラブルメーカーの候補はほとんど見つかりませんでした:1E NightWatchman、1E WakeUp Agent、Realtek Audio Service、AVG Service、それらを選択的に試してみる
これまで根本的な原因を見つけることはできませんでしたが、次のサービスが無効になっているコンピューター:
凍結の問題はゼロカウントになりました。これらのサービスを無効にする前に、時々フリーズします。 Input/output data operations per second
フリーズが発生する前に、perfmonでこれらのサービスの上昇。
システム障害を「デバッグ」する必要があるときにプロセスのデータを取得するために、このスクリプトをここに記述しました。プロセスの終了を待機するPowerShellセッションでバックグラウンドジョブを作成します
ワークステーションで実行されている各プロセスのすべてのGDIオブジェクト、ハンドル、RAMなどの情報を取得します。これで、障害を引き起こすプロセスをキャッチしようとすることができます。
コンピューターがフリーズしたため、Explorer.exeプロセスが応答していないと推測します。そのため、Explorer.exe Responding-propertyがtrueでない場合は常に、get-dataスクリプトをトリガーします。
必要なワークステーションのPowerShellセッションでこのスクリプトを開始するだけです。通知トレイのバルーンテキストによって障害を視覚化します。メール通知が必要な場合は、Send-Mailmessage
パートの後にGet-MachineData
を置くだけです。
バックグラウンドジョブの実行中にPowerShellを使用できます。 get-job
を使用して、ジョブが実際に実行されているかどうかを確認します。
詳細情報は%userprofile%\ ProcessDetails.txtに保存されます
Start-Job -name CatchSystemFailure {
$sig = @'
[DllImport("User32.dll")] public static extern int GetGuiResources(IntPtr hProcess, int uiFlags);
'@
Add-Type -MemberDefinition $sig -name NativeMethods -namespace Win32
[Reflection.Assembly]::LoadWithPartialName("System.Drawing") | Out-Null
[Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | Out-Null
function Get-MachineData(
[switch]$AllProcessDetails,
[switch]$RAM
)
{
switch($PSBoundParameters.GetEnumerator().Where({$_.Value -eq $true}).Key)
{
'AllProcessDetails' {
$processes = [Diagnostics.Process]::GetProcesses() |
select Name, Responding, NPM, PM, WS, VM, Cpu, Handles, @{n='GDI-Objects';e={
[Win32.NativeMethods]::GetGuiResources($_.Handle, 0).ToString()}
} | sort Name
Write-Output $processes
}
'RAM' {
$ComputerSystem = gwmi Win32_operatingsystem -Property TotalVisibleMemorySize, FreePhysicalMemory
$FreePhysicalMemory = "{0:N2}" -f (($ComputerSystem.FreePhysicalMemory) / (1mb))
$TotalVisibleMemorySize = "{0:N2}" -f (($ComputerSystem.TotalVisibleMemorySize) / (1mb))
$TotalFreeMemPerc = "{0:N2}" -f (($FreePhysicalMemory/$TotalVisibleMemorySize)*100)
$Memory = New-Object PSCustomObject –Prop (@{
'Server-RAM'=$TotalVisibleMemorySize + "GB";
'Free RAM'=$FreePhysicalMemory + "GB";
'Free RAM in %'=$TotalFreeMemPerc + "%"
}) | fl *
Write-Output $Memory
}
}}
while ((Get-Process system).Responding) {sleep -Milliseconds 50}
if (!(Get-Process system).Responding) {
$SystrayIcon = New-Object System.Windows.Forms.NotifyIcon
$SystrayIcon.Icon = [system.drawing.icon]::ExtractAssociatedIcon($pshome + "\powershell.exe")
$SystrayIcon.BalloonTipText = "system failure! inform your systemadministrator!"
$SystrayIcon.BalloonTipTitle = "Process Watcher"
$SystrayIcon.Visible = $true
$SystrayIcon.ShowBalloonTip(600)
$SystrayIcon.dispose()
Get-MachineData -AllProcessDetails -RAM | out-file $env:USERPROFILE\ProcessDetails.txt -Force
}
} | out-null