我们在 Windows 域中拥有多台 Windows 7 x64 笔记本电脑 Dell Latitude E5550。大约 1-2(-3?)周前,所有笔记本电脑开始在一天内随机冻结数次,每次持续几秒钟。
冻结意味着 Windows 完全没有响应,数字锁定灯切换工作一段时间,然后也停止工作,然后再次正常响应。整个过程相当随机地重复,冻结持续时间从几秒到最多约 20-30 秒。
我们尝试卸载有问题的 KB3114717,但没有任何改善。使用 AVG 防病毒软件、Office 2013、Windows 7 x64。
我知道这不足以给出任何答案,但是是否有像 Sysinternals ProcessMonitor 中的设置或过滤器可以让我查看是否有东西达到了 50% 或更多的 CPU 使用率?
当问题发生时,perfmon 报告空白,我认为这意味着它不可能由任何简单的过程引起,而一定是内核或驱动程序中的问题......?
进一步分析表明,问题与有关Process
,即在冻结之前,以下计数器急剧上升:
- 每秒页面错误数
- 每秒输入/输出数据操作数
- 每秒输入/输出读取操作的字节数
- 每秒输入/输出读取操作数
但是在 PerfMon 数据中无法找到有关导致此问题的过程的任何信息。
发现几个麻烦制造者:1E NightWatchman、1E WakeUp Agent、Realtek Audio Service、AVG Service,有选择地尝试一下
答案1
我在这里编写此脚本是为了在需要“调试”系统故障时获取一些进程数据。它将在 powershell 会话中创建一个后台作业,等待进程退出
它获取工作站上运行的每个进程的所有 GDI 对象、句柄、RAM 等信息。也许您可以尝试使用此方法捕获导致故障的进程。
我猜想,由于计算机冻结,explorer.exe 进程没有响应。因此,只要 explorer.exe 的 Responding 属性不为真,我们就会触发 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
答案2
我到目前为止还没有发现根本原因,但是计算机禁用了以下服务:
- 1E 守夜人
- 1E 唤醒代理
现在没有出现任何冻结问题。在禁用这些服务之前,它们偶尔会冻结。Input/output data operations per second
在发生冻结之前,这些服务的 perfmon 性能会有所提高。