PSRemoting performance overhead with get-childItem

老子叫甜甜 提交于 2019-12-22 08:25:23

问题


This completes in 2.3 minutes on LOCALSERVER:

A: measure-command {$x = invoke-command {gci -recurse "C:\"}}

This completes in 38.4 minutes on LOCALSERVER:

B: measure-command {$x = invoke-command -comp LOCALSERVER {gci -recurse "C:\"}}

Why is B so much slower? Is it because the "output is being serialized to XML and then reconstituted into objects again", as explained here, with B but not A? Or is something else going on?

LOCALSERVER runs Windows 2008R2 with PS v3. In both cases $x.count is 98973.

I was wondering about changing an existing script to use PSRemoting for file searches on remote servers. I thought the searches might finish sooner with gci running on the remote target. In a handful of tests, the searches actually ran much longer with PSRemoting. I'm asking about the loopback scenario only because it seemed like the simplest case; I saw similar results with remote servers. So I'll stick with UNC path searches like this:

gci -recurse \\REMOTESERVER\C$\folder

...unless these results seem odd, and some adjustment to my remoting configuration or syntax might offer a big performance boost?


回答1:


As you mentioned, the time required to invoke the command remotely must also take into account the time needed to deserialize any given object you return from your remote pipeline (in your case the whole tree of FileSystemInfo of the C drive). I would suggest to limit the number of objects you serialize and deserialize over the network and, while comparing performances of your servers, perhaps consider the time taken from within the machine you are running the code on:

Invoke-Command -comp LOCALSERVER { Measure-Command { gci -recurse "C:\" } }



回答2:


Somewhere in between returning full objects and just getting a string list, if the remote system is running V3, you can get a shallow deserialization via json:

ConvertFrom-Json (icm -comp server { gci -rec c:\ | convertto-json -Depth 1})

Edit:

Converting to/from csv gets you a (shallow) deserialized object, and actuall seems to run faster than out-string:

ConvertFrom-csv (icm -comp server { gci -rec c:\ | convertto-csv})



回答3:


Yes, you're correct about the overhead of serializing/deserializing the FileInfo and DirectoryInfo objects over the wire. If you don't care about getting real objects, do something like this:

icm -comp server { gci -rec c:\ | out-string }

It should be an order of magnitude faster, at least.



来源:https://stackoverflow.com/questions/16092778/psremoting-performance-overhead-with-get-childitem

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!