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. 从零开始的Spring Boot(6、Thymeleaf内置对象及表达式大全)

    1.1 基础对象 #ctx:上下文对象 ${#ctx.locale} ${#ctx.variableNames} ${#ctx.request} ${#ctx.response} ${#ctx.ses ...

  2. java并发编程系列原理篇--JDK中的通信工具类Semaphore

    前言 java多线程之间进行通信时,JDK主要提供了以下几种通信工具类.主要有Semaphore.CountDownLatch.CyclicBarrier.exchanger.Phaser这几个通讯类 ...

  3. Linux 半连接队列,全连接队列

    socket 中 listen api中参数backlog指定的是 全队列大小 accept api是从全队列中获取, 没有就阻塞了, 直到有新连接进来. listen中指定的值大小,有一个最大上限, ...

  4. Laya 吐槽日志.

    新换了一个公司,公司有两个产品都是用的laya, 一个as写的2D游戏, 一个ts写的3D游戏 as写小游戏,各种不舒服啊,  一堆 __JS这样的代码,   体验极差. laya IDE 按钮只能做 ...

  5. hdoj3791

    题目: Problem Description 判断两序列是否为同一二叉搜索树序列   Input 开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束.接下去 ...

  6. 看了Java的Class的源码,我自闭了

    java源码之Class ​ 源码的重要性不言而喻,虽然枯燥,但是也有拍案叫绝.这是我的源码系列第二弹,后续还会一直更新,欢迎交流.String源码可以看我的Java源码之String,如有不足,希望 ...

  7. Mybatis各语句高级用法(未完待续)

    更多的语法请参考官网 http://www.mybatis.org/mybatis-3/dynamic-sql.html# 环境:MySQL5.6,jdk1.8 建议:所有的参数加上@Param re ...

  8. 【解读】TCP粘包拆包

    一.TCP粘包.拆包图解 假设客户端分别发送了两个数据包D1和D2给服务端,由于服务端一次读取到字节数是不确定的,故可能存在以下四种情况: 1)服务端分两次读取到了两个独立的数据包,分别是D1和D2, ...

  9. Javascript的单线程和异步编程

    运行时概念 下面的内容解释了一个理论上的模型.现代 JavaScript 引擎着重实现和优化了描述的几个语义. 可视化描述 栈 函数调用形成了一个栈帧. function foo(b) { var a ...

  10. 计算机网络之DDOS

    1.什么是DDOS DDOS(Distributed Denial of Service),中文意思为“分布式拒绝服务”,就是利用大量合法的分布式服务器对目标发送请求,从而导致正常合法用户无法获得服务 ...