Squid 或其他带有 SSD 缓存存储的 HTTP 缓存?

Squid 或其他带有 SSD 缓存存储的 HTTP 缓存?

我正在考虑在具有 SSD 驱动器的系统上设置 squid(或者可能是 varnish)缓存。

显而易见的好处是这些系统具有很快的读取速度并且我期望我的命中率相当高。

假设我可以将 7 个 SSD 放入 RAID 配置中。(有些情况下我可以放入更多东西)

实施问题:

  • 我应该使用 RAID0 吗?(我预计驱动器最终会出现故障,因此这看起来很危险。)

  • 我应该使用 RAID10 吗?(这会使我的磁盘占用空间减半,成本较高。)

  • 我应该使用 RAID5 吗?(众所周知,SSD 具有“糟糕”的写入性能和写入限制,并且所有额外的奇偶校验写入可能会大大降低其速度。)

  • 我是否应该将每个磁盘视为它自己的 Squid 数据存储?(Squid 如何处理多个数据存储?如果一个发生故障会发生什么?)

  • 我是否应该忽略数据存储,而只将 SSD 放入大型 SWAP 分区并让 Linux VM 执行其操作?(似乎有些草率)

非常感谢在生产环境中使用 SSD 的人员提供的任何建议。(特别是如果您将它们用于 HTTP 缓存)

答案1

过去 9 个月,我们一直在 SSD 驱动器上使用 varnish,它的效果非常好。我们之前使用过带有 carp 层的 squid 内存缓存。它确实有效,但内存碎片化是一个真正的问题,需要频繁重启。Squid 2.x 也只使用一个核心,这使其在当前硬件上效率相当低下。

对于我们的网站,它非常支持缓存,我们发现在 8 核机器上,在 100Mbit/s 的流量下,CPU 使用率约为 10%。在我们的测试中,在达到 2 个 1Gb 端口的 CPU 限制之前,带宽就已经用完了。

我确实对使用 SSD 缓存运行 Varnish 有一些建议。

  • 随机写入性能确实很重要。在选择英特尔 x-25m 之前,我们尝试了多家 SSD 供应商。我们看到一些帖子称 4k 随机写入速度低至 0.1MB/s,而使用 x-25m 时,4k 随机写入速度达到 24MB/s。

  • Raid0。2.0 中的缓存不是持久性的,因此无需担心冗余。这确实会导致重启,但这种情况很少见。您可以执行诸如加载新配置和清除对象等操作而无需重启。

  • mmap 模式。Varnish 缓存可以映射到文件或使用交换空间。使用交换对我们来说效果不佳,它倾向于使用更多的 i/o 带宽来处理相同数量的流量。Linux swapin 代码中有 4 个扇区预读,我们编写了一个补丁来删除它,但尚未在生产中尝试过。

  • 截止期限调度程序。使用 2.6.28+ 版本,它可以识别 SSD,并且性能良好。我们尝试了 noop,但发现截止期限更公平,因为 I/O 带宽变得有限。

  • 禁用预读。由于没有旋转延迟,没有必要只因为可能需要而读取额外的数据。在这些事情上,输入/输出带宽非常宝贵。

  • 运行 2.6.28+。Linux 上大量空间的 mmap 为内存管理器提供了良好的锻炼,但分割 lru 补丁有很大帮助。当我们更新时,kswapd cpu 使用率下降了很多。

我们已经发布了我们的 vcl 文件以及我们与 varnish 一起使用的几个工具链接文本。vcl 还包含一个巧妙的 hack,它基于 maxmind 数据库实现了一个非常快速的 geoiplookup 服务器。

答案2

我没有使用 SSD 作为 HTTP 缓存,但我可以做出以下观察:

并非所有 SSD 都一样,因此您必须非常小心地选择合适的 SSD。FusionIO 制造的 PCIe 支持的 SSD 性能确实很高端(容量相对较低),但价格昂贵。英特尔的 X25-E SLC SSD 性能确实很好,而且价格更实惠,但容量仍然较低。做好研究吧!我绝对可以推荐 X25-E SLC 变体,因为我在生产系统中使用这些变体。

市面上还有其他 SSD 可以为您提供出色的顺序读写速度,但对于缓存之类的东西来说,重要的是随机 IO,而许多 SSD 提供的随机性能与旋转磁盘大致相同。由于 SSD 的写入放大效应,旋转磁盘通常性能更好。许多 SSD 的控制器质量较差(例如,较旧的 JMicron 控制器),在某些情况下可能会严重降低性能。Anandtech 和其他网站使用 iometer 等工具进行了很好的比较,请查看那里。

当然,SSD 体积很小。我认为英特尔 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 缓存中。只需为机器提供更多 RAM 即可显著减少磁盘负载。如果您正在运行大型 squid 缓存,您可能需要大量磁盘空间,而高性能 SSD 的容量仍然相对较低。

答案3

我不太熟悉 SSD 驱动器,但我可以谈谈我使用过的架构类型,这可能会帮助解决您的一些问题。

兄弟姐妹

在我的例子中,我构建了四台服务器,每台服务器有 16GB 的 RAM。我将 9GB 设置为 Squid 使用的内存缓存。我将它们配置为一组兄弟服务器,这样对一台服务器的查询将在查找数据之前查询其他服务器。总共我有 36GB 的内存缓存。我不会让四个兄弟服务器超过这个数量,因为它们之间的通信会开始陷入困境。

贵宾

我为四台服务器配置了一个 VIP,以便客户端可以与之通信。这解决了当一台服务器宕机时会发生什么问题。

孩子们

我将 Web 应用程序设置为查询在 127.0.0.1 上运行的本地 Squid 服务器。然后将此 Squid 实例的父实例配置为 VIP。这样,如果整个 VIP 发生故障,就可以非常快速地进行故障转移。如果父实例没有响应,子实例将直接查询服务。如果您使用的是单个 Squid 服务器并且没有 VIP,这也很方便。当然,如果您 Web 服务器上的本地 Squid 实例发生故障,一切都会停止。

鱿鱼本身

我还没有真正研究过 3.0,但 2.x 仍然是单线程的。在某个时候,你会用完 CPU 或 TCP 缓冲区。如果可能的话,我会将缓存分散到 2-3 个更少的盒子上。此外,如果你看到系统增长,你可能希望制定计划在未来对 Squid 农场进行分区。

无论如何,祝你 SSD 构建顺利。我很想知道结果如何,因为我将来可能会走这条路。

答案4

Squid 文档建议不要使用 RAID,而是在其他磁盘上设置额外的缓存目录。

相关内容