最大限度地增加您的内存。拥有大量空闲内存将提高您的虚拟内存性能(而且 Unix 比 Windows 更有效地利用额外的内存)。幸运的是,由于现在 RAM 非常便宜,即使您在节俭开支,一到三个千兆字节的内存也不太可能超出您的预算。
大多数人认为处理器是指定任何类型个人计算机系统时最重要的选择。但是对于 Linux 下的典型工作负载,处理器类型几乎是转移注意力的东西——指定一个功能强大的系统总线和磁盘 I/O 子系统要重要得多。如果您不相信这一点,您可能会觉得在您使用机器时保持 top(1) 运行一段时间会很有启发。请注意 CPU 空闲百分比很少降至 90% 以下!
的确,人们在升级主板后经常报告吞吐量增加。但这通常更多是由于与处理器升级相关的其他变化,例如改进的缓存内存或系统前端总线时钟速度的提高(使数据能够更快地进出处理器)。
如果您在固定预算下为 Linux 购买硬件,那么为了获得更快的总线和磁盘子系统而牺牲一些过剩的处理器时钟是有意义的。如果您正在构建一台怪兽级的改装车,那就去购买最快的可用处理器吧——但是一旦您克服了对大数字的这种发烧友般的渴望,就要仔细关注总线速度和您的磁盘子系统,因为那才是您获得重要性能提升的地方。处理器速度和 I/O 子系统吞吐量之间的差距在过去五年中只会越来越大。
它在 2010 年如何转化为一个配方?像这样;如果您正在构建一台改装车,
务必购买一台具有最快的可用“前端”(例如,处理器到内存)总线的机器。
务必购买您能找到的最快的 SATA 磁盘。
为了获得最快的磁盘,请密切关注平均寻道时间和延迟时间。前者是寻道到任何磁道的平均时间;后者是磁道上任何扇区到达磁头下方的最大时间,并且是磁盘转速的函数。
在这些因素中,平均寻道时间远更重要。当您运行 Linux 或任何其他虚拟内存操作系统时,快一毫秒的寻道时间可以使系统吞吐量产生非常显着的差异。在 PC 处理器速度足够慢以进行比较时(并且我当时运行的是 System V Unix),它很容易相当于处理器速度提高 30MHz。今天,相应的数字可能高达 300MHz!
制造商自己通过垂直堆叠盘片而不是增加盘片尺寸来避免在大容量驱动器上增加寻道时间。因此,寻道时间(与盘片半径和磁头运动速度成正比)在同一产品线中的不同容量之间往往是恒定的。这很好,因为它意味着您不必担心容量与速度之间的权衡。
平均驱动器延迟与磁盘的转速成反比。多年来,大多数磁盘的转速为 3600 rpm;现在大多数磁盘的转速为 7,200 或 10,000rpm,高端磁盘的转速为 15,000 rpm。这些高速旋转磁盘会变得非常热;散热正成为驱动器设计中的一个关键制约因素。
多年来,您的基本决定是在 SATA 与 SCSI 之间(较旧的 IDE 和 EIDE 总线早已过时)。在 2009 年不是这样了;SATA 3 设备和控制器的性能已经足够好,除非您正在设计超高端服务器机箱,否则 SCSI 的性能优势很小——传输速度略快(320MB/s 对 300MB/s)和略好的持续吞吐量。
即使从像我这样经验丰富的 SCSI 支持者的角度来看,对于家庭组装者来说,额外的控制器和更昂贵的磁盘所带来的 SCSI 价格溢价也不再值得。因此,我已经删除了我过去在这里携带的大部分详细的 SCSI 信息。
最后说明:固态硬盘即将作为 SATA 磁盘的替代品出现在市场上,但每兆字节的价格仍然很高,以至于它们目前仅以小容量部署在上网本上。请关注这个领域。
(本节由 Perry The Cynic 提供,<perry@sutr.cynic.org>;它写于 1998 年。我自己的经验与他的观点非常一致。我自那以后修改了其中的数字以反映最新的发展。)
构建一个良好的 I/O 子系统可以归结为两个主要点:选择匹配的组件,这样您就不会在没有任何好处的情况下过度构建任何部件,并且构建整个管道,使其能够满足您的操作系统/应用程序组合的需求。
重要的是要认识到 “平衡” 不仅相对于特定的处理器/内存子系统,而且还相对于特定的操作系统和应用程序组合。运行整个 TCP/IP 服务器套件的 Unix 服务器机器的 I/O 要求与视频编辑工作站的 I/O 要求截然不同。对于 “大客户”,一位优秀的顾问会采样 I/O 组合(通过读取现有的系统性能日志或进行新的测量),并计算出 I/O 系统需要多大才能满足该应用程序组合。这不是您典型的 Linux 买家想要做的事情;首先,应用程序组合不是静态的,并且会随着时间而变化。因此,您将要做的是设计一个内部匹配的 I/O 子系统,并在您愿意花费的资金范围内提供最大的潜在 I/O 性能。然后您查看价格点,并将它们与内存子系统的价格点进行比较。这是机箱内部最重要的权衡。
因此,现在的工作是设计和购买一个与您的预算良好匹配的 I/O 子系统,以提供最佳性价比。磁盘 I/O 的两个主要性能指标是延迟和带宽。延迟是程序必须等待多长时间才能获得它请求的一小块随机数据。带宽是一旦您完成了第一块数据后,可以从/向磁盘发送多少连续数据。延迟以毫秒 (ms) 为单位测量;带宽以兆字节每秒 (MB/s) 为单位测量。显然,第三个感兴趣的数字是您的所有磁盘加起来有多大(您有多少存储空间),以千兆字节 (GB) 为单位。
在一个相当大的范围内,最大限度地减少延迟是最重要的。每减少一毫秒的有效延迟都会使您的系统感觉明显更快。另一方面,带宽只有在您从磁盘上吸取一大块连续数据时才对您有帮助,这种情况很少发生在大多数程序中。您必须牢记带宽以避免不匹配的部件,因为(显然)管道中最低的可用带宽会限制其他一切。
我将忽略 IDE。IDE 不适用于多处理系统,这是肯定的。如果您不关心其性能,您可以使用 IDE CD-ROM,但如果您关心您的 I/O 性能,请选择 SCSI。(请注意,如果您在 Linux 下将 IDE CD-ROM 与 SCSI 驱动器混合使用,您将必须运行一个有点不稳定的 SCSI 仿真层。)
让我们先看看磁盘。每当您认真考虑磁盘时,获取其数据表。每个信誉良好的制造商都在其网站上提供数据表;只需读取产品代码并按照指示操作即可。注意您可能在广告中看到的数字(“<12ms 快速!”);这些人经常在数据表上寻找最低/最高的数字,并将它们粘贴到广告文案中。通常不是不诚实,而是无知。
您需要了解磁盘的是
它有什么类型的 SCSI 接口?寻找“快速”、“超高速”和“宽带”。忽略标有“光纤”的磁盘(这是一种不适用于小型计算机内部的特殊物理层)。请注意,您经常会发现具有不同接口的相同磁盘。
“典型寻道”时间是多少(毫秒)?确保您获得“典型”值,而不是“磁道到磁道”或“最大”或其他一些度量(由于磁头稳定时间等原因,这些度量之间没有明显的关联)。
转速是多少?这通常是 4500、5400、7200、10000 或 15000 rpm(每分钟转数)。还要查找“旋转延迟”(以毫秒为单位)。(在紧急情况下,平均旋转延迟约为 30000/rpm 毫秒。)
“介质传输速率”或速度是多少(以 MB/s 为单位)?许多磁盘会有一系列数字(例如,7.2-10.8MB/s)。不要将此与“接口传输速率”混淆,后者始终是一个整数(10 或 20 或 40MB/s),并且是 SCSI 总线本身的速度。
这些数字将使您能够对磁盘进行同类比较。请注意,它们在同一磁盘的不同尺寸型号上会有所不同;通常,较大的磁盘具有较慢的寻道时间。
现在,这一切意味着什么?首先是带宽:“介质传输速率”是在理想条件下,您可以每秒从磁盘上获取多少数据。这主要取决于转速;磁盘旋转得越快,单位时间内通过磁头下方的数据就越多。这限制了该磁盘的持续带宽。
更有趣的是,您的有效延迟是典型寻道时间和旋转延迟的总和。因此,对于具有 8.5ms 寻道时间和 4ms 旋转延迟的磁盘,您可以预期在磁盘“想要”读取您的数据的那一刻到它实际开始读取数据的那一刻之间花费大约 12.5ms。这是您试图使其变小的数字。因此,您正在寻找具有低寻道时间和高转速 (RPM) 的磁盘。
为了进行比较,我购买的第一个硬盘驱动器是一个 20MB 的驱动器,具有 65ms 的寻道时间和大约 3000RPM 的转速。软盘驱动器的寻道时间约为 100-200ms。CD-ROM 驱动器的寻道时间可以在 120ms(快)到 400ms(慢)之间。最好的 IDE 硬盘驱动器的寻道时间约为 10-12ms,转速为 5400 rpm。我所知道的最好的 SCSI 硬盘驱动器(Fujitsu MAM)的运行速度为 3.9ms/15000rpm。
快速、大容量的驱动器很昂贵。真正大容量的驱动器非常昂贵。真正快速的驱动器相当昂贵。另一方面,真正缓慢、小容量的驱动器很便宜,但性价比不高,因为制造外壳、运输驱动器和销售它们的成本并没有降低。
介于两者之间的是一个“最佳点”,即向任一方向(更便宜或更昂贵)移动都会使您的花费多于您获得的收益。最佳点随着时间推移(朝着更好的价值)而移动。如果您可以付出努力,请去您当地的电脑超市,并写下他们出售的十几个左右的“裸”驱动器。(如果他们至少没有出售十几个裸硬盘驱动器,那就找一家更好的商店。使用网络,卢克!)将成本与尺寸、寻道和转速绘制成图表,通常就会很明显应该购买哪些驱动器来满足您的预算。
请注意商店中的特价商品;许多超市从制造商那里购买库存过剩的商品。如果这接近最佳点,那么它通常会比同类驱动器便宜得令人惊讶。只需确保您了解保修程序即可。
请注意,如果您需要大量容量,那么您最好使用两个(或更多)驱动器,而不是单个更大的驱动器。它不仅可能更便宜,而且您最终会得到两个独立的磁头组件,它们可以独立移动,这可以在很大程度上减少延迟(见下文)。
如果您发现自己处于带宽游戏的高端,请注意 PCI 总线本身的理论最大值是 132MB/s。这意味着双超高速/宽带 SCSI 控制器 (2x40MB/s) 可以占用 PCI 总线带宽的一半以上,因此不建议在该组合中添加另一个快速控制器。实际上,您的设备驱动程序最好写得很好,否则您的整个系统将会崩溃(比喻而言)。
顺便说一句,我使用的所有数字都是“最佳”带宽数字。实际情况通常在标称值的 50-70% 之间,但事物往往会相互抵消——驱动器的传输速度不如它们可能的速度那么快,但 SCSI 总线也有开销,控制器卡也是如此。
无论您有一个磁盘还是多个磁盘,在一个或多个 SCSI 总线上,您都应该仔细考虑它们的分区布局。给定一组磁盘和控制器,这是您将做出的最关键的性能决策。
分区是磁盘上连续的扇区组。分区通常从外部开始并向内进行。一个磁盘上的所有分区共享一个磁头组件。这意味着,如果您尝试在磁盘的第一个和最后一个分区上重叠 I/O,则磁头必须在磁盘上来回全行程移动,这可能会大大增加寻道时间延迟。位于分区堆栈中间的分区可能具有最佳的寻道性能,因为最坏的情况是磁头只需要移动一半的距离才能到达那里(并且它们很可能无论如何都在该区域附近)。
在可能的情况下,将竞争的分区拆分到不同的磁盘上。例如,/usr 和交换分区应尽可能放在不同的磁盘上(除非您有大量的 RAM)。
另一个复杂之处是,大多数现代磁盘都使用“区域扇区划分”。结果是外部分区将比内部分区具有更高的带宽(每次旋转磁头下方有更多数据)。因此,如果您需要一个用于数据流的工作区(例如,要记录的 CD-R 预映像),它应该放在快速旋转磁盘的外部(编号较早)分区上。相反,将很少使用、对性能要求不高的分区放在内部(最后)是一个好的约定。
啊,是的,缓存。您可以在三个主要点缓存 I/O 缓冲区:操作系统、机器中的控制器卡或芯片以及磁盘上的控制器。智能操作系统缓存是迄今为止最大的胜利,原因有很多。控制器卡上的 RAM 缓存现在几乎毫无意义;您不应该为它们支付额外的费用,如果您喜欢摆弄,可以尝试禁用它们。
驱动器本身的 RAM 缓存情况好坏参半。在中等大小(1-2MB)时,它们对于 Windows 95/98 来说可能是一个很大的优势,因为 Windows 具有愚蠢的 VM 和 I/O 驱动程序。如果您运行像 Linux 这样的真正的多任务操作系统,那么在磁盘上拥有统一的 RAM 缓存是一个重大损失,因为重叠的 I/O 线程会将彼此从缓存中踢出,并且磁盘最终会做无用功。
大多数高性能磁盘都可以重新配置(使用模式页面参数,见上文)以具有“分段”缓存(有点像组相联存储器缓存)。如果配置正确,RAM 缓存可能是一个适度的胜利,不是因为磁盘上的缓存有多么出色(它在操作系统中要好得多),而是因为它允许磁盘控制器更灵活地重新安排其 I/O 请求队列。除非您通常有 >2 个 I/O 请求在 SCSI 级别挂起,否则您不会真正注意到它。传统智慧(两种方式都尝试一下)适用。
最后,我确实必须做出免责声明。上面很多东西都是无耻的简化。实际上,高性能磁盘是非常复杂的野兽。它们运行小型迷你操作系统,如果它们同时有 10-20 个 I/O 请求挂起,它们会最舒服。在这些情况下,摊销的全局延迟会大大减少,尽管任何单个请求都可能经历比仅有一个请求挂起时更长的延迟。唯一真正有效的分析是随机过程模型,我们真的不想在这里深入探讨。 :-)