最近几天,笔者所在的单位中的一台WEB服务器由于负载过大出现了问题,当同时在线的用户达到一定规模(2000-3000)时,频繁出现页面响应迟缓、超时等问题。服务器采用的操作系统是Windows Server 2003企业版,数据库系统是SQL Server 2005企业版。正当大家考虑升级服务器时,笔者对服务器状态进行了分析,并最终在未增加服务器硬件条件下找到了瓶颈、解决了问题。现将分析、解决问题的过程与大家分享,希望能帮助大家解决类似的问题。

分析问题:

通过对服务器检查发现,不仅服务器的HTTP请求响应迟缓,就连在服务器本机操作和远程桌面的操作中都有明显“卡”的感觉。检查任务管理器,发现此时的CPU占用率和内存使用率并不高,没有发现制约性能的地方,可是为什么系统这么慢呢?这时,我发现了服务器的硬盘灯狂闪不止,这下发现了病因,服务器在频繁的访问硬盘,而硬盘IO响应时间和内存相比是非常高的。

利用SQL Server自带的性能工具:SQL Server Profiler,打开其性能监视器,我发现了Avg.Disk Queue Length(平均磁盘队列)和Pages/Sec(每秒读取的磁盘页面数)都很高,如图1所示,尤其是Avg.Disk Queue Length,已经达到了万级,而Pages/Sec也达到了60。正常的Avg Disk Queue Length值应该是盘阵中磁盘数量的2倍,Pages/Sec也应该维持在10以下(除了偶尔的峰值外)。

图1 SQL Server性能监视

解决问题:

看来要想完全解决问题,就要分析数据库频繁访问硬盘的原因。一般来讲,SQL Server会充分利用内存进行缓存,不会太过频繁的访问硬盘。而我们的问题是虽然负载较高,但内存使用率并不高(仅仅使用了1.8G内存)。服务器的内存总数为12G,虽然IIS与其它应用占用了一些内存,但剩余的可用内存仍然有8G左右,为什么SQL Server不充分利用内存而频繁读取硬盘呢?

这里有一个很有意思的现象,微软和我们开了个小玩笑,当通过右键点击“我的电脑”的属性时,可以发现服务器正确识别了12G内存,可这并不意味着它就能使用这么多内存。Windows Server 2003企业版和Windows XP一样都是32位操作系统,受到32位内存地址的制约,它们能使用的内存通常不会超过4G,单个进程能使用的内存甚至不能超过2G。但Windows XP的计算机属性中会老老实实地告诉我们系统只识别到3G多内存,而Windows Server 20003会识别所有内存,但实际上它默认情况下无法使用那么多内存。

通过上网查询,发现可以通过开启Windows 2003 Server的PAE功能以启用大内存支持。首先,找到C:\的boot.ini文件。在资源管理器中点击“工具”-“文件夹选项”-“查看”,在高级设置中取消“隐藏受保护的操作系统文件”,并选择“显示所有文件和文件夹”。这样我们就可以看到boot.ini文件了。用记事本打开它,找到类似于如下的行:

multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Windows Server 2003, Enterprise" /noexecute=optout /fastdetect /pae

如上面一样,在其末尾加上“/pae”选项,然后重新启动服务器,这样便启用了windows 2003 Server的大内存支持。

为了让单进程使用内存突破2G,我们还需要修改SQL Server的设置。首先应该在系统中创建一个隶属于管理员身份的用户,然后在“开始”-“运行”中输入“gpedit.msc”启动组策略编辑器。找到“计算机设置”-“windows设置”-“安全设置”-“本地策略”-“用户权限分配”,单击该节点后在右边找到“内存中锁定页面”,双击后添加刚才建立的用户。

换用刚建立的用户登录系统,点击“开始”-“程序”-“管理工具”-“服务”,找到SQL Server服务。右击“属性”,点击“登录”选项卡,选择“登录身份”为“此账户”,确定下面文本框中的用户为当前新建立的用户并输入正确的用户密码(如图2),然后重新启动SQL Server服务。这样设置的目的是让有“内存中锁定页”权限的用户来启动SQL Server进程,这是使用大内存支持的必要手段。

图2 用新账户启动SQL Server服务

重启SQL Server后,使用SQL Server Management Studio连接到数据库服务器,右键点击服务器节点,选择“属性”,在对话框中找到“内存”面板,勾选其中的“使用AWE分配内存”(如图3所示),然后按照服务器内存情况正确设置最小和最大的内存使用,单位为MB,本例中的内存设置为最小4G最大6G,设置完成后再次重新启动SQL Server,即可生效。

图3 开启AWE,设置内存使用

经过这样的设置后,单位的服务器同时在线5000人也没有再发生超时或迟缓的现象,查看SQL Server Profiler的性能监视器,其Avg Disk Queue Length和Pages/Sec也降低到0左右(除了峰值),服务器运转恢复正常。

注意事项:

1.问题的根源在于32位系统访问内存的限制,导致应用程序不能充分使用内存,如果系统是64位的话,则没有这样的问题,而在微软的32位系统中,使用大内存支持可以通过PAE来实现,但也不是说内存多大都可以用PAE访问,现在的Windows Server 2003企业版通过PAE最多可以使用32G内存,其实这对于大多数应用足够了。

2.使用PAE仅仅解决了操作系统可使用的内存问题,应用程序要想突破单进程的内存限制还必须要拥有权限“在内存中锁定页”,这也是我们为什么要建立一个账户,并对其赋权后用该账户启动SQL Server的原因,所以这一步不能省略。

3.启动PAE和AWE后,资源管理器中对于SQL Server进程的内存使用情况就不再准确了,如果想查看SQL Server究竟用了多少内存,可在SQL Server Management Studio中建立一个查询,利用如下命令“DBCC MemoryStatus”查看内存使用情况,其中“AWE Allocated”项目如果不为0的话,则说明AWE启动成功,你的SQL Server现在已经运行在大内存状态下了(如图4所示)。

图4 查看内存使用情况

基于32位Windows2003的数据库服务器优化,启用AWE,优化SQL Server的更多相关文章

  1. 问题:sqlserver 跨服务器连接;结果:Sql Server 跨服务器连接

    Sql Server 跨服务器连接 用openrowset连接远程SQL或插入数据 --如果只是临时访问,可以直接用openrowset --查询示例 select * from openrowset ...

  2. 服务器搭建域控与SQL Server的AlwaysOn环境过程(五)配置异地机房节点

    0 引言 注意点1 注意异地节点最好至少有2个AG节点,否则在本地节点进行手动故障转移的时候会出现仲裁警告,提示WSFC集群有脱机危险 在异地节点只有一个的情况下,虽然Windows2012R2有动态 ...

  3. 用户、组或角色 '' 在当前数据库中已存在。 (Microsoft SQL Server,错误: 15023)

    SQLServer2008用户组或角色'*****'在当前数据库中已存在问题的解决办法 在迁移数据库的过程中SQLServer SDE的问题 为一个数据库添加一个用户时,提示以下信息:用户.组或角色 ...

  4. [转]如何将高版本的SQL Server数据库备份到低版本的SQL Server

    本文转自:https://blog.csdn.net/wang465745776/article/details/54969676 前提条件备份SQL Server服务器版本为:12.0.2000.8 ...

  5. 用户、组或角色 'zgb' 在当前数据库中已存在。 (Microsoft SQL Server,错误: 15023)

    在使用SQL Server 时,我们经常会遇到一个情况:需要把一台服务器上的数据库转移到另外一台服务器上.而转移完成后,需要给一个"登录"关联一个"用户"时,往 ...

  6. 服务器搭建域控与SQL Server的AlwaysOn环境过程(四)配置AlwaysOn

    0 引言 这一篇才真正开始搭建AlwaysOn,前三篇是为搭建AlwaysOn 做准备的. 步骤 1.3 配置AlwaysOn 请先使用本地用户Administrator登录这两个集群节点并执行下面的 ...

  7. 服务器搭建域控与SQL Server的AlwaysOn环境过程(三)配置故障转移

    0 引言 主要讲述如何搭建故障转移集群,因为AlwaysOn是基于Windows的故障转移集群的. 在讲解步骤之前需要了解一下故障转移集群仲裁配置 下面图片来自<Windows Server20 ...

  8. 服务器搭建域控与SQL Server的AlwaysOn环境过程(一) 搭建域控服务器

    0 准备阶段 1. Windows Server 服务器 3台(其中域控服务器配置可降低一个水准,目前博主试用的是:域控服务器--2核4G 数据库服务器(节点)--4核8G ) 2. SQL Serv ...

  9. 无法将数据库从SINGLE_USER模式切换回MULTI_USER模式(Error 5064),及查找SQL Server数据库中用户spid(非SQL Server系统spid)的方法

    今天公司SQL Server数据库无意间变为SINGLE_USER模式了,而且使用如下语句切换回MULTI_USER失败: ALTER DATABASE [MyDB] SET MULTI_USER W ...

随机推荐

  1. 《 .NET并发编程实战》实战习题集 - 4 - 如何重用一次性资源

    如何重用以下一次性资源代码呢? string text; using (var stream = new StreamReader(path)) { text = stream.ReadToEnd() ...

  2. 【java】javac编译多个有依赖关系的java文件为class文件

    历史文章: [jar]JDK将单个的java文件打包为jar包,并引用到项目中使用[MD5加密] [java]javac命令在win10不可用,提示javac不是内部或外部命令,也不是可运行的程序[解 ...

  3. .net core 2.2部署到Windows Server 2012 R2 standard

    安装.net core 2.2 下载地址:https://dotnet.microsoft.com/download/dotnet-core/2.2 找到ASP.NET Core Runtime 2. ...

  4. MySql 参数赋值bug (MySql.Data, Version=6.9.6.0 沙雕玩意)

    直接将参数赋值为常量0则参数值为null,出现异常:MySql.Data.MySqlClient.MySqlException (0x80004005): Column 'PayType' canno ...

  5. C# 调用TRIO控制器ActiveX教程

    最近项目由于用到上位机与TRIO交互,为了使交互编程方便,使用了TRIO的COM组件.记录一下为方便以后自己使用,同时也方便大家做参考! 组件下载地址(百度云盘):https://pan.baidu. ...

  6. Python - 基础语法 - 第一天

    编码 默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串. 标识符 第一个字符必须是字母表中字母或下划线 _ . 标识符的其他的部分由字母.数字和下划线 ...

  7. 使用GitHub/码云/Git个性化设置

    参考链接:https://www.liaoxuefeng.com/wiki/896043488029600/900937935629664 这似乎很可笑,我还从来没有想过为一个网站的使用方法写一篇来记 ...

  8. ElementUI如何展开指定Tree树节点

    原文:https://blog.csdn.net/gaojie_csdn/article/details/80738488 [问题] 在页面使用ElementUI的时候,想做出一个主动展开树节点的效果 ...

  9. JAVA集合框架的特点及实现原理简介

    1.集合框架总体架构 集合大致分为Set.List.Queue.Map四种体系,其中List,Set,Queue继承自Collection接口,Map为独立接口 Set的实现类有:HashSet,Li ...

  10. 写 React / Vue 项目时为什么要在列表组件中写 key,其作用是什么

    怼一波,在项目中有很多经常用到,但又含糊不清的知识点 框架中的key: 1. 为啥在遍历元素时要用 key :在开发过程中为了保证遍历同级元素的唯一性,用来提高更新 dom 的性能: 2. 凭啥要保证 ...