我正在考虑在带有 SSD 驱动器的系统上设置 squid(或可能是清漆)缓存。
明显的好处是这些系统具有很高的读取速度,我希望我的命中率相当高。
假设我可以将 7 个 SSD 放入 RAID 配置中。(有些情况可以让我收拾更多东西)
实施问题:
我应该使用 RAID0 吗?(我预计驱动器最终会失败,所以这似乎很危险。)
我应该使用 RAID10 吗?(这将我的磁盘占用空间减半,这很昂贵。)
我应该使用 RAID5 吗?(众所周知,SSD 具有“糟糕”的写入性能和写入限制,所有额外的奇偶校验写入可能会大大减慢这一速度。)
我是否应该将每个磁盘视为它自己的 squid 数据存储?(鱿鱼处理多个数据存储的能力如何?如果/当一个失败时会发生什么?)
我是否应该忽略数据存储,只将 SSD 放入大型 SWAP 分区并让 linux VM 来做这件事?(看起来很草率)
非常感谢在生产环境中使用 SSD 的人们提供的任何建议。(尤其是如果您将它们用于 HTTP 缓存)
在过去的 9 个月里,我们一直在 ssd 驱动器上使用清漆,它对我们来说效果非常好。我们之前使用了带有 carp 层的仅 squid 内存缓存。它有效,但内存碎片是一个需要频繁重启的真正问题。Squid 2.x 也将只使用一个内核,这使得它在当前硬件上相当低效。
对于我们的站点,它对缓存非常友好,我们看到大约 10% 的 CPU 使用率在 8 核机器上提供 100Mbit/s 的流量。在我们的测试中,我们在使用 2 个 1Gb 端口达到 cpu 限制之前耗尽了带宽。
对于使用 ssd 缓存运行 varnish,我确实有一些建议。
随机写入性能真的很重要。在选择英特尔 x-25m 之前,我们尝试了几家供应商的 ssd 驱动器。我们已经看到了一些低至 0.1MB/s 的 4k 随机写入的帖子,我们使用 x-25m 获得了 24MB/s 的 4k 随机写入。
突袭0。2.0中的缓存不是持久化的,所以不用担心冗余。这确实使重新启动受到伤害,但这种情况很少见。您可以执行诸如加载新配置和清除对象等操作而无需重新启动。
地图模式。清漆缓存可以映射到文件或使用交换空间。使用交换对我们来说效果不佳,它倾向于使用更多的 i/o 带宽来服务相同数量的流量。linux swapin 代码中有一个 4 个扇区的预读,我们编写了一个补丁来删除它,但还没有在生产中尝试过。
截止日期调度程序。对于 2.6.28+,这是 ssd 感知并且表现良好。我们尝试了 noop,但发现最后期限更公平,因为 i/o 带宽变得有限。
禁用预读。由于没有旋转延迟,因此没有必要仅仅因为您可能需要它而读取额外的数据。i/o 带宽在这些事情上很宝贵。
运行 2.6.28+。Linux 上大量空间的 mmap 可以很好地锻炼内存管理器,但拆分 lru 补丁有很大帮助。当我们更新时,kswapd cpu 使用率下降了很多。
我们已经在链接文本中发布了我们的 vcl 文件以及我们与 varnish 一起使用的几个工具。vcl 还包括一个简洁的 hack,它实现了一个基于 maxmind 数据库的非常快速的 geoiplookup 服务器。
我没有将 SSD 用作 HTTP 缓存,但我可以进行以下观察:
并非所有的 SSD 都是平等的,因此您必须非常小心地挑选合适的 SSD。FusionIO 制造支持 PCIe 的 SSD,这些 SSD 性能非常高端(容量相对较低),但价格昂贵。英特尔的 X25-E SLC SSD 性能非常好,价格更实惠,但容量仍然很低。做你的研究!我绝对可以推荐 X25-E SLC 变体,因为我在生产系统中使用这些变体。
还有其他 SSDS 可能会为您提供出色的连续读/写速度,但对于缓存之类的东西而言,重要的是随机 IO,并且许多 SSD 将提供与旋转磁盘大致相同的随机性能。由于 SSD 上的写入放大效应,旋转磁盘通常性能更好。许多 SSD 的控制器质量较差(例如,较旧的 JMicron 控制器),在某些情况下性能会显着下降。Anandtech 和其他网站与 iometer 等工具进行了很好的比较,检查那里。
当然,SSD 很小。Intel X25-E,我认为它是我见过的最好的 SATA SSD,只有 32 GB 和 64 GB 两种版本。
对于 RAID 级别,标准 RAID 性能说明仍然适用。对 RAID 5 的写入主要涉及读取您要修改的数据块、读取奇偶校验块、更新奇偶校验、写入数据块和写入奇偶校验,因此它仍然会提供比其他 RAID 更差的性能水平,即使使用 SSD。但是,对于像 X25-E 这样的驱动器具有如此高的随机 IO 性能,这可能并不重要——因为对于类似大小的阵列,它在旋转磁盘上的性能仍将优于随机 IO。
据我所见,RAID 控制器带宽过早饱和,无法从 7 磁盘 RAID 集获得最大收益,至少就顺序性能而言。当前型号的 SATA 控制器(3ware、areca 等)的速度不能超过 800MB/s。跨多个控制器(例如,几个 RAID1 而不是单个 RAID10)拥有更多更小的阵列将改善这一点,尽管每个阵列的单独性能会受到影响。
关于 HTTP 缓存,我认为最好使用一组体面的旋转磁盘和大量 ram。经常访问的对象将保留在内存缓存中 - 无论是在 squid 的内部缓存中,还是在您的操作系统的 fs 缓存中。因此,简单地给机器更多的内存可以显着减少磁盘负载。如果您正在运行大型 squid 缓存,您可能需要大量磁盘空间,而高性能 SSD 的容量仍然相对较低。
我对 SSD 驱动器不是很熟悉,但我可以谈谈我使用过的那种架构,它可能有助于解决您的一些问题。
兄弟姐妹
在我的例子中,我构建了四台服务器,每台都有 16GB 的 RAM。我将 9GB 设置为 Squid 使用的内存缓存。我将它们配置为一组兄弟姐妹,因此对一个服务器的查询将在查找数据之前查询其他服务器。我总共有 36GB 的内存缓存。我不会超过四个兄弟姐妹,因为他们之间的交流开始陷入困境。
贵宾
我为四台服务器配置了一个 VIP 供客户与之交谈。这解决了当一台服务器出现故障时会发生的情况。
孩子们
我将我的 Web 应用程序设置为查询在 127.0.0.1 上运行的本地 Squid 服务器。然后将此 Squid 实例的父级配置为 VIP。这允许在整个 VIP 出现故障时非常快速地进行故障转移。如果父母没有回应,孩子会直接查询服务。如果您使用单个 Squid 服务器并且没有 VIP,它也很方便。当然,如果您的网络服务器上的本地 Squid 实例出现故障,一切都会停止。
鱿鱼本身
我还没有真正看过 3.0,但 2.x 仍然是单线程的。在某些时候,您将用完 CPU 或 TCP 缓冲区。如果可能的话,我会将缓存分布在少 2-3 个盒子中。此外,如果您看到系统不断增长,您可能希望将来计划对您的 Squid 农场进行分区。
无论如何,祝您的 SSD 构建好运。我很想知道结果如何,因为我将来可能会走这条路。
你为什么还要考虑raid 10或5。你想要这里的性能。您不在乎驱动器是否只是关闭,因为它只是一个缓存。
只需使用 raid 0 或将它们分开。我认为分开会更好,因为驱动器故障不会删除您的整个缓存。
Squid 文档建议不要使用 RAID,而是在额外的磁盘上设置额外的缓存目录。