Win32_Printer 远程 WMI 查询真的很慢

Posted

技术标签:

【中文标题】Win32_Printer 远程 WMI 查询真的很慢【英文标题】:Win32_Printer remote WMI query really slow 【发布时间】:2015-04-20 09:24:54 【问题描述】:

我正在尝试更新远程服务器上某些打印机的一些信息。我需要更新位置、评论和端口等内容。我有一个可行的解决方案,但我发现它很慢,我想知道是否有人知道原因。

我通过 WMI 从服务器获取打印机(以及后来的端口),代码如下:(这是测试代码)

var test = DateTime.Now;
ManagementScope scope3 = new ManagementScope("\\\\printserver\\root\\cimv2");
scope3.Connect();
SelectQuery q3 = new SelectQuery("select * from Win32_Printer WHERE Name = 'printername'");
ManagementObjectSearcher search3 = new ManagementObjectSearcher(scope3, q3);
var printers3 = search3.Get();
foreach(var p in printers3)

    //do stuff with printer here.

var test2 = DateTime.Now.Subtract(test).TotalSeconds;

完成后,test2 将包含“33.something”秒。 如果我在没有 where 子句的情况下执行此操作,则将花费几乎相同的时间。诚然,这台服务器上有将近 1500 台打印机,但我觉得我应该能够以更快的方式查询一台特定的打印机,而且我不明白为什么在打印机名称上带有 where 子句的查询需要相同时间作为“全选”查询。

有什么建议吗?

--

更新

如下所示,我尝试多次运行相同的查询。仍然需要相同的时间。我觉得很奇怪,当我搜索特定打印机时,Windows 需要“触摸”系统上的每一台打印机。

【问题讨论】:

本地运行查询需要多长时间? 几乎一样。通过网络运行时显然会出现一些网络延迟,但没有明显的速度增加 像这样的特殊情况可能是拥有一个微服务的一个很好的理由,它 1 缓存查询以获得更快的响应,2 为您处理更新 不是 C# 问题,而是操作系统问题。 【参考方案1】:

诚然,这台服务器上有将近 1500 台打印机

这当然是令人讨厌的小细节。每台打印机需要 33 / 1500 = 0.022 秒。在计算机中,这是一个相当神奇的数字,大约需要多长时间才能打开主轴磁盘上的文件。

您可以执行一个简单的测试来检查磁盘是否确实是瓶颈。只需在慢速查询之后再次运行您的查询。文件信息现在将缓存在文件系统缓存中,它应该在不到一秒的时间内执行。您可能已经这样做了,用您发现的内容更新您的问题。

当然,您在软件中对此几乎无能为力。服务器需要更好的硬件来让您满意。 SSD 非常好,应该可以将速度提高 20 倍。更多的 RAM 可以提供帮助,但不是黄金解决方案。更频繁地戳服务器以便将文件数据保存在缓存中是一种解决方法,对服务器不是很友好。

【讨论】:

以上是关于Win32_Printer 远程 WMI 查询真的很慢的主要内容,如果未能解决你的问题,请参考以下文章

WMI Win32_Printer 未显示在 =>控制面板\所有控制面板项\设备和打印机中

是否可以在远程计算机上为 MicrosoftTPM 命名空间查询 WMI? [对 Win32_Tpm 类的远程 WMI 查询失败,HRESULT 0x80041013]

使用 Wmi win32_Process 执行远程进程 - 获取进程的标准输出

使用应用程序池标识在 IIS 上的 ASP.NET 中查询 Win32_Printer 时权限被拒绝

WMI 访问被拒绝问题

授予远程用户(非管理员)使用 WMI 和 C# 在命名空间 cimv2 中枚举 Win32_Service 服务的能力