我目前在使用数据库服务器时遇到问题,该数据库具有大量小写入和一些比较大的读取。读取性能更重要,因为涉及人员,写入由自动化客户端执行。这个数据库目前是 30GB 并且会增长到一百左右。
目前表现不佳的糟糕和丑陋的设置是
- 戴尔 Poweredge R300
- 四核 Xeon X3353 @2.66GHz
- 14 GB 内存
- SAS 15k 146GB(两个分区,一个操作系统,另一个日志)
- SAS 15k 146GB(一个分区、数据和 tempdb)
- 没有RAID(呃)
- SATA 7k 1TB [通过 USB 2.0,外部电源,存储每日备份]
所以,由于它有很多丑陋的地方(性能不佳、没有 RAID、用于备份的外部 USB 驱动器),我计划建立一个新的数据库服务器。
我想过:
- 4 SAS 15k 73GB RAID10 用于日志
- 2 SAS 15k 73GB RAID1 用于操作系统
- 4 SAS 15k 146GB RAID10 用于数据 + tempdb
- 32GB 内存
所以,三个问题:
这是最好的性价比组合吗?这是矫枉过正吗?有更好的组合吗?是否需要更多信息?
您是否知道可以包含 10 个磁盘的价格合理的单机,或者我现在必须使用外部本地连接存储吗?
有什么建议可以以合理的价格/质量获得这样的东西吗?
对于大多数服务器 CPU 来说,32GB 的 RAM 是一个很好的典型整数,但如果您正在查看 Xeon 5500 (Nehalem) CPU,请记住它们在每个 CPU 的 3 个 DIMM 组中进行了最佳配置,对于双插槽服务器,它们是 6 个 DIMM 的倍数,所以使用 24\48GB RAM 而不是 32GB,您会看到更好的性能。
有很多服务器需要 10 个磁盘,但我不能说您是否认为它们价格合理。我怀疑你会发现任何像 R300 这样需要 10 个磁盘的 1U - HP 的 360 G6 可以将 8 个 2.5 英寸 SFF 驱动器塞进 1U,基本标价刚刚超过 2000 美元。戴尔的 R610 大致相当(它也是一个 1U双路至强 5500 系统),但内部只有 6 个驱动器。即使您升级到 DL380\R710 2U 级服务器
HP ML370 G6 等机架式塔式机的基本售价约为 2.5 万美元,但最多可容纳 24 个驱动器。戴尔的 T710 运行到 16 左右。
以上价格是带有 1 个 CPU、无磁盘且几乎没有 RAM 的机箱的最低标价。配置了这些驱动器、24 GB RAM 和双 Xeon E5540 CPU 的 HP ML370 的标价约为 10,000 美元。其中大部分来自您的驱动器选择——您可能会通过选择单插槽变体节省大约 1500 美元\2000 美元,但 RAM 的边际成本可能会增加,因为 4GB DDR3 DIMM 每 GB 比 2GB 贵 50%模块。
编辑添加一些性能比较的想法。
与现有 CPU 相比,Xeon 5540 2.53Ghz CPU 的时钟频率将提高约 50%。使用 SQL 2005 的双插槽设置应该可以合理有效地扩展,因此在纯 CPU 方面,像上面列出的双插槽系统将具有大约 3 倍于 R300 的 cpu 功率。
使用平衡的 DDR3 RAM @ 1066Mhz 设置,您应该会看到大约 3 倍的内存带宽,可能更多,因为我怀疑您当前的 R300 设置不是最佳的。
在磁盘性能方面,您将有效随机 IO 容量至少增加了 5 倍(显然足够了),但是通过添加一个不错的高级 RAID 控制器并正确隔离功能,您可能会看到比以上更好的性能改进那。
当前(几乎)所有基于 Xeon 5500 的系统中使用的 Tylersburg 芯片组也将内存 IO 和其余部分分开,这很难量化,但总是会有一些好处。
这些系统比您现有的设置快很多倍,但是这是否真正转化为您的用户的性能改进取决于您当前的瓶颈是什么。如果它是一个设计不佳的应用程序或网络拥塞,单独加强服务器不会带来如此明显的收益。
如果您有很多磁盘,例如某种形式的 SAN,那么 RAID10 是显而易见的选择,因为它结合了速度和容错性。但是在大多数情况下,服务器中可以安装的磁盘数量是有限的,在这种情况下,您需要考虑使用 RAID5 作为替代方案。
您的 4 磁盘 RAID10 阵列的速度与 2 磁盘 RAID0 的速度大致相同,或者比未RAID 磁盘的速度略低两倍,因此它们不会那么快。改用 4 磁盘 RAID5 将使阵列具有更快的流式读写速度,但随机存取写入速度稍慢(我已经在 Dell Perc5/i 控制器上对此进行了测试,我认为其他控制器也是如此)。
我会考虑将您的 10 个磁盘用作 6 磁盘 RAID10 和 4 磁盘 RAID5。将 RAID5 拆分为一个小的 C: 分区用于操作系统,其余为 D: 分区用于日志文件。日志倾向于按顺序写入,因此较慢的随机访问速度不是这样的问题。将数据放在 RAID10 上,他们将受益于高随机访问速度,尤其是高随机访问写入速度。
注意我不建议您将磁盘组织为 RAID10 和 RAID5,但是我建议您使用这种格式的磁盘进行测试,并将速度与您建议的 RAID1 + RAID10 + RAID10 进行比较。
JR
在我开始购买硬件之前,我会使用性能监视器进行一些调查,以确保磁盘滞后。如果性能问题是由那些“自动客户端”阻塞引起的,您可能会发现新服务器上的性能与您现在的性能并没有太大区别。
编辑#1:我喜欢看平均。磁盘秒/传输数。这些本质上是对驱动器延迟的度量。我曾经使用队列编号,但您应该将它们除以 RAID 阵列中的主轴数。你并不总是知道这个数字,尤其是 SAN 存储,Microsoft Ninjas 告诉我放弃队列深度数字,早在 2002 年左右。
(通常,我会查看秒/传输数、每秒读取和写入数(它们可以很好地了解磁盘的运行情况)以及逻辑和物理页面读取值(有助于发现其他一些非SQLServer 事情正在使用磁盘,而当 SQL 只是从 RAM 中扫描大量数据时。最后一个值在 SQL 计数器下,而不是磁盘计数器下。当然,对于每个可用内核(而不是“全部的”)。
平均 磁盘秒/传输值,我只是寻找数据驱动器的平均值低于 50 毫秒,日志驱动器的平均值低于 20 毫秒。请注意,您当前的设置在相同的主轴上具有操作系统和日志,这意味着它们将争夺驱动器磁头的控制权,这将增加您的延迟。
请注意,数据库的高读取率可能仅意味着索引错误。在网络论坛上解决索引问题非常困难。新盒子里有这么多 RAM,您可能最终会将几乎所有数据都存储在 RAM 中。这将减少磁盘上的负载,但是您可能会发现自己的处理器利用率很高,因为 SQL 仍然需要扫描所有这些数据;它只是在 RAM 中,而不是在磁盘上。将它放在 RAM 中会比在磁盘上快,但它仍然会比索引良好的数据库慢。
另外,我会尝试将我的数据和 tempdb 保存在不同的主轴集上,因为当您对 tempdb 进行大量写入时,通常意味着您正在对数据进行大量读取(例如 select * into #report from huge_table,或可能对大型结果集使用 distinct 或 group by)。如果您的应用程序没有过多地使用 tempdb,那么它可能并不重要。
对于经过良好调整的 SQL Server,您不需要将整个数据库存储在 RAM 中。我的服务器具有 12 GB 的 RAM,可提供 100 GB 的数据。
此外,您可以通过为操作系统使用 10KRPM 驱动器来节省一点钱。一旦 SQL 启动并运行,它根本不应该接触引导驱动器。
如果我在您的位置,我最担心的是您当前的设置缺乏 RAID 冗余,其次是该 USB 驱动器上的(可能)较长的备份时间。
如果我被那个 USB 驱动器卡住了一段时间,我可能会考虑每周进行一次完整备份,然后每天进行一次差异备份。根据您的数据在任何一天真正发生了多少变化,这应该会减少您必须移动到 USB 驱动器的数据量。
这么多的问题...
这是专用的 SQL Server 吗?(应该是!)32GB RAM 很好,CPU 看起来也很好......
这个服务器是只托管这个单一的数据库,还是被许多具有不同数据库的应用程序使用?
服务器的工作量是多少?每秒有多少事务(读/写)?
数据有多重要?如果它非常重要(即 - 不能丢失它),则将构建偏向冗余。如果它必须 100% 可用(无停机时间),则偏向于弹性(并获得更大的预算)。如果它只是一个性能数据库(即数据仓库),那么您可以针对性能进行优化。
您必须查看性能计数器以找出当前瓶颈所在。高磁盘 I/O 和磁盘队列?高CPU?(通常由有限的 RAM 和上下文垃圾引起)
SQL代码写对了吗?我已经看到大型机器(而你的机器相当大)因糟糕的 SQL 代码而瘫痪,而小型机器(1 个 CPU,1GB RAM)运行着编写良好且繁忙的数据库的负载。
一般来说,远离 RAID 5(你的数据库足够小,不需要额外的容量),RAID10 是最好的。
在不同的驱动器阵列上分离 DATA 和 TEMP。
您应该为 LOGS 使用双驱动器 RAID 1,为 TEMP 使用双驱动器(在两个驱动器上创建与 CPU 一样多的 TEMP 数据文件),然后 DATA 可以位于更大的 4 到 6 RAID10 阵列上。