最近几天,笔者所在的单位中的一台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. tkmybatis VS mybatisplus

    本文是简单对比了以下官网上的内容 文章目录 TkMybatis Vs MybatisPlus 1.基础CRUD BaseMapper 2.代码生成器 3. 全局主键 Sequence主键 4. 热加载 ...

  2. Java匹马行天下之JavaSE核心技术——工具类

    Java匹马行天之JavaSE核心技术——工具类 一.Object类 java.lang.ObjectObject类是所有类直接或间接的父类 常用的方法: toString():以字符串形式返回对象的 ...

  3. thinkphp3.2.3集成phpexcel1.8导出设置单元格合并

    1 到这里下载classes里面的文件 https://github.com/PHPOffice/PHPExcel 2 然后放到 thinkphp的vendor 新建一个文件夹 Phpexcel  然 ...

  4. RFID相关知识总结(超高频UHF)

    RFID标签分类 1.LF(Low frequency) 低频 频段范围: 125 KHz-135KHz(ISO18000-2) 常见应用:该频段特点是具有良好的物体穿透能力.广泛应用于进出管理.门禁 ...

  5. English--音标拼读

    English|音标拼读 音标拼读主要内容是,如何使用音标进行单词的拼读,并且会有相应的语音现象,最关键的还是自己多加练习,多听~ 前言 目前所有的文章思想格式都是:知识+情感. 知识:对于所有的知识 ...

  6. Linux 下的 mysql 自动备份

    Linux 下实现自动备份,主要就是编写好执行备份的 shell script( *.sh )文件,设好权限(可读,可执行).然后利用 Linux 定时任务 crontab 来执行备份脚本就可以了.以 ...

  7. 解决 new file()在IOS下不兼容 的问题

    最近 做项目,做的要是拍照后上传相片,以file格式上传..所以 拍照 后用canvas生成base64格式再转file..在PC和安卓都是没有问题,到IOS上面不行..new file后就是生成一个 ...

  8. Astyle格式化插件

    可以集成到Visual Studio.Eclipse和source insight当中.下面只介绍集成到source insight 下载地址: https://sourceforge.net/pro ...

  9. linux下使用selenium

    安装chromedriver 1.安装chrome 用下面的命令安装最新的 Google Chrome yum install https://dl.google.com/linux/direct/g ...

  10. Linux服务管理之ntp

    NTP是网络时间协议(Network Time Protocol),它是用来同步网络中各个计算机的时间的协议. 在计算机的世界里,时间非常地重要,例如对于火箭发射这种科研活动,对时间的统一性和准确性要 ...