繁体   English   中英

AAS:如何优化 Azure Analysis Services 实例的 memory 使用?

[英]AAS: How can I optimize the memory usage of an Azure Analysis Services instance?

语境

注意:准确地说,我在同一个 AAS 实例上有多个数据模型,但是从查看这些模型的大小以及使用情况图表来看,它们似乎并未对 memory 的使用产生任何显着影响。 因此,下面的讨论集中在对我们来说似乎与观察到的尖峰最相关的“单一数据模型”上。

我有一个数据 model 保存在 Azure Analysis Services 实例中(数据 model 本身是 azure 分析服务实例中的一个数据库)。 数据 model 本身已使用 Visual Studio 部署到 Azure Analysis Services 实例。 数据 model 基本上是使用直接来自 SQL 服务器数据库的数据创建的(查询和存储过程用于在后台创建表)。

注意:在这个数据 model 中,共有 16 个表。 最大的 2 个(由占用的 model 的百分比和其他指标定义,可以通过 DAX Studio Vertipaq Analyzer 查看)是按天划分的,每个划分总共 60 天(2022-04-11、2022- 04-12, ...) 并通过下面参考资料部分概述的分区自动化过程进行处理。 剩下的 14 个表在这个意义上没有被分区,并且每次刷新 function 触发刷新时都被“完全处理”(实际上这 14 个表中的每一个都由一个大分区组成,即整个表)。

例如:每小时,当我们的刷新函数触发时,我们的 2 个大表的最新 3 个分区被重新处理,其余 14 个表中的每一个都被完全重新处理(因为只有 1 个大分区,其中每个表 forms)。

数据 model 的刷新是使用 function 应用程序执行的,该应用程序具有刷新数据 model 中最大的 2 个表的最新 3 个日分区的功能,而其他表在刷新期间每次都被处理。

目前控制刷新执行的function每小时被触发到go关闭,在此期间它执行如上所述的数据刷新。

我们一直面临的问题是,当我们观察我们的 memory 使用情况仪表板(查看下面的屏幕截图)时,我们往往会在 memory 使用情况中出现大量峰值,这似乎发生在这个刷新阶段。

鉴于这一观察,我们开始尝试测试似乎是什么导致了这些周期性尖峰,并观察到以下有趣的点:

  • 尖峰几乎与我们的数据 model 的计划每小时刷新一致。
    • 让我们相信尖峰在某种程度上与刷新过程有关。
  • 在这些刷新之间,memory 的使用率显着下降
    • 进一步让我们相信尖峰是由刷新活动的某些部分引起的,而不是由一般使用引起的。
  • 将分区数(2 个主表的数据时间为 window)从 30 天增加到 60 天,反之亦然会导致尖峰发生明显的可见变化
    • 如果我们 go 从 30 天增加到 60 天,尖峰振幅会增加,反之则会导致它减少。
  • 执行“碎片整理过程”,如白皮书中所述,可通过“资源”部分中的链接查看,暂时减少一点使用量。
    • 就此过程的性质而言,它需要定期执行以确保持续受益。
  • 每次都完全处理的表(主数据 model 中的所有表,除了仅刷新最后 3 个每日分区的 2 个表)似乎不会对 memory 使用高峰产生很大影响。
    • 我们在刷新之间一个接一个地手动处理了一些最大的表,并没有注意到图表中的巨大跳跃。
  • 为 2 个主表刷新将 3 个按天分区减少到 3 个按小时分区似乎也没有引起大的变化。
    • 注意到 memory 使用量略有下降(每小时刷新时约 1-2GB),但影响似乎没有我们想象的那么大(与数据减少成正比)。 这让我们认为实际数据量可能不是主要问题。

截图

显示内存使用峰值行为的指标图以下是有关所用指标的更多详细信息 定义: Turqoise 线:Hard memory limit max(与我们的 AAS 层的最大缓存大小相同)。 深蓝线:最高 memory 限制最大值(我们的硬限制 Memory 的大约 80%)。 橙线:Memory 可以在以下链接中找到更多详细信息: AAS MetricsMemory Usage Forum Post

问题

根据我们的场景(如上所述),刷新期间 memory 使用高峰的原因可能是什么?我们如何才能以一种好的方式减少和/或管理它们(理想情况下完全或尽可能多地删除)? 基本上总是远低于青绿色和深蓝色线

我们认为,如果我们能弄清楚这一点,它可能会让我们保持在当前的定价层内,并且有可能让我们引入更多数据(90-120 天的分区),而不必担心点击“内存不足”健康警报我们的实例(到目前为止我们已经收到了 60 天)。

注意:除非当前每小时刷新一次,否则我们在 memory 使用量方面完全处于等级限制之内(橙色线远低于绿松石和蓝色阈值)。 因此解决这个问题可以让我们更好地利用我们的 AAS 资源

目前的想法

  • 我们确实在数据 model 中计算了列。这会导致问题吗?
    • 测试这个的最好方法是什么?

资源

将在本节中放置任何有用的文档链接。 希望可以帮助理解上下文。

请尝试在 ModelConfiguration 表中将 MaxParallelism 设置为某个较低的值,例如 2 或 3。 这将减少它一次处理的并行表和分区的数量。 仅此一项可能无法解决 memory 尖峰问题,但它应该以延长刷新时间为代价稍微降低尖峰。 如果您可以处理此权衡并且它尖峰 memory 更少,这可能是一种解决方法。

请将任何隐藏列或隐藏度量列的IsAvailableInMDX设置为 false,这些隐藏列或隐藏度量列未放在轴上或未在 MDX 查询中直接引用。 这应该会减少处理期间的 memory 占用空间,因为它不会为这些列构建属性层次结构。 在高基数列上,节省的费用可能很可观。

接下来要尝试的是将表/分区拆分为数据库中单独的 ModelConfiguration 行。 然后将其配置为依次处理一个 ModelConfiguration 和另一个。 这里的目标是在一个事务中处理一些表,在单独的事务中处理其他表。 这应该会导致每笔交易所需的 memory 使用量减少。 当然这可能会影响用户,因为第一次交易后一半数据会过时,因此您必须判断这是否可行。

更复杂的优化是横向扩展 AAS并拥有专用处理节点。 然后,您可以在完全处理之前清除 model。 那应该最大程度地减少 memory 的要求。 处理完成后,运行 Synchronize 命令。 您甚至可以缩减删除处理节点以节省每小时 rest 的成本。

另一个要考虑的选项是将模型部署到 Power BI Premium Gen2。 Gen2 非常有趣的细微差别是 P1 容量允许每个数据集高达 25GB,这与 Gen1 和 AAS S1 不同,后者所有数据集的总和必须小于 25GB。 如果您的组织已经拥有 Power BI Premium 容量,这应该是一个不错的选择。 如果不是,那么目前成本可能没有意义。 或者,您可以为每位用户授予 Power BI Premium 每用户许可证,并将 model 部署到该 Premium 每用户容量。 如果您的用户少于 70 人,这可能是您可以尝试的更具成本效益的选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM