我用winrs
它来针对我正在开发的某些服务器软件运行测试客户端。我使用客户端在被测服务器上生成负载以进行分析。我运行服务器软件的机器和winrs
我运行测试客户端的机器(winrs
在第一台机器上使用)都是 Win7 机器,x64,内存很大。所有进程都以管理员身份运行。
当我手动运行测试客户端时,它可以生成 6000 个并发连接并使 100mb 链接饱和(有问题的机器有 Gb 网络,所以我只将它们之间的链接加载到大约 10%)当我通过winrs
大约一半的连接运行它时,似乎与 OpenSSL 中的内存相关的错误导致连接失败。
我确信我的测试客户端中发生了一些奇怪的事情,但了解 winrm 代表 winrs 的请求运行的进程可能存在哪些限制(如果有的话)会很有用。我找不到任何文档表明存在限制,但我可能没有仔细查找。
更新:经过进一步思考之后,似乎这些进程可能是在具有内存限制的作业对象下运行的,这有点道理,但我认为如果是这种情况,那么可以在服务器端进行配置...
答案1
是的,它是可配置的。从命令行,这将把限制设置为 500MB
winrm 设置 winrm/config/winrs @{MaxMemoryPerShellMB="500"}
在 msdn 文档中搜索“winrm 配置”以获取更多信息。
答案2
嗯,看来我是对的。Winrs 执行的命令是在作业对象内部运行的,而作业对象受到限制。
这是一个用于转储这些作业限制的简单程序,它显示了在我的一台 Windows 7 机器上执行的一个进程。
Job report for process: 10676
Process IS in a job
Flags: 0x2b08 -
JOB_OBJECT_LIMIT_ACTIVE_PROCESS
JOB_OBJECT_LIMIT_PROCESS_MEMORY
JOB_OBJECT_LIMIT_JOB_MEMORY
JOB_OBJECT_LIMIT_BREAKAWAY_OK
JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE
ActiveProcessLimit: 15
Affinity: 0x0
MaximumWorkingSetSize: 0
MinimumWorkingSetSize: 0
PerJobUserTimeLimit: 0
PerProcessUserTimeLimit: 0
PriorityClass: 32
SchedulingClass: 5
JobMemoryLimit: 157286400
ProcessMemoryLimit: 157286400
导致我出现问题的限制是下面两个。内存限制。我仍然不知道这些是否可以按机器或按用户配置,或者根本无法配置……
好消息是该作业已JOB_OBJECT_LIMIT_BREAKAWAY_OK
设置,这意味着我可以简单地编写一个通过 Winrs 运行的程序启动器,它本身会运行实际的目标命令并使用该CREATE_BREAKAWAY_FROM_JOB
标志启动新进程。这会导致我的真实目标进程在 WinRs 作业限制之外运行。