【问题标题】:Powershell memory usage - expensive?Powershell 内存使用 - 昂贵?
【发布时间】:2021-11-21 02:08:18
【问题描述】:

我是 powershell 新手,但编写了一些在 windows2003 服务器上运行的脚本。它绝对比 cmd 脚本更强大(可能是因为我有编程背景)。但是,当我进一步研究时,我注意到:

  1. 启动的每个脚本都将在 1 个 powershell 进程下运行,即。 您会看到每个脚本都有一个新的 powershell 进程。
  2. 我测试的内存脚本非常简单,比如说,构建一个 字符串或查询环境变量,然后 Start-Sleep 60 秒,所以没有什么需要(至于内存使用)。但是每个过程都需要 大约> 30MB。叫我小气,但因为有内存密集型 计划每天运行的应用程序,如果我需要安排一个 很少有 powershell 脚本可以定期运行,也许还有一些脚本 作为服务连续运行,我当然会尽量保持记忆 消费尽可能低。

我还没有接触过 C#,但有人会认为有时用 C# 编写任务可能会更好吗?

同时,我看到有关 powershell 内存泄漏的帖子。我是否认为脚本创建的内存将占用powershell的进程空间,因此当脚本终止因此powershell终止时,创建的内存会被清除?

【问题讨论】:

  • 如果您编辑您的问题以包含可重现的案例,例如示例脚本、它如何启动的详细信息以及您如何确定内存使用情况,这将对 PS 专家有所帮助。祝你好运。

标签: powershell


【解决方案1】:

我的 PowerShell.exe 2.0 本身(不运行脚本)在 XP 上约为 30MB。如今,您不必担心每台机器的平均内存。关于内存泄漏,在某些情况下,人们使用 3rd 方库时会在对象未正确处理时发生内存泄漏。要解决这些问题,您必须使用[gc]::Collect() 手动调用垃圾收集器,但这很少见。其他时候,我看到人们使用Get-Content 读取一个非常大的文件并在使用它之前将其分配给一个变量。这也将占用大量内存。在这种情况下,您可以使用管道一次读取文件部分以减少内存占用。

【讨论】:

  • 当您可以流式处理工作时,PowerShell 的工作效率最高,即一次对一个项目进行操作,而不是将所有项目存储在一个变量中以备后用(如本答案中所指出的那样)。即使在流式传输场景中,您也必须注意某些无法流式传输的 cmdlet,例如指定 -AutoSize 参数的 Sort-Object、Group-Object 和 Format-Table。
  • @KeithHill 提出了一个很好的观点,因为 Keith 提到的 cmdlet 类型需要先从管道接收所有数据,然后才能处理它,所以即使 Get-Content 能够处理一次文件部分并通过管道流式传输,像 Sort-Object 这样的 cmdlet 将需要缓冲所有可能导致内存不足错误的传入数据。
【解决方案2】:

1 - 是的,创建了一个新进程。运行 cmd 脚本、vb 脚本或 C# 编译的可执行文件时也是如此。

2 - 加载 powershell 主机和运行时将占用一些重要的内存量,这会因系统和版本而异。它通常是一个比 cmd shell 或专用 C# exe 更重的进程。对于那些 MB,您将获得使 Powershell 如此强大的丰富运行时和库支持。

一般cmets:

  • 操作系统为每个进程分配内存。一旦一个进程终止,它的所有内存都会被回收。这是任何现代操作系统的一般设计,并不特定于 Powershell 甚至 Windows。
  • 如果您的团队在硬件上运行关键业务应用程序,以至于少数 30MB 进程可能导致灾难性故障,那么您的问题就更大了。打开浏览器并访问 Facebook 会消耗更多内存。
  • 在您想出一些晦涩难懂的批处理脚本解决方案的时间里,您可能可以在 Powershell 中创建一个更好的解决方案,并且您的公司可以负担得起新的专用硬件并节省计费时间 :-)
  • 您应该使用最适合该工作的工具。 Powershell经常是正确的工具,但并非总是如此。它非常适合在 Windows 环境中自动执行管理任务(文件处理、使用 AD、计划任务、设置权限等)。对于高性能、大量算法任务或针对原始 .NET API 的复杂编码,它不太适用。对于这些任务,C# 会更有意义。
  • Powershell 得到了 Microsoft(以及一个庞大的用户社区!)的大力支持/支持,而且很明显,它是未来 Windows 的首选脚本环境。适用于 Windows 的所有新服务器端技术都支持 powershell。如果您在 admin/IT 工作,那么在 Powershell 中培养一些技能将是一项明智的投资。我绝不会劝阻某人学习 C#,但如果您的角色更多是 IT 而不是开发人员,那么 Powershell 将更经常成为正确的工具,并且您的同事也更有可能理解它。

【讨论】:

  • "...你需要花费一些时间来找出一些神秘的批处理..." -- EVERY 编程解决方案在您不熟悉时都是“神秘的” ,包括 PowerShell 脚本。当您知道如何做时,每个编程解决方案都不再是晦涩难懂的(或解决耗时的)。
【解决方案3】:

Powershell 需要比 cmd 更多的资源 (RAM),因此如果您只需要快速简单的东西,那么使用 cmd 会更有意义。

CMD 使用本机 Win32 调用,而 Powershell 使用 .Net 框架。 Powershell 需要更长的时间来加载,并且会比 CMD 消耗更多的 RAM。

“我监视了一个执行 Get-ChildItem 的 Powershell 会话。它增长到 几分钟后,2.5GB(全部为私人内存),几乎没有完成。带有小回滚缓冲区的 CMD “dir /o-d” 在大约 2 分钟内完成,并且从未占用超过 300MB 的 记忆。”

https://qr.ae/pGmwoe

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-08
    • 1970-01-01
    • 2016-10-26
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    • 2018-09-26
    相关资源
    最近更新 更多