過去 14 天,域中的筆記型電腦全部隨機凍結幾秒鐘
我們在 Windows 域中有許多 Windows 7 x64 筆記型電腦 Dell Latitude E5550。Cca 1-2(-3?) 幾週前都開始在一天中隨機凍結幾次,持續幾秒鐘。
凍結意味著 Windows 完全沒有響應,numlock 燈開關工作了一段時間,然後它也停止工作,然後又恢復正常響應。整個過程非常隨機地重複,凍結持續時間從幾秒到最長不等。cca 20-30 秒。
我們已嘗試解除安裝有問題的 KB3114717,但沒有任何改善。使用 AVG 防病毒軟體、Office 2013、Windows 7 x64。
我知道這不足以給出任何答案,但是是否有像 Sysinternals ProcessMonitor 中的設置或過濾器,可以讓我查看 CPU 是否達到 50% 或更多?
當問題發生時,perfmon 報告空白,我想這意味著它不能由任何簡單的程序引起,並且必須是核心或驅動程序中的問題……?
從進一步分析看來,問題與
Process
,即以下計數器在凍結之前急劇上升:
- 每秒分頁錯誤
- 每秒輸入/輸出數據操作
- 每秒輸入/輸出讀取操作的字節數
- 每秒輸入/輸出讀取操作
但是在 PerfMon 數據中找不到任何有關導致此問題的過程的資訊。
找了幾個找麻煩的人選:1E NightWatchman, 1E WakeUp Agent, Realtek Audio Service, AVG Service,有選擇的去試試
到目前為止,我還沒有找到根本原因,但是禁用了以下服務的電腦:
- 1E 守夜人
- 1E 喚醒代理
現在凍結問題的數量為零。在禁用這些服務之前,它們偶爾會凍結。
Input/output data operations per second
在凍結髮生之前,這些服務在 perfmon 中的上升。
當我需要“調試”系統故障時,我在這裡編寫了這個腳本來獲取一些程序數據。它將在等待程序退出的 powershell 會話中創建一個後台作業
它獲取工作站上執行的每個程序的所有 GDI 對象、句柄、RAM 等資訊。也許你可以嘗試用這個來捕捉導致失敗的過程。
我猜由於電腦當機,explorer.exe 程序沒有響應。因此,只要 explorer.exe 響應屬性不正確,我們就會觸發 get-data 腳本。
只需在您想要的任何工作站上的 powershell 會話中啟動此腳本。它將通過通知托盤中的氣球文本視覺化失敗。如果您想要郵件通知,只需
Send-Mailmessage
在Get-MachineData
Part 後面加上一個。您可以在後台作業執行時使用 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