Windows分页文件设置不当导致SQL Server服务被终止

文章说明

在正式开始验证和测试之前,先介绍Windows分页文件和SQL Server的动态内存管理。下面测试将分为两种测试场景:场景一:分页文件为0MB,场景二:分页文件大小自动管理。

  • Windows 分页文件作用

分页文件是在硬盘上可选的隐藏系统文件。分页文件由Windows将虚拟的内存地址自动转换为真实的内存地址,功能如下:

  1. RAM的物理扩展,系统可以从物理内存中删除不经常访问的已修改页面,让系统更高效地为更频繁访问的页面更高效地使用物理内存。

  2. 应用程序要求,使用页面文件,以确保数据库缓存可以在其他服务或应用程序请求内存时释放内存。

  3. 对系统故障转储的支持,用于 "后退" (或支持)系统崩溃转储,并延长系统提交的系统所支持的内存量(也称为 "虚拟内存")。

系统提交内存限制是 "物理内存" 和 "所有页面文件" 组合的总数,它表示系统可以支持的最大系统提交的内存,如果系统可以支持的最大系统提交的内存达到系统提交限制,系统和进程可能无法获取提交的内存。

当系统支持的最大提交内存达到系统提交内存限制的90% 时,分页文件设置为自动管理大小时,系统管理的页面文件会自动增长到物理内存或 4 GB (越大)的三倍。

分页文件的大小需要考虑包括系统的稳定性、应用程序类型、业务高峰期消耗的系统提交内存大小、页面数量访问次数多个方面。分页文件的最小需要配置为200MB才能完成系统故障转储(内核层面)。分页文件大小默认配置为自动,当系统提交内存超过限制的90%,每次增长3倍的物理内存大小或者4GB(在磁盘空间允许的情况下)。

  • SQL Server如何动态管理内存

SQL Server的内存管理围绕着两个目标:

  1. 防止缓冲池过大,从而导致操作系统层面出现内存不足。

  2. 尽量增加缓冲池大小,尽量减少产生数据库文件的物理I/O。

SQL Server的缓冲池是占用最多内存也是最主要的部分,由 min server memorymax server memory 参数控制整个SQL Server能够使用内存的上限和下限。启动服务时,缓冲池不立即获取 min server memory 中指定的内存量,只需要小部分的内存进行初始化,随着压力增大而慢慢获取内存,不会超过 max server memory 的限制,但在达到min server memory 之前,并不会释放内存。

如果为 min server memorymax server memory 指定相同的值,则一旦分配给数据库引擎的内存达到该值,数据库引擎将停止为缓冲池动态释放和获取内存。

测试环境

  • 测试服务器配置

OS版本:Windows Server 2008 R2

DB版本:SQL Server 2008 R2

CPU:4 vCPU,每CPU 4核,共16个CPU

内存大小:8GB

  • 测试数据库配置

最大内存限制:0MB

测试数据库:tpcc,simple模式

  • 压测工具及性能统计信息

压测工具:HummerDB 3.3,压测一小时

性能数据收集方式:性能计数器,15秒收集一次,收集一个半小时。使用PAL分析结果

本次测试不关注TPC-C的事务计数,只关注Windows虚拟内存和SQL Server服务及内存使用情况

  • 测试参数

使用 HummerDB 创建压测数据,并进行压测

  • Schema Build

    Number of Warehouses:160 #仓库数量,建议为每个 CPU 创建 10 到 100 个仓库

    Virtual User to Build Schema:10 #创建方案的虚拟用户数,介于客户端 vCPU 的 1 到 2 倍之间

  • Driver Script

    TPC-Driver Script:Timed Test Driver Script #定时测试驱动程序脚本

    Minutes of Rampup Time:5 #预热5分钟

    Minutes for Test Duration:60 #测试持续时间60分钟

  • Virtual User

    Virtual Users:320 #用于压力测试的虚拟用户数,TPC-C 建议采用 10 倍比例以防止行锁定

压测界面:

结果对比

计数器 测试场景一(无分页文件) 测试场景二(分页文件自动管理)

Memory % Committed Bytes

In Use

压测期间使用率达到100%

压测期间使用率平均在60%以下

Memory Pages Output/sec

无分页文件,没有换页

最高一秒换页1635次,平均每秒换页19次

Memory Pages Input/sec

没有分页文件,但却有读入接近600

读入在250以下

Paging File % Usage

在2%左右,按照分配8GB,使用1.2GB

SQLServer:Buffer Manager\

Lazy writes/sec

压测期间,最高每秒写120次

在测试结束后,最高每秒写200次

SQLServer:Buffer Manager\

Free pages

压测期间最低388个可用页

压测开始直线下降,可用也最低187个

计数器说明:

  1. Memory % Committed Bytes In Use:提交内存指的是需要在分页文件中为其保留的空间(RAM和所有页面文件),如果提交内存超过了提交内存限制(持续100%),说明可能发生了内存泄露。
  2. Memory Pages Output/sec:当物理内存不足时,Windows将更多页面写到分页文件以释放空间。
  3. Memory Pages Input/sec:当进程引用无法在RAM中找到虚拟内存中的页时,需要从磁盘读取多个页面到RAM中。
  4. Paging File % Usage:页面文件使用率
  5. SQLServer:Buffer Manager\Lazy writes/sec:Lazy write进程释放缓冲池中最近最少使用的页,并将脏页标识为“干净的”,从缓冲池写入到磁盘,释放缓冲池空间。如果SQL Server需要更多的内存,且缓冲池小于max server memory,Lazy write进程会频繁地释放缓冲池中的页,通常它都是在20秒以下,最好接近0。
  6. SQLServer:Buffer Manager\Free pages:指的是缓冲池中所有可用地页数量,每个页8KB,一般不小于640个页。

结果分析

  • 测试场景一(无分页文件)

    间隔1分钟,从数据库上查询会话请求信息:

    执行SQL语句报错:System.OutOfMemoryException,已经没有足够的内存可以继续执行查询语句

    -------------------------------------------------------------观察测试过程----------------------------------------------------------

    从12:14开始,系统类型的事件中,频繁出现事件ID 2004的报警:Windows 成功诊断出虚拟内存不足的情况。

    直到12:42,SQL Server服务已经被意外停止。

    结果:SQL Server数据库持续长时间高负载,如果遇到高峰期,SQL Server一直需要更多的内存,Lazy write进程频繁地释放内存,但操作系统没有允许换页,使操作系统层面提交内存长时间使用率达到100%。压测了1个小时,在第30分钟的时候,操作系统出现内存泄漏,导致SQL Server服务被终止。

  • 测试场景二(分页文件自动管理)

    会话数一直稳定可查询

    操作系统日志没有任何报错,之前测试场景的报错(ID 2004)没有再发生了。

    结果:SQL Server数据库持续长时间高负载,Lazy write进程频繁地释放内存,操作系统允许SQL Server进行换页,使操作系统层面提交内存长时间使用率保持在60%以下,操作系统没有出现内存泄漏。压测一个小时,SQL Server服务运行正常。

Windows分页文件设置不当导致SQL Server服务被终止的更多相关文章

  1. Windows 不能在 本地计算机 启动 SQL Server 服务 错误代码126

    本文转自:http://www.cnblogs.com/yuerdongni/archive/2012/08/18/2645140.html 在使用SQL2005(或2008)是可能会遇到错误提示: ...

  2. SogouCloud.exe进程导致SQL Server服务无法启动

    早上打开笔记本想开启SQL Server服务时报错,于是根据提示查看windows日志: 依次点开报错发现第一条是1433端口被占用,于是找相关的进程: 于是杀掉此进程: taskkill /pid ...

  3. 修改Windows帐户密码,导致Sql Server 2000无法启动

    修改Windows帐户密码,导致Sql Server 2000无法启动. --现象以管理员或同等权限用户登录 Windows XP,建立 Sql Server 2000 数据库.之后,在修改此 Win ...

  4. c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程

    c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...

  5. windows不能在本地计算机启动SQL Server(MSSQLSERVER)

    windows不能在本地计算机启动sql server 在登录数据库的时候,发现数据库不能登录,提示[无法连接到实例],很明显这是因为数据库服务没有启动导致的,我们打开[服务]启动相应的SQL数据库服 ...

  6. 服务器重启可能会导致SQL Server中部分数据库变为single user mode

    今天检查公司生产服务器的SQL Server数据库,惊讶的发现有三个生产数据库变为了single user mode.奇怪的是没有任何人和程序执行过SQL语句将这三个数据库设置为single user ...

  7. 设置与使用SQL Server的字符集(Collation,即排序规则)

    目录 目录 正确认识SQL Server的字符集 选择合适的SQL Server字符集 错误使用SQL Server的字符集 参考资料 正确认识SQL Server的字符集 SQL Server作为一 ...

  8. win7(windows 7)系统下安装SQL2005(SQL Server 2005)图文教程( Win7 SQL Server2005 安装教程)

    win7(windows 7)系统下安装SQL2005(SQL Server 2005)图文教程 由于工作需要,今天要在电脑上安装SQL Server 2005.以往的项目都是使用Oracle,MS的 ...

  9. 更改Windows系统的密码之后,SQL Server 2008服务无法启动

    问题:更改Windows操作系统的密码之后,SQL Server 2008服务无法启动. 原因:SQL Server服务需要使用操作系统的某个登录账户. 解决:需要在服务的属性窗口中修改账户密码,然后 ...

随机推荐

  1. 驱动开发 —— 从零开始(1) 配置vs20xx+wdkxx环境

    网上教程很多.如何去安装如何去配置 但是也有些坑感觉并不是那么的完善 wdk+vs下载链接:https://docs.microsoft.com/zh-cn/windows-hardware/driv ...

  2. PyQt中QThread多线程的正确用法【待完善】

    先贴几篇有意思的讨论 https://www.qt.io/blog/2010/06/17/youre-doing-it-wrong#commento-login-box-container https ...

  3. NASH:基于丰富网络态射和爬山算法的神经网络架构搜索 | ICLR 2018

    论文提出NASH方法来进行神经网络结构搜索,核心思想与之前的EAS方法类似,使用网络态射来生成一系列效果一致且继承权重的复杂子网,本文的网络态射更丰富,而且仅需要简单的爬山算法辅助就可以完成搜索,耗时 ...

  4. Adobe Photoshop CC 2019 下载+安装教程

    1. 安装包 链接: https://pan.baidu.com/s/1_w1SjGVjWNJ9nuTqEcaykg 提取码: xatq 2. 打开安装包 运行Set-up,选择语言,位置 ,选择继续 ...

  5. Laravel模板引擎Blade中section的一些标签的区别介绍

    Laravel 框架中的 Blade 模板引擎,很好用,但是在官方文档中有关 Blade 的介绍并不详细,有些东西没有写出来,而有些则是没有说清楚.比如,使用中可能会遇到这样的问题: 1.@yield ...

  6. C# 泛型的基本知识,以及什么是泛型?

    1.1 泛型概述 1.1.1 泛型广泛用于容器(collections) 1.1.2 命名空间System.Collections.Generic 1.2 泛型的优点. 以前类型的泛化(general ...

  7. selenium(1)-详细解读元素定位的八种方式

    安装selenium和下载webdriver 安装selenium pip install selenium pip install selenium  -U  (判断是否有最新版本) 下载drive ...

  8. json 文件注释

    json文件注释: "_comment":"this is commets", "jsondata":{ "注释":&q ...

  9. skywalking面板功能介绍2

    场景: spring-user调用spring-order 1.spring-user部署了两个应用实例 2.spring-order部署了一个实例 应用详情信息在表 从上面表中可以看出spring- ...

  10. disruptor架构二

    小故事:Disruptor说的是生产者和消费者的故事. 有一个数组.生产者往里面扔芝麻.消费者从里面捡芝麻. 但是扔芝麻和捡芝麻也要考虑速度的问题. 1 消费者捡的比扔的快 那么消费者要停下来.生产者 ...