当我执行SSIS包时,我收到以下错误:
缓冲区管理器已分配 104,857,600 字节,尽管已检测到内存压力并且反复尝试交换缓冲区已失败。
请问您有什么建议吗?
我正在考虑增加生产实时服务器的 RAM,但现在无法重新启动实时服务器。我们计划在 7 月 18 日对服务器进行修补,因此修补后,我将增加 RAM 并重新启动服务器。同时,我想知道解决方案。
此错误与 SSIS 管理数据流内存的方式有关。 默认最大缓冲区大小为 10,485,760 字节 (10 MB)。 您的消息表明该值已增加到最大值 100 MB 或
AutoAdjustBufferSize
设置为 True
。
使用 AutoAdjust 是最佳选择,因为这样您就不需要费心使用
DefaultMaxBufferRows
和 DefaultBufferSize
来优化内存利用率,并且它将根据它在您的计算机上与其他服务器上的运行方式进行调整。 每个环境通常有不同数量的可用内存。
其他一些需要考虑的要点:
EngineThreads
属性将向SSIS建议跨源、转换和目标使用多少并行度。 因为这不允许直接控制事物的执行方式,所以通过数据流设计来管理并行性要有效得多。 也就是说,与其在一个数据流任务中拥有 10 个源和目标,不如将它们分别分成自己的数据流。 此外,不太复杂的数据流将更有效地使用内存。 考虑在数据库中而不是在 SSIS 中工作。 即暂存数据并更新数据库中的目标表,而不是使用排序、查找和 OLE DB 目标。MaxConcurrentExecutables
的控制流属性管理。 默认情况下,该值设置为 -1,这意味着处理器数量加 2。这是限制并行执行的另一种方法,这样您就不会同时触发太多数据流。 然而,将可执行任务分离到容器中并通过优先级约束将容器绑定在一起将更具策略性。现在您知道了内存是如何分配的,您可以检查您的服务器并查看它是否确实需要更多内存来支持操作系统和 SSIS。 这将是第一步,以防它非常低。 第二步是检查上述设计注意事项并优化包中的内存使用。 这样做是为了确保随着时间的推移性能并为新封装建立设计策略。