这些天菜鸟又遇到麻烦事儿了。server team交给菜鸟的这批服务器跑起sql server来老是不顺畅。菜鸟情不至尽的想起了老鸟,于是,敲开了老鸟办公室的门:
“鸟哥,到底我们要如何定制化或者说如何优化我们的windows server os来使得我们的sql server达到最大程度的性能优化呢?”。老鸟还没有反应过来,菜鸟劈头盖脸的问道。
老鸟顿了两秒,自信的回答道:“菜鸟,有进步啊,开始学会思考问题了。我们可以按照如下方法来优化我们的操作系统,使的sql server达到最大程度的优化。”。
sql server做为数据存取的后台数据库服务,注定了具有先天的i/o敏感型,cpu密集型的特点。因此,最好是将windows os尽可能多的资源都分配给sql server,以期望能够获取最优的数据存取性能。
要想获得最大的性能优化,sql server必须是独享windows os系统资源的。这一点非常容易理解,sql server需要像是独生子女家庭的孩子一样,集万千宠爱于一身,独享os资源。
试想一下,如果一个服务器既提供dc服务,又提供ftp文件下载上传服务,还要提供sql server的数据存取服务。那么,dc和ftp服务势必会与sql server争抢cpu,i/o,内存等系统资源。因此,sql server不可能取得最大的性能优化。
基于上一小节的分析,我需要关闭sql server宿主服务器上不必要的服务,以免造成和sql server资源的争抢。这些服务包含但不仅限于:
iis、ftp、index service、messenger、microsoft searching等。如果已经安装了这些服务,请将服务启动修改为manual,以免服务开机自动启动。
关于windows平台文件系统的选择,我们一般选择ntfs文件系统。但,就ntfs而言,我们的版本选择也有讲究。
2001年发布的windows xp及以后的windows版本,引入了ntfs 5.0。我们有充足的理由选择ntfs 5.0文件系统,因为它比更早的ntfs 有一些新的性能增强点,比如:
更少的磁盘访问来找到想要的文件。
总体更快的磁盘读取速度。
当然,如果你的产品环境sql server已经使用了ntfs 4.0格式化你的文件系统,要想转化为ntfs 5.0就会变得非常困难。但是,当你有新的sql server实例需要安装时,建议你使用ntfs 5.0。以下是检查ntfs文件系统版本的方法,我的测试机是windows 7:
ntfs 提供了文件加密和数据压缩的功能,虽然默认情况下新安装的操作系统这两项功能都是关闭的,但是,为了避免人为错误的开启了这两项功能,我们还是非常有必要重点审查这两项功能。因为,这两项功能涉及到数据加密、解密、压缩和解压缩,都属于典型的i/o密集型和cpu密集型操作,而对于sql server而言,任何增加i/o和cpu消耗的行为对于sql server都是巨大的伤害。
查看ntfs是否关闭压缩和加密功能:
关闭ntfs压缩和加密功能
如果想要启用加密和压缩功能,请将1修改为0。
由于windows os是面向所有应用程序开发的,虽然它具有对于sql server数据库系统的自适应能力,但是,我们还是需要针对sql server数据库数据存取服务的特点来定制化系统的一些设置。
修改操作系统为最佳性能模式,节约一些不必要的性能开销,方法如下:
start => run => systempropertiesadvanced => settings => adjust for best performance => ok => ok

由于sql server是属于数据存取的数据库后台服务程序,所以,请将操作系统如何使用调度器的方法修改为background services。方法如下:
start => run => systempropertiesadvanced => settings => advanced => adjust for best performance of background services => ok => ok
关于虚拟内存设置,其实存在很大的分歧。按照microsoft官方的解释是建议sql server宿主机虚拟内存为主机物理内存的1.5倍大小;如果sql server需要使用full-text组件,建议虚拟内存设置为物理内存的3倍大小;建议sql server的max server memory为物理内存的1.5倍大小。
个人对虚拟内存大小的建议持保留态度,两点理由:
理由一:sql server max server memory如果是物理内存的1.5的话,sql server会尽可能多做数据缓存,当物理内存塞满时,势必会导致虚拟内存的使用。由于虚拟内存实际上是将磁盘当着内存来使用,我们知道磁盘读写速度是远远低于内存读写的,哪怕是ssd。那么,这个时候,数据库会明显的变慢,连接暴增,甚至会导致服务挂起,最终导致数据库服务死掉。
理由二:1.5或者3倍物理内存空间的虚拟内存大小,导致大量的磁盘空间浪费。因为,目前的服务器动辄上100gb的内存已是家常便饭的事了,有的生产环境的服务器已经达到256gb内存空间了,这样的话,有378gb - 768gb的空间浪费,如果磁盘是ssd的话,浪费的成本很更高。
个人对虚拟内存大小设置的建议是,使用windows性能监视器观察pageing file % usage计数器值一段时间(比如一天甚至一周,时间越长越准确),然后让虚拟内存的最大值和最小值保持一致,均设置为这个计数器的最大值再加上一个数字(比如10gb)。性能监视器中计数器的添加方法如下:
虚拟内存大小设置方法如下: start => run => systempropertiesadvanced => settings => advanced => change => custom size => set => ok。
为了给sql server提供更好的系统内存优化,我们还应该限制系统使用文件缓存的内存数量,来为sql server提供更多的系统内存。所以,请确保系统缓存策略为maximize data throughput for network applications,而不是maximize data throughput for file sharing。以下是windows server 2003的配置方法(windows server 2008的maximize data throughput for network applications属性按钮是灰色的):
start => run => control => network connects => local area connection => general => properties => file and printer sharing microsoft networks => properties => maximize data throughput for network applications
以下是对四种系统缓存优化方案适用场景的解释:
minimize memory used : 具有少量客户端连接的服务器;
balance : 多用途使用的服务器优化。比如,提供文件共享和打印服务的交互式工作站。
maximize data throughput for file sharing : 尽可能多的提供文件和打印服务的专有服务器。
maximize data throughput for network applications : 为拥有自己的内存缓存机制的分布式应用程序优化系统缓存,比如像微软的sql server服务。
这个组策略项比较有意思,虽然它与sql server系统性能没有直接关系。但是,它关系着32位sql server是否有权限使用awe(address windowing extensions)。所以,它间接关系着32 位的sql server性能。
请将lock pages in memory策略里设置sql server启动用户拥有这个权限,否则,当我们启用awe的时候,会报告如下错误:
设置该策略的方法如下: start => run => gpedit.msc => computer configuration => windows settings => security settings => local policies => user rights assignment => lock pages in memory
如果是单个sql server数据库实例上建立过多的replication publication链,可能会遭遇如下的错误:
这是因为sql server对replication发布链使用的内存量有限制,我们通过修改注册表的 [hkey_local_machinesystemcurrentcontrolsetcontrolsession managersubsystemswindows]键值来解决replication的问题。修改的方法是将sharedsection=1024,20480,768修改为sharedsection=1024,20480,2048
关于安全,看起来好像和sql server性能没有什么直接的联系。但是,我们反过来想,如果sql server成为黑客的“肉鸡”来随意使用的话,当然会浪费大量的性能开销。
microsoft windows操作系统或者sql server本身的service pack,要么解决了性能问题,要么解决了安全隐患,要么就是一些bug fix。所以,新的service pack出来并且稳定以后,我们还是很有必要打上这些service pack的。
最常见的情况是与存储和网络相关的驱动器会影响到sql server主机性能,进而影响到sql server的性能。因此,我们最好能够周期性的检查服务器是否有最新,微软认证的硬件驱动器。微软认证这一点很重要,没有通过认证的驱动安全性,稳定性很难保证。所以,为了系统性能和稳定性,我们需要耐心等待微软认证的版本。至于检查的方法,我们需要到供应商的官方网站去查询或者开启微软更新服务。
听完老鸟的娓娓道来,菜鸟茅塞顿开,赶紧去试验去了。