介绍
在本文中,作者描述了在AX 2012或 R2生产环境中进行权限更改操作时,可能引发“安全缓存抖动”。 除了详细解释这种情况如何发生之外,作者还讨论了一些最佳实践,以确保在生产环境中可以避免产生“安全缓存抖动”。 最后,作者总结了关于如何创建和维护缓存的安全元数据的功能增强补丁。
症状
安全缓存抖动可能会导致许多不同的性能问题。 这个问题的常见症状是导致多个用户会话变得无响应。 最终导致AOS的内存占用激增,直至系统操作系统崩溃。
当使用SQL Server工具运行AX跟踪或监视数据库活动时,可能会观察到存储过程“XU_SecurityLoadRoles”在长期运行。 您还可能在AOS服务器的应用程序事件日志中看到“Duplicate request to load role permissions detected”的消息。
背景
在AX2012中引入的基于角色的安全性
在AX 2012中,引入了一个基于角色的新安全模型。 角色作为特权的容器,每个特权定义用户对系统的不同部分的访问级别。 这些特权可以被分到职责然后统一分配给角色,或者它们也可以单独分配
作为一组特权的容器,角色还可以:
- 包含其他角色,从而获得该“子角色”定义的所有权限
- 为单独的窗体,表和服务器方法定义自己的一组权限。
安全缓存
当用户第一次登录AX时,系统必须根据其所属的安全角色提取并授予不同权限。该过程只需要执行一次,并将其提取的信息进行缓存。 但是,为了确保用户始终被授予对系统不同功能正确的访问权限,每当进行影响安全性的更改时,必须更新高速缓存。
首先在TempDB数据库中创建高速缓存。 集中存储的缓存数据可以被其它AOS直接使用,还可以保证在重启AOS后仍然有效。 一旦缓存在数据库中构建,各个AOS将信息加载到内存中,避免对数据库的不必要的调用。
原因
在重建安全高速缓存期间,用户可能发现他们的AX客户端挂起(即变得无响应)。 如果系统需要确定用户是否具有对特定对象的访问权限,就会发生这种情况 – 在用户角色的安全权限已重新加载到数据库安全缓存中并随后重新加载到AOS内存之前,系统无法响应用户操作。 同样,如果新用户尝试登录,缓存正在重新加载这些新用户所属角色的数据,则其客户端可能在启动期间挂起。
可能影响安全缓存的操作
1.对AOT中某些具有安全属性的对象的更改
如果开发人员对这些对象中的任何一个进行更改(例如,他们向表单添加了一个新控件),则缓存将失效并且必须更新:
- Forms
- Menu items
- SSRS Reports and X++ Reports
- Web Components
- Service Operations
不建议在用户访问系统时在生产环境中实施更改。 如果遵循关于自定义的部署的最佳实践,则将避免安全缓存抖动问题。
有关这些最佳做法的详细信息,请参阅“Deploying Customizations across AX 2012 Environments”whitepaper.
2.通过系统管理模块修改角色/职责/权限
安全管理员可以通过“系统管理”模块中的窗体修改角色和其他安全对象。 例如,在安全权限窗体(系统管理>设置>安全>权限)中,管理员可以修改由特定权限授予的访问级别。
我们建议在正常工作时间不应用安全更改,以避免在用户访问系统时使安全缓存无效。
安全增强
我们已经对安全缓存刷新的机制进行了优化,以帮助减少缓存无效时对生产环境系统性能的影响。
1.缓存刷新更细化(AX 2012 R2 或 AX 2012 内核版本6.0.1108.4556)
在早期版本的AX 2012中,所有角色的整个数据库缓存将在开发人员更改安全对象后失效。这意味着每个角色的权限必须重新加载到数据库缓存中,然后重新加载到每个AOS上的内存中。对于标准的AX 2012环境,这可能需要大约5分钟才能完成。对于具有更复杂的客制化的环境,可能需要更长时间(在某些情况下,小时而不是分钟)。
缓存现在以更细粒度的方式进行刷新。缓存权限数据基于每个角色; AX识别哪些角色授予/拒绝对修改对象的访问,然后仅刷新这些角色的缓存数据。角色还单独刷新以更改角色,职责,权限和流程周期(自AX 2012 RTM以来没有更改)。但是,由于权限可以属于多个角色,更改它们可能导致缓存刷新多个角色。
2.使用AXUtil(R2 6.2.1000.749/AX 2012 6.0.1108.4556)初始化数据库缓存
我们还在AXUtil中加入了新功能,允许管理员在用户开始访问系统之前刷新数据库安全缓存。在启动AOS之前,可以在停机期间使用AXUtil命令“refreshrolecache”刷新数据库缓存并重建它们。此功能通过修补程序KB2832056 引入AX 2012 R2,该修补程序更新后的内核版本是6.2.1000.749。相同的功能也被更新到AX 2012,内核6.0.1108.4556及以上版本版本包含该功能。