最近几天,笔者所在的单位中的一台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. 【07】Kubernets:资源清单(控制器 - DaemonSet)

    写在前面的话 前面讲解了 Pod / ReplicaSet / Deployment 的资源清单,我们这里谈一下 DaemonSet 的资源清单. 之前说过,DaemonSet 控制器能够保证资源在每 ...

  2. 【linux】Too many open files 解决问题第一步【记录】

    记录一下解决linux上出现:Too many open files  的第一步骤. 做个记录,免得每次都查来查去的. 1.查看 ulimit -a 2.修改 vi /etc/security/lim ...

  3. JavaScript 总结[目录]

    ECMAScript 基础 一.JavaScript 基础 1.1 JavaScript 简介 1.2 JavaScript 书写位置 二.JavaScript 数据类型 2.1 JavaScript ...

  4. html书写行内元素时-tab和换行会在行内元素间引入间距

    目录 html文本中的控制字符会被解析为文本节点 书写行内元素时,换行符LF与水平制表符HT会引入莫名的元素间间隔 其他控制字符是否会引入间距的验证 html文本中的控制字符会被解析为文本节点 举例: ...

  5. 5G:为人工智能与智能制造赋能

    近几年,全球有两大科技领域越来越热:一个是人工智能,另一个是5G.两者都是能够改变时代.改变社会.改变经济的颠覆性技术.目前,我国已经发放了四张5G牌照,5G产业处在爆发前夜的阶段:人工智能方面,业界 ...

  6. Yii2实现即可以美化路由访问又可以原始路由访问

    1. 本地环境 nginx version: nginx/1.11.1 PHP 7.1.0-dev (cli) mysql Ver 14.14 Distrib 5.7.22, for Linux (x ...

  7. 第一部分day5 文件操作

    #-----文件操作----- 文件操作模式 1."r" 读 2."w" 清空写入 3."a" 追加 4."r+" 读写 ...

  8. Unity错误提示大全(遇到问题就更新)

    记录下使用Unity中遇到的所有错误提示 1.Unhandled Exception: System.Reflection.ReflectionTypeLoadException: The class ...

  9. java生成前端验证码+验证「kaptcha」

    1.前言 kaptcha是一个非常实用的短信验证码生成工具,通过简单配置即可实现多样化的验证码. 2.引入依赖 <!--第三方验证码--><dependency>    < ...

  10. java 8 学习一(概述)

    学习java8的新特性之前,简单看了下从java5开始历代版本的新特性,都是别人总结的. java5.java6.java7.java8的新特性 http://blog.csdn.net/samjus ...