我的客户有一个在 ESXi 5.1 下运行的虚拟 Server 2008 R2 终端服务器。
该服务器已投入生产约 4 个月,登录用户会遇到间歇性缓慢/无响应的情况。出现此问题时,iexplore.exe
进程(32 位和 64 位)占用的 CPU 和 RAM 非常高。
屏幕截图:Windows 任务管理器:“进程”选项卡
屏幕截图(与第一张屏幕截图的拍摄时间不同):Windows 任务管理器:“性能”选项卡
(这两张截图是在不同时间拍摄的)
关于如何永久解决此问题有什么想法吗?
我们有许多供客户使用的终端服务器,但这是我们在 VMware 下部署的第一个 TS。我们的其他终端服务器要么在 XenServer 下,要么在物理上。这可能是 VMware 的问题吗?
答案1
所以你是说,在相同的工作负载下,客户操作系统会根据其所运行的虚拟机管理程序而使用明显不同的内存量?我不这么认为……
我发现一个明显的问题是,Internet Explorer 显然是终端服务器上使用频率很高的应用程序,但是,您使用的是 32 位和 64 位 Internet Explorer 实例的混合版本。问题在于,当多个会话启动同一个应用程序时,通常对终端服务器有益的读写时复制内存和其他共享内存技术会失去这些优化技术;它们无法在 32 位和 64 位版本之间共享。如果您将所有用户标准化为 32 位或 64 位 Internet Explorer,您的总体内存使用量将会减少。
运行应用程序
用户登录后,将为用户显示桌面(或单应用程序模式下的应用程序)。当用户选择要运行的 32 位应用程序时,鼠标命令将传递到终端服务器,终端服务器将选定的应用程序启动到新的虚拟内存空间(2 GB 应用程序,2 GB 内核)。终端服务器上的所有进程将尽可能在内核和用户模式下共享代码。为了实现进程之间的代码共享,Windows NT 虚拟内存 (VM) 管理器使用写时复制页面保护。当多个进程想要读取和写入相同的内存内容时,VM 管理器将为内存区域分配写时复制页面保护。进程(会话)将使用相同的内存内容,直到执行写入操作,此时 VM 管理器将物理页面框架复制到另一个位置,更新进程的虚拟地址以指向新的页面位置,然后将页面标记为读/写。写时复制对于在终端服务器上运行的应用程序非常有用且高效。
当基于 Win32 的应用程序(例如 Microsoft Word)由一个进程(会话)加载到物理内存中时,它会被标记为写时复制。当新进程(会话)也调用 Word 时,图像加载器只会将新进程(会话)指向现有副本,因为应用程序已加载到内存中。当需要缓冲区和用户特定数据(例如,保存到文件)时,所需的页面将被复制到新的物理内存位置,并标记为单个进程(会话)的读/写。VM 管理器将保护此内存空间不受其他进程的影响。但是,大多数应用程序都是可共享代码,无论运行多少次,物理内存中都只有一个代码实例。
> 在终端服务器环境中运行 32 位应用程序是更好的选择(但不是必须的)。32 位应用程序 (Win32) 将允许共享代码并在多用户会话中更高效地运行。 Windows NT 允许 16 位应用程序 (Win16) 在 Win32 环境中运行,方法是为每个 Win16 应用程序创建一个基于 MS-DOS 的虚拟计算机 (VDM)。所有 16 位输出都转换为 Win32 调用,然后执行必要的操作。由于 Win16 应用程序在其自己的 VDM 中执行,因此无法在多个会话中的应用程序之间共享代码。Win16 和 Win32 调用之间的转换也会消耗系统资源。在终端服务器环境中运行 Win16 应用程序可能会消耗比基于 Win32 的同类应用程序多一倍的资源。