SSIS 2019 AutoAdjustBufferSize 导致缓冲区分配错误

SSIS 2019 AutoAdjustBufferSize causes buffer allocation error

为了提高我的 ETL 性能,我在我的数据流任务中启用了“AutoAdjustBufferSize”属性。 但是,它没有为我需要的内存分配足够的缓冲区。

查看 SSIS 告诉我的内容...

Information: The buffer manager failed a memory allocation call for 1954545664 bytes, but was unable to swap out any buffers to relieve memory pressure. 2 buffers were considered and 2 were locked. Either not enough memory is available to the pipeline because not enough are installed, other processes were using it, or too many buffers are locked.

Information: Buffer manager allocated 1864 megabyte(s) in 1 physical buffer(s).

Error: The system reports 36 percent memory load. There are 34156761088 bytes of physical memory with 21535158272 bytes free. There are 4294836224 bytes of virtual memory with 1996070912 bytes free. The paging file has 39257034752 bytes with 24542248960 bytes free.

关于这个的几个问题:

  1. 为什么这里只允许2个缓冲区? (最大缓冲区行设置为 1048576)
  2. 为什么它说它分配了它说它不能分配的相同字节?

注意事项:

SSIS 告诉您它遇到了 RAM 压力,请求 19+ GB 的 RAM 无济于事,然后尝试换出一些使用的缓冲区。但是,从 2 个当前缓冲区中,所有 2 个都是 used/locked,并且不能换出。
原因可能是您的设置 AutoAdjustBufferSize=true,它允许相当广泛地增加数据流缓冲区,绕过 max buffer sizemax buffer 指定的上限行 设置。这就是缓冲区超出限制的原因。这样做的主要目的是以更高的 RAM 利用率为代价加快数据处理速度。当您的数据可以通过数据流任务快速流动时没问题,但如果不是这种情况 - 您可能会收到上面提到的错误消息。
建议 - 设置 AutoAdjustBufferSize=false 并试验不会增加此类错误的缓冲区大小。

我不同意@Ferdipux 的说法"bypassing upper limit specified by max buffer size and max buffer rows"。它会绕过最大缓冲区大小,但不会绕过最大缓冲区行数。

我会引用官方MS statement

The data flow engine begins the task of sizing its buffers by calculating the estimated size of a single row of data. Then it multiplies the estimated size of a row by the value of DefaultBufferMaxRows to obtain a preliminary working value for the buffer size. If AutoAdjustBufferSize is set to true, the engine data flow engine uses the calculated value as the buffer size, and the value of DefaultBufferSize is ignored.

基于同一站点,最大 SSIS 缓冲内存为 2GB。您的消息说 2 个缓冲区,可能是因为您有 2 个任务。这意味着每个任务最多可以有 1GB 的缓冲区。

您必须计算您的行大小(请参阅 this blog)并基于此决定您的最大行数。看起来你的 table 很宽。

例如:
您的行大小为 1000 字节。
2147483647 / 1000 字节 = 2147483.647
2147483.647 / 2 个任务 = 1073741.8235
所以为了安全起见,将它四舍五入到 1 070 000 行。