异常:

DB: SQL Server2012SP3

OS: Windows2012

一线工程师反应系统访问DB突然卡住了,DBA登录DB检查SQLServer发现DB无法登录,之前SMSS已经连接的session中无法执行任何SQL。服务器CPU使用10%,memory使用达到了99%以上。过了十分钟系统memory自己降低到了90%以下,DB可以访问。

分析:

检查SQLServer error log:

只是在一异常时间段有stack dump的记录,但没有太多有价值的信息

检查windows性能计数器:

异常时间段OS memory确实耗尽

检查windows log:

有虚拟内存不够警告,

sqlserver.exe进程使用28GB(DBA设定的DB最大内存使用量),dllhost.exe进程使用12GB

正好把服务器的32GB+虚拟内存设定的8GB占满!所以报错内存不足!!


解决:

上述dllhost.exe进程使用12GB一定存在问题,此块可能系统层面补丁或病毒相关,已交给系统工程师分析。

但是否有办法在OS内存不足时,DBA通过设定可以不影响到SQL server的正常运行呢?

答案是有的,软微官方提供锁定内存页 (LPIM) 解决方法,通过Windows 策略将确定哪些帐户可以使用进程将数据保留在物理内存中,从而阻止系统将数据分页到磁盘的虚拟内存中。这样即使OS内存不足时对SQL server的影响也会是最小了。

设定:

cmd->gpedit.msc->local computer policy->computer configuration->windows settings->security settings->local policies->user rights assignment-> Lock pages memory中加入添加 SQL Server 启动帐户

至此,锁定内存页 (LPIM)设置完成。

再持续观察一段时间,系统再没有发生系统内存不足SQLServer hang住问题。

------------------------------------------------------------------------------------------------------

以下附,软微官方文档说明:

https://docs.microsoft.com/zh-cn/sql/database-engine/configure-windows/server-memory-server-configuration-options?view=sql-server-ver15

锁定内存页 (LPIM)

此 Windows 策略将确定哪些帐户可以使用进程将数据保留在物理内存中,从而阻止系统将数据分页到磁盘的虚拟内存中。 锁定内存中的页可以在发生将内存分页到磁盘时保持服务器的响应能力。 已向有权运行 sqlservr.exe 的帐户授予 Windows 锁定内存页 (LPIM) 用户权限时,在 SQL Server Standard Edition 和更高版本的实例中将“锁定内存页” 选项设置为“打开” 。

若要对 SQL Server 禁用“锁定内存页”选项,请为有权运行 sqlservr.exe(SQL Server 启动帐户)启动帐户的帐户删除“锁定内存页”用户权限 。

设置此选项可实现根据其他内存分配器的请求扩大或缩小内存,不影响SQL Server动态内存管理。 使用“锁定内存页”用户权限时,建议按如上所述,为 max server memory 设置一个上限 。

重要

应仅在必要时设置此选项,即有迹象表明正在换出 sqlservr 进程时。在这种情况下,错误日志将报告错误 17890,类似于以下示例:A significant part of sql server process memory has been paged out. This may result in a performance degradation. Duration: #### seconds. Working set (KB): ####, committed (KB): ####, memory utilization: ##%.从 SQL Server 2012 (11.x) 开始,Standard Edition 不需要跟踪标志 845 来使用“锁定页”。

启用“锁定内存页”

启用“锁定内存页”选项:

在 “开始” 菜单上,单击 “运行” 。 在“打开” 框中,键入 gpedit.msc

将打开 “组策略” 对话框。

在 “组策略” 控制台上,展开 “计算机配置” ,再展开 “Windows 设置” 。

展开 “安全设置” ,再展开 “本地策略” 。

选择 “用户权利指派” 文件夹。

细节窗格中随即显示出策略。

在该窗格中,双击“锁定内存页” 。

在“本地安全策略设置”对话框中,添加有权运行 sqlservr.exe (SQL Server 启动帐户)的帐户 。