SQLServer硬件性能监控列表
SQLServer硬件特征 | 相应的描述 |
Number of CPUs | |
CPU MHz | |
CPU L2 Cache Size | |
Physical RAM Amount | |
Total Amount of Available Drive Space on Server | |
Total Number of Physical Drives in Each Array | |
RAID Level of Array Used for SQL Server Databases | |
Hardware vs. Software RAID | |
Disk Fragmentation Level | |
Location of Operating System | |
Location of SQL Server Executables | |
Location of Swap File | |
Location of tempdb Database | |
Location of System Databases | |
Location of User Databases | |
Location of Log Files | |
Number of Disk Controllers in Server | |
Type of Disk Controllers in Server | |
Size of Cache in Disk Controllers in Server | |
Is Write Back Cache in Disk Controller On or Off? | |
Speed of Disk Drives | |
How Many Network Cards Are in Server? | |
What is the Speed of the Network Cards in Server? | |
Are the Network Cards Hard-Coded for Speed/Duplex? | |
Are the Network Cards Attached to a Switch? | |
Are All the Hardware Drivers Up-to-Date? | |
Is this Physical Server Dedicated to SQL Server? |
在上表里输入你的值.
监控硬件是早期的重要步骤
从以前的章节里(使用性能监视器),你可以找出一些潜在的硬件性能瓶颈。这一节里,我们将查看SQLServer硬件的每一个主要组件,以帮助最优化你硬件的性能。
将分以下几个部分进行:
- CPU
- Memory
- Disk Storage
- Network Connectivity
- Misc.
作为监控的一部分,你需要完成上面的列表,这样,你就会对你的服务器无所不知了。
CPU
CPU的数量
由于选择合适的CPU的数量是困难的,所以你可以考虑下面的原则:
- 尽可能的购买更多CPU数量的服务器。
- 如果你做不到,那么至少要购买一个能扩展CPU数量的服务器。几乎所以的SQLServer在工作量增加时都需要更多的动力。
这是一些潜在的假设:
-
SQLServer将仅仅用来运行一个同时不超过5个用户的财务应用程序,并且你预期未来两年不会改变。如果是这样,单CPU的服务器就足够用了。如果预期用户数量在不久会增加的话,那么你需要考虑购买一个单CPU的,并且拥有可扩展一个CPU数量的服务器以备不时之需。
我能提供一些其他的例子,但是通过这些我发现:正确预计基于SQLServer的一个特殊的应用程序的CPU的数量是很困难的。你通常应该购买一个比你认为要大的系统,因为在许多情况下,一个应用程序的使用需求经常是被低估了的。现在购买一个有多个CPU的大服务器来长期使用也不是很昂贵了,总比你在6到12个月后由于当初的低估不得不重新替换你整个服务器要划算得多。
CPU速度
象CPU的数量一样,需要的CPU的速度 也是很难估计的。一般说来,尽量购买最快的CPU。购买速度快的总是好于速度慢的。
CPU 2级缓存
- 如果你仅有1、2个CPU,那么尽量买最快的,其次才考虑2级缓存。如果你一定要选择2级缓存大小的话,尽量选择较大的。
-
但是,如果你有4个或更多的CPU,那么你需要较大2级缓存的CPU,即使它们的速度不太高。这是因为对于一个有4个或更多CPU的服务器来说,要想尽量让SQLServer运行良好的话,2级缓存一定要大,否则将浪费额外的CPU。
CPU监控列表
- 减少服务器的负荷。可以通过减少用户数量、调优查询、调优索引、除去在服务器上运行的不必要的程序来达到目的。另外如果你的产品服务器上还运行有关于报表的程序,将其移到一个专门为报表做的服务器上。
- 如果CPU瓶颈是由于缺少服务器内存引起的,请添加更多的内存。这是一个普遍的问题。
- 如果你目前的服务器有更多的CPU插槽,那么请添加更多的CPU。
-
如果可以的话,用更快的CPU升级你的服务器。
- 购买一个新的有更多更快CPU的服务器。
不幸的是,这些方法在处理CPU瓶颈时也不是轻而易举的,当然除非你们公司有足够的钱。作为一个DBA来说,你可能唯一能做的就是“减少服务器的负荷”这一项了。
内存
当我们讨论内存的时候,一般指的是物理内存,而不是虚拟内存。SQLServer不是设计来用虚拟内存的,尽管它也能用。
如果这个计数器少于90%,关键在于性能无法被接受(如果运行的是OLAP,少于90%通常也没问题),所以需要添加更多的内存。
磁盘存储器
在内存之后,磁盘存储器也是经常影响SQLServer性能的的最重要的因素。 它也是一个复杂的话题。在这部分,我将专注于磁盘存储器影响性能最容易的地方。
服务器上可用磁盘空间的总量
查看你SQLServer的每一块物理磁盘,检查一下是否有至少20%或者更多的可用空间。如果没有,考虑以下方法:
- 删除磁盘上任何不需要的数据(清空回收站、临时文件、setup文件等等)
- 删除一些数据以留出更多的空间
- 添加更多的磁盘空间
每一个磁盘阵列的物理磁盘数量
除镜像磁盘(两个物理磁盘一起工作)外,磁盘阵列有越多的物理磁盘,对于磁盘阵列的读写就越快。
例如,假如想买一个新的做RAID5的至少有100M可用空间的SQLServer服务器,并要求提供以下两种不同的磁盘阵列配置:
- 4个36G的磁盘(可用空间为108G)
- 7个18G的磁盘(可用空间为108G)
一般说来,磁盘阵列中磁盘越多,可用来读写的磁盘头就越多。例如,SCSI磁盘可以同时读和写数据。所以一个磁盘阵列有越多的物理磁盘,该磁盘阵列的读写速度就越快。阵列中的每个磁盘分担一部分工作量,磁盘越多越好。这儿有一个限制,依赖于磁盘控制器,但通常说来,越多越好。
例如,假定你目前的服务器有2个磁盘阵列用来存储用户数据库。每一个是3个18G的磁盘组成的RAID5阵列。这种情况下,将两个阵列重新配置成一个由6个18G的磁盘组成的阵列会更好。这不仅仅提供了更快的I/O,而且也能获得18G的的磁盘空间。
仔细检查你目前的配置,你可以改变很多,也许不可以。但是如果你可以改变的话,你将在你改变之后立即从中得到好处。
SQLServer数据库通常使用的磁盘阵列的RAID级
RAID 1
-
操作系统(包括虚拟内存)和SQLServer最理想的是运行在RAID1磁盘阵列上。也有人将虚拟内存运行在一个独立的RAID1磁盘阵列上,但是我对这样做是否能提供虚拟内存性能表示怀疑,在一个好的配置的服务器上,那不是问题。
-
如果你的SQLServer数据库非常小,所有的数据都能在一个磁盘下存储,那么请为你的数据库文件存储考虑RAID1级别。
-
理想地,每一个独立的事务日志应该运行在一个独立的RAID1磁盘阵列上。这是因为事务日志在不断的读写,通过放在独立的磁盘阵列上,由于连续的磁盘I/O不和更慢的随机的磁盘I/O混合使用,从而使性能得到提升。
RAID 5
-
尽管这是比较流行的RAID级别,对于最优化SQLServer的I/O性能还不是最好的选择。如果数据库的写操作比例超过10%,大多数OLAP数据库都是这样,写性能会降低,从而伤害整个SQLServer的I/O性能。RAID5最好用于只读或者大部分时候是读的数据库。在微软的测试发现RAID5比RAID10几乎要慢50%。
RAID 10
-
RAID10为SQLServer数据库提供了最好的性能,尽管它是最贵的。数据库的写操作越多,使用RAID10更重要。
-
RAID10阵列对于事务日志也是不错的选择,假定它只用来存储单个事务日志。
如果你只能选择上面的一个 建议的话,我建议你使用RAID10。这将最大化你SQLServer的I/O性能。
硬件RAID vs. 软件RAID
可以通过硬件或者软件(通过操作系统)实现RAID。不要使用软件RAID,会很慢,总是使用硬件RAID,这是不争的事实。
磁盘碎片
作为性能监控的一部分,你需要了解你的SQLServer数据库和事务日志是怎样产生碎片的。如果你使用的是Windows2000或者2003,你可以使用内建的碎片整理工具去分析文件变成碎片的严重程度。如果你运行的是NT4.0,那么你可以借助第三方工具如DisKeeper来进行分析。
如果分析结果需要进行碎片整理,则进行。不幸的是,整理SQLServer数据库和事务日志的碎片不总是一件容易的事。运行着的文件,象在
你真有必要对数据库文件进行碎片整理吗?如果你的I/O性能目前比较适中,那么你不需要进行碎片整理。但是如果你的I/O性能是个瓶颈的话
理想地,你应该周期性的整理你的SQLServer数据库和事务日志碎片。这样,你能确信没有I/O性能问题。
操作系统
为了最佳性能,操作系统文件和SQLServer数据库文件(MDF、LDF文件)不要放在一个磁盘阵列上。另外,操作系统文件应该放在一个支持
和大多数人一样,通常我也是在服务器的C盘上安装操作系统。并且为了容错和最好的性能将C盘配置为RAID1的镜像磁盘。
在大多数情况下, 只要你不把操作系统和SQLServer数据文件放在同一个磁盘阵列上,你在服务器上处理操作系统文件就会获得很大的性能。
SQLServer程序
象操作系统文件一样,SQLServer程序也不是很挑剔,只要不和SQLServer数据文件放在同一个磁盘阵列上就行。和操作系统文件一起,我通常将SQLServer程序放在被配置为RAID1镜像的C盘。
如果你在配置SQLServer7.0的群集,那么SQLServer程序不能安装在C盘,必须安装在共享磁盘阵列上。不幸的是这经常和SQLServer的数据文件是同一个磁盘阵列,除非你有足够的钱仅仅为提升SQLServer程序性能而购买一个独立的独立磁盘阵列。当性能被与数据库文件在同一磁盘阵列上的SQLServer程序轻微影响时,获得容错能力也是一个不太坏的折中方案。另一方面,升级到SQLServer2000群集是一个不错的选择。如果你在配置SQLServer2000群集,那么SQLServer程序必须放在本地磁盘上,而不是共享磁盘阵列上,所以性能不成问题。
虚拟内存
如果你有一台SQLServer的专用服务器,并且SQLServer的内存设置为动态(缺省),那么虚拟内存将很少用到。这是因为SQLServer通常不会太多的使用它。因此,虚拟内存放在任何一个特定的位置不是关键,除了不要放在SQLServer数据文件的同一磁盘阵列上。
通常,我把虚拟内存放在操作系统和SQLServer程序的同一磁盘阵列上,正如我前面所述,它是一个支持RAID1、RAID5、RAID10的磁盘阵列,通常是C盘,这使管理员更容易管理。
如果不是SQLServer专用服务器,除了SQLServer外还运行了其他程序,由于其他程序的原因,虚拟内存可能会有问题,为了获得更好的性能,你需要考虑将虚拟内存配置到一个专用的列上。然而,更好的方法是使用一台SQLServer的专用服务器。
tempdb数据库
如果tempdb数据库的使用比较繁重,为了提高磁盘I/O性能,考虑将它移到一个RAID1或者RAID10的独立磁盘阵列上。不要使用RAID5,因为对于写操作是慢的,如使用,会对tempdb产生副作用。如果不能提供独立的磁盘阵列,你有不想将它与数据库文件放在同一个磁盘阵列上,可以考虑放在操作系统的那个磁盘上,这将帮助减少I/O的争夺以提高性能。
如果应用程序非常多的使用tempdb数据库,从而引起文件增长超过它的缺省大小,那么你需要将tempdb的缺省大小增加到最近你的应用程序实际使用的tempdb的大小。这是因为每次SQLServer服务重新启动后,tempdb文件都会按照缺省值重建。当tempdb增长时会花费一些性能资源。通过在SQLServer重新启动时给tempdb分配一个合适的大小,你不必担心在使用时超过这个大小了。
另外,在tempdb数据库里繁重的操作会降低应用程序的性能。尤其是在创建一个或多个大的临时表去查询或者做联接时。为了加速这些查询,确信tempdb数据库的AUTOSTATS(自动更新统计信息)选项已打开,并且在这些临时表上创建一个或多个索引。大多数情况下,你将发现这能充分加速你的应用程序。但象许多性能建议一样,测试看看是否有实际的帮助。
系统数据库
系统数据库(master、msdb、model)没有大量的读写操作,所以把它们和你的SQLServer数据文件放在同一磁盘阵列上通常也没有性能问题。仅仅一种情况除外,就是有成百上千用户的大数据库。这种情况下,把系统数据库放在一个独立的磁盘阵列上以稍微提高I/O性能。
用户数据库
为了最佳性能,用户数据库文件放在它们自己的磁盘阵列上(RAID1、5或10),和所以的其他数据库文件,包括日志文件分开。如果再同一个SQLServer上有多个大数据库的话,考虑为每一个数据库文件分配一个独立的磁盘阵列以减少I/O争夺。
日志文件
理想地,每一个日志文件都应该有它自己独立的磁盘阵列(RAID1或10,注意RAID5会降低事务日志写操作的性能,低于你的预期)。原因是大多数时候,事务日志在连续的写操作,如果磁盘阵列能连续的写数据的话(不必中断去进行其他的读写操作),那么连续写会很快。但是如果你的磁盘阵列不能连续的写的话,由于它不得不随机的执行其他读写操作,连续写就得不到执行,性能就降低了。
当然,为每一个日志文件提供一个独立的磁盘阵列是很昂贵的。那么至少将所有的日志文件放在一个磁盘阵列上(RAID1或RAID10),而不要与数据库文件放在一个磁盘阵列上。连续的写性能尽管没有为每个日志文件提供一个独立的磁盘阵列那样好,它仍然比试图与数据库文件一起竞争磁盘I/O的性能好的多。
服务器上磁盘控制器的数量
单个的磁盘控制器,不论它是SCSI还是fibre,都有一个最大的吞吐量的限制。因此,你需要让磁盘控制器的数量与你期望的数据吞吐量相匹配。每个控制器都是不同的,我无法推荐一个明确的解决方案,但最少应该有2个磁盘控制器。一个用于非硬盘设备如CD-ROM、备份设备等等。另一个用于硬盘。目的是不要将快的和慢的设备放在同一个控制器上。
经常使用的一个较好的方案是:一个控制器为非硬盘设备,一个为RAID1的本地硬盘,第三个(有时更多)用于存放数据库文件和日志文件的磁盘阵列。确保不要为控制器捆绑超过它能处理的更多的磁盘,那样当它工作的时候,会降低性能。
服务器上磁盘控制器的类型
总是尽可能的购买最快的磁盘控制器,如果你想要最好的SQLServer性能的话。也许你知道,不同的磁盘控制器有不同的性能特征。例如,对于SCSI类型来说,就有Wide SCSI, Narrow SCSI, Ultra SCSI等不同的类型。光纤连接在更小的层次上,也和上述一样,不同的磁盘控制器有不同的性能特点。
由于控制器的种类很多,我不能做任何明确的建议。通常硬件厂商会提供不同的模型供选择。逐一咨询各自的利弊,选择最适合你的那一款。
服务器上磁盘控制器的缓存大小
当你购买磁盘控制器的时候,也要考虑它缓存的大小。一些磁盘控制器允许添加额外的磁盘缓存。通常你要购买的磁盘缓存应和控制器能容纳
磁盘控制器上的写回缓存是开还是关?
磁盘控制器上的磁盘缓存提供两个方法去加速访问。一个是为了读,一个是为了写。这其中最重要的是读,这是大多数SQLServer数据库花费磁盘I/O时间的地方。另一方面,一个写回缓存是用来加速写操作的,而写相对于读来说通常不是很多。不幸的是,大多数情况下,SQLServer采取写回缓存不打开,因此,写回缓存在大多数磁盘控制器上是被关掉的。如果你不那样,在一定环境下,在SQLServer写数据后(一旦它写完数据,它就会认为是正确地写的),可能会取得一些脏数据,但是由于某些原因(例如电力不够),写回缓存不会把数据写到磁盘上。
一些控制器提供了备份电池以防止这样的问题,但它们不总是能如预期的那样工作。个人认为,宁愿要正确的数据虽然写慢一点,也不要错误
磁盘转速
磁盘阵列里的磁盘有不同的转速。 正如你所想,为了最佳的性能,总是购买最快的磁盘。通常是15000转或更快。另外,不要将不同转速的磁盘放在同一个磁盘阵列里,那样会影响性能。
服务器上的网卡数量是多少?
幸运的是, 网络流量通常不会称为SQLServer的瓶颈。单个网卡总是足够用。但是如果你发现网络流量成问题了(你已经有成百上千个用户),那么添加多个网卡总是正确的,这能提高性能。另外,两个或者更多的网卡能增加冗余,减少宕机时间。
网卡速度是多少?
至少应使用100M的网卡,10M的不能满足你需要的带宽。如果一个或者更多的100M的网卡不能满足,考虑用G级的网卡。事实上,你可能需要完全地跳过100M的网卡而仅仅用G级的网卡代替。使用更快的网卡不会增加网络流量,它仅仅允许更多的流量通过,轮流的允许你的服务器在适宜的性能下运行。
网卡硬编码是Speed/Duplex的吗?
如果你的SQLServer有两个10/100或者10/100/1000的网卡,假定是自动识别网卡速度并设置为适合的,别相信那个能正常的工作。网卡通常不能正确的自识别,总是设置一个小于最佳速度的值或者duplex设置,这样会影响网络性能。你需要做的是手工设置卡的速度和duplex设置,以便你能确认它已经正确的设置了。
网卡是连在交换机上的吗?
在一个大的数据中心这是显而易见的,但是对于小的机构来说,使用一个Hub来连接服务器。要是那样,请认真考虑用适当的交换机替换掉Hub,用可能最高的性能去配置交换机,例如100M并且全双工通信。将Hub替换为交换机后在网络性能上会有一个戏剧性的不同。
所有硬件的驱动都是最新的吗?
诚然,这是一个烦人的话题,但它比你认为的更重要。最大的性能消耗之一是有Bug的驱动(会引起一些奇怪的不常见的问题),无论它们是在磁盘控制器中还是网卡中,或者别的地方。通过使用最新的驱动,你有可能得到更好更快的性能的驱动,从而提高SQLServer的性能。
你应该定期的检查你的硬件是否有新的驱动可用,当你有时间的时候去安装它们。我本人曾经将一个老的有很多bug的驱动更新后是性能得到了彻底的根本提升。
SQLServer服务器是专用的吗?
前面我间接提到过,SQLServer应该运行在一个专用的服务器上,而不是和其他应用程序、软件共享一个服务器。当你将SQLServer和其他软件共享时,你迫使SQLServer去争取物理资源,这样调优SQLServer性能就更加困难。有很多次我在查找SQLServer性能低下的原因时都发现是另一个和SQLServer运行在同一台服务器上的应用程序的缘故。