当前位置:首页 > 问答 > 正文

应对SQL Server虚拟化那些棘手问题,怎么才能不出大差错呢

虚拟化技术现在非常普遍,很多公司都把重要的SQL Server数据库放到了虚拟机上,这样做确实能省钱、提高硬件利用率,管理起来也方便,把SQL Server虚拟化可不是简单地把一台物理机变成虚拟机就完事了,里头有不少棘手的坑,如果处理不好,数据库性能会一落千丈,甚至动不动就出问题,要想不出大差错,得重点关注下面这几个方面。

第一,最关键的是资源分配,不能“小气”,更不能“争抢”。

SQL Server是个对资源很“饥渴”的应用,尤其是内存和CPU,在虚拟化环境里,最容易出问题的地方就是资源争抢。

  • CPU方面: 你不能只看着虚拟CPU(vCPU)的数量,来源“SQL Server在虚拟化环境下的性能优化”指出,一个常见的错误是给虚拟机分配了太多的vCPU,以为越多越快,但实际上,如果物理主机的CPU核心数不够,这些vCPU就要去排队等待物理CPU的时间片,反而会导致严重的调度延迟,性能更差,原则是“够用就好”,比如原来物理机是8核,虚拟机从4核开始测试,如果性能达标就不要盲目加到8核,一定要在虚拟化平台(如VMware vSphere或Microsoft Hyper-V)上为SQL Server虚拟机设置“资源预留”,保证它随时都能获得最起码的CPU计算能力,避免被其他虚拟机挤占。
  • 内存方面: 这是重中之重,SQL Server的性能极度依赖内存缓冲池,你必须为虚拟机分配足够多的内存,而且要留有余地,来源“虚拟化SQL Server的最佳实践”强调,绝对不能启用“内存过量分配”,就是不要让虚拟化主机承诺给虚拟机的总内存大于物理实际内存,一旦发生内存交换,数据库性能会呈断崖式下跌,在虚拟机操作系统内部,也要关闭不必要的服务,把尽可能多的内存留给SQL Server的Buffer Pool。

第二,存储配置是性能的基石,慢的存储会毁掉一切。

数据库的本质就是不断地读写磁盘,虚拟化环境下的存储比物理机更复杂,更容易成为瓶颈。

  • 磁盘类型和配置: 来源“SQL Server虚拟化常见陷阱”中提到,一定要为SQL Server的数据库文件(mdf/ldf)、日志文件单独创建高性能的磁盘,最好使用基于SSD的存储,至少也要是高速SAS硬盘组成的RAID 10阵列,绝对不要把这些关键文件放在跟操作系统同一个慢速磁盘上。
  • 虚拟磁盘的学问: 在创建虚拟磁盘时,要选择“厚置备”模式,而不是“瘦置备”,厚置备在创建时就直接占满你指定的大小,虽然看起来浪费空间,但性能最好、最稳定,瘦置备虽然节省空间,但动态分配空间会带来额外的I/O开销,对数据库这种密集I/O的应用是致命的,要确保虚拟磁盘的文件放在存储阵列上性能最好的LUN上。

第三,看不见的“管家”——虚拟化平台设置,细节决定成败。

虚拟化平台本身有很多高级设置,如果不懂,就会埋下隐患。

  • 正确选择虚拟化工具: 比如在VMware里,一定要在虚拟机中安装VMware Tools;在Hyper-V中,要选择“合成”的网卡和SCSI控制器,并安装Integration Services,这些工具提供了优化的驱动程序,能显著提升网络和存储I/O性能。
  • 禁用不必要的功能: 来源“确保虚拟化SQL Server高可用性”警告,一些对普通虚拟机有益的功能,对SQL Server却可能是毒药,一定要禁用虚拟机的“内存页面共享”和“内存气球驱动”,因为这些机制会干扰SQL Server对自己内存的管理,导致不可预知的性能波动,同样,为虚拟机做快照或者克隆时,要万分小心,最好在数据库维护时段进行,因为这会引发巨大的I/O压力,可能影响在线业务。

第四,监控思路要转变,不能只盯着虚拟机内部。

出了问题,很多人习惯登录到Windows服务器里,用任务管理器看CPU和内存,这在虚拟化环境里是远远不够的。

  • 内外结合监控: 你既要在虚拟机内部监控SQL Server的性能计数器(如Page Life Expectancy),更要跳出虚拟机,在虚拟化主机的管理界面上,查看这个虚拟机获得的“实际”CPU就绪时间、内存 ballooning/swapping 情况、存储延迟和队列深度等指标,来源“深度解析虚拟化性能监控”解释说,有时候虚拟机内部看资源没用满,但性能就是慢,原因往往是虚拟化主机层面的资源争抢或配置不当,只有结合两边的数据,才能准确定位问题根源。

要想SQL Server虚拟化不出大差错,核心思想就是:

把它当作一个“有特殊待遇的贵宾”来对待,要给它足量且有保障的CPU和内存资源;要让它住在高速且专属的存储上;要为其精细调校虚拟化平台的各项设置;要用内外结合的视角去监控它的健康状况,忽略任何一点,都可能让你陷入无休止的性能故障排查中。

应对SQL Server虚拟化那些棘手问题,怎么才能不出大差错呢