语境
我在工作中使用并管理* Windows 服务器。它用于最多 5 个用户通过 RDP 同时进行常规计算。该服务器有 128GB 的 RAM,足以满足我们在其上进行的工作(主要是 Python 和 MATLAB 中的数据整理)。但是,由于用户脚本中的错误(例如错误的数组初始化、忘记删除变量),其中一个进程有时会占用几乎所有内存。
发生这种情况时,所有 RDP 连接都会断开,服务器将无法控制,直到内存使用量减少或服务器重新启动。后者是最后的手段,因为这会导致所有用户的数据丢失。我不确定在发生这种“崩溃”之前确切的内存阈值是多少,但它在 97% 左右。
我尝试过的事情
有效的命令
当服务器负载很重时,我仍然可以通过以下命令获得响应
ping
:正常工作tasklist /s servername
:返回数据,但速度很慢。它确实允许我找到有问题的 PID 和会话 ID。Enter-PSSession servername
:有效,但要过很长时间才能开始会话
无效的命令
我尝试了下面的命令来终止有问题的进程并重新获得控制权。不幸的是,这些命令在 10-15 分钟内都没有起作用。
taskkill /s servername /pid pid /f
:不执行任何操作,并在 10-15 分钟后停止,并显示有关内部错误的消息pskill \\servername pid
:不执行任何操作,手动停止logoff sessionID /server:servername
:不执行任何操作,手动停止shutdown /m \\servername /r /f
:返回输入的计算机名称无效或目标计算机不支持远程关机
事实并非如此,因为当服务器没有过载时该命令才有效。
问题
当服务器内存占用约为 97% 且不响应上述命令时,如何快速终止占用内存的进程?
* 公司 IT 负责总体管理服务器,但我负责管理定期更新、用户管理和软件安装。
答案1
这听起来像是内存泄漏,需要通过更新有问题的软件来诊断/解决。
在此之前,您可以尝试一些方法来控制它。
如果您已确定问题的根源,则可以设置以 SYSTEM 身份运行的计划任务,以最小干扰的间隔/时间终止/重新启动有问题的进程/服务。
最近,在处理由我们的防病毒产品导致内存不足的类似情况时,我还注意到远程管理工具无法连接。在运行 SCCM 或 SCOM 等产品时,您仍然可以通过这些代理传递命令。
另一个可行的选择是使用 Win32_Process 类上的 PowerShell Get-WmiObject Terminate() 方法来终止远程进程。
有一篇很棒的文章演示了如何使用 WMI 来实现这一点这里。