如何优化Windows OS使SQL Server性能最优化-博客-云栖社区-阿里云

作者: 大叔 分类: 博客 发布时间: 2017-01-11 05:16

摘要:
#1.问题提出
  这些天菜鸟又遇到麻烦事儿了。Server Team交给菜鸟的这批服务器跑起SQL Server来老是不顺畅。菜鸟情不至尽的想起了老鸟,于是,敲开了老鸟办公室的门:

  “鸟哥,到底我们要如何定制化或者说如何优化我们的Windows Server OS来使得我们的SQL Server达到最大程度的性能优化呢?”。老鸟还没有反应过来,

1.问题提出

  这些天菜鸟又遇到麻烦事儿了。Server Team交给菜鸟的这批服务器跑起SQL Server来老是不顺畅。菜鸟情不至尽的想起了老鸟,于是,敲开了老鸟办公室的门:

  “鸟哥,到底我们要如何定制化或者说如何优化我们的Windows Server OS来使得我们的SQL Server达到最大程度的性能优化呢?”。老鸟还没有反应过来,菜鸟劈头盖脸的问道。

  老鸟顿了两秒,自信的回答道:“菜鸟,有进步啊,开始学会思考问题了。我们可以按照如下方法来优化我们的操作系统,使的SQL Server达到最大程度的优化。”。

2.SQL Server独享OS系统资源

  SQL Server做为数据存取的后台数据库服务,注定了具有先天的I/O敏感型,CPU密集型的特点。因此,最好是将Windows OS尽可能多的资源都分配给SQL Server,以期望能够获取最优的数据存取性能。

2.1.SQL Server独享物理机器

  要想获得最大的性能优化,SQL Server必须是独享Windows OS系统资源的。这一点非常容易理解,SQL Server需要像是独生子女家庭的孩子一样,集万千宠爱于一身,独享OS资源。

  试想一下,如果一个服务器既提供DC服务,又提供FTP文件下载上传服务,还要提供SQL Server的数据存取服务。那么,DC和FTP服务势必会与SQL Server争抢CPU,I/O,内存等系统资源。因此,SQL Server不可能取得最大的性能优化。

2.2.关闭不必要的服务

  基于上一小节的分析,我需要关闭SQL Server宿主服务器上不必要的服务,以免造成和SQL Server资源的争抢。这些服务包含但不仅限于:

  IIS、FTP、Index Service、Messenger、Microsoft Searching等。如果已经安装了这些服务,请将服务启动修改为Manual,以免服务开机自动启动。

3.NTFS文件系统

  关于Windows平台文件系统的选择,我们一般选择NTFS文件系统。但,就NTFS而言,我们的版本选择也有讲究。

3.1.版本选择

  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:

>fsutil fsinfo ntfsinfo C:
NTFS Volume Serial Number :       0x8ca4ddeba4ddd832
Version :                         3.1
Number Sectors :                  0x0000000009fccfff
...

3.2.加密与压缩

  NTFS 提供了文件加密和数据压缩的功能,虽然默认情况下新安装的操作系统这两项功能都是关闭的,但是,为了避免人为错误的开启了这两项功能,我们还是非常有必要重点审查这两项功能。因为,这两项功能涉及到数据加密、解密、压缩和解压缩,都属于典型的I/O密集型和CPU密集型操作,而对于SQL Server而言,任何增加I/O和CPU消耗的行为对于SQL Server都是巨大的伤害。

  查看NTFS是否关闭压缩和加密功能:

>fsutil behavior query DisableCompression
DisableCompression = 0

>fsutil behavior query DisableEncryption
DisableEncryption = 0

  关闭NTFS压缩和加密功能

>fsutil behavior set DisableEncryption 1
NOTE: Changes to this setting require a reboot to take effect.
DisableEncryption = 1

>fsutil behavior set DisableEncryption 1
NOTE: Changes to this setting require a reboot to take effect.
DisableEncryption = 1

  如果想要启用加密和压缩功能,请将1修改为0。

3.3.参考链接

  NTFS Wiki

4.系统设置

  由于Windows OS是面向所有应用程序开发的,虽然它具有对于SQL Server数据库系统的自适应能力,但是,我们还是需要针对SQL Server数据库数据存取服务的特点来定制化系统的一些设置。

4.1.Best Performance

  修改操作系统为最佳性能模式,节约一些不必要的性能开销,方法如下:
** Start => Run => SystemPropertiesAdvanced => Settings => Adjust for best performance => OK => OK **

4.2.Background Services

  由于SQL Server是属于数据存取的数据库后台服务程序,所以,请将操作系统如何使用调度器的方法修改为Background services。方法如下:
** Start => Run => SystemPropertiesAdvanced => Settings => Advanced => Adjust for best performance of Background services => OK => OK **

4.3.Virtual Memory

  关于虚拟内存设置,其实存在很大的分歧。按照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。**

  虚拟内存大小设置Microsoft的官方解释参见链接:Configuring Virtual Memory

4.4.Maximizing Data Throughput for Network Applications

  为了给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服务。

  参考链接,To configure File and Printer Sharing for Microsoft Networks

4.5.Lock Pages in Memory

  这个组策略项比较有意思,虽然它与SQL Server系统性能没有直接关系。但是,它关系着32位SQL Server是否有权限使用AWE(Address Windowing Extensions)。所以,它间接关系着32 位的SQL Server性能。

  请将Lock pages in memory策略里设置SQL Server启动用户拥有这个权限,否则,当我们启用AWE的时候,会报告如下错误:

Address Windowing Extensions (AWE) requires the 'lock pages in memory' privilege which is not currently present in the access token of the process.

  设置该策略的方法如下:** Start => Run => gpedit.msc => Computer Configuration => Windows Settings => Security Settings => Local Policies => User Rights Assignment => Lock Pages in memory **

4.6.Replication Memory Using Limitation Setting

  如果是单个SQL Server数据库实例上建立过多的Replication Publication链,可能会遭遇如下的错误:

Agent '%s' is retrying after an error. %d retries attempted. See agent job history in the Jobs folder for more details.

  这是因为SQL Server对Replication发布链使用的内存量有限制,我们通过修改注册表的 ** [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\SubSystems\Windows]**键值来解决Replication的问题。修改的方法是将**SharedSection=1024,20480,768**修改为**SharedSection=1024,20480,2048**

%SystemRoot%\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,20480,2048 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=winsrv:ConServerDllInitialization,2 ServerDll=sxssrv,4 ProfileControl=Off MaxRequestThreads=16

5.安全

  关于安全,看起来好像和SQL Server性能没有什么直接的联系。但是,我们反过来想,如果SQL Server成为黑客的“肉鸡”来随意使用的话,当然会浪费大量的性能开销。

5.1.Service Pack

  Microsoft Windows操作系统或者SQL Server本身的Service Pack,要么解决了性能问题,要么解决了安全隐患,要么就是一些Bug Fix。所以,新的Service Pack出来并且稳定以后,我们还是很有必要打上这些Service Pack的。

5.2.Microsoft-Certified Hardware Drivers

  最常见的情况是与存储和网络相关的驱动器会影响到SQL Server主机性能,进而影响到SQL Server的性能。因此,我们最好能够周期性的检查服务器是否有最新,微软认证的硬件驱动器。微软认证这一点很重要,没有通过认证的驱动安全性,稳定性很难保证。所以,为了系统性能和稳定性,我们需要耐心等待微软认证的版本。至于检查的方法,我们需要到供应商的官方网站去查询或者开启微软更新服务。

6.尾声

  听完老鸟的娓娓道来,菜鸟茅塞顿开,赶紧去试验去了。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!