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