Squid Web Cache Wiki

Squid Web Cache 文档

🔗 Feature: Rock Store

🔗 范围

大型、繁忙的网站需要一种磁盘存储方案,该方案能够接近现代系统(拥有 8+GB RAM、4+ CPU 核心和 4+ 个专用、75+GB、10K+ RPM 磁盘)的硬件极限。Rock Store 旨在利用从 COSS(写寻道优化)和 diskd(SMP 可扩展性)中学到的经验,同时测试和实现新的优化技术,来提供这种存储。

🔗 当前状态

🔗 架构

当前设计包含以下主要组件

如果未使用 Rock diskers,Squid 工作进程可以共享内存缓存。

未来的实现可能会最终消除共享 I/O 页和共享内存缓存之间的复制,但这将需要更改 Squid 中的低级内存缓存结构,这将非常困难。

🔗 缓存日志消息

本节详细介绍了与 Rock 存储相关的部分 cache.log 消息。

🔗 Worker I/O push queue overflow: ipcIo1.5225w4

一个工作进程试图存储 MISS 或加载 HIT,但由于 disker 的 I/O 请求队列已满而失败。用户可见的影响取决于问题发生的时间和方向

如果这些警告持续存在,那么您将使磁盘过载,降低命中率,并增加命中罕见错误恢复代码中 bug 的可能性。您应该调整您的 Squid 以避免这些警告。

除了过载之外,另一个可能导致这些警告的原因是 disker 进程死亡。目前尚不清楚 Squid 是否能够很好地从这种情况中恢复,即使 Squid 主进程重启了 disker。

🔗 WARNING: abandoning N I/Os after at least 7.00s timeout

一个工作进程发现其 N 个 I/O 请求在 disker 队列中等待超时(无响应)。用户可见的影响取决于问题发生的时间和方向。所有“Worker I/O push queue overflow”警告的影响都适用于此处,此外还有以下注意事项:

除了过载之外,另一个可能导致这些警告的原因是 disker 进程死亡。目前尚不清楚 Squid 是否能够很好地从这种情况中恢复,即使 Squid 主进程重启了 disker。

🔗 WARNING: communication with disker may be too slow or disrupted for about 7.00s; rescued N …

一个工作进程意外发现其 N 个 I/O 请求已准备好进行处理,但正在等待 disker 发出的“检查结果队列!”通知,而该通知从未到来。被救援的 I/O 请求现在将正常进行,但它们已暂停一段时间,这可能会影响最终用户,尤其是在 HIT 时。此外,如果由于持续过载条件或 disker 死亡而丢失了 disker 通知,这种临时恢复从长远来看将无济于事。

🔗 性能调优

Rock Store 是为高性能磁盘缓存环境而开发的。这影响了作者所做的各种权衡。

Rock diskers 的工作速度尽可能快。如果它们比 Squid 工作进程产生的 swap 负载慢,那么磁盘队列将增长,导致溢出和超时警告。

    2011/11/15 09:39:36 kid1| Worker I/O push queue overflow: ipcIo1.5225w4
    2011/11/15 09:39:42 kid1| WARNING: abandoning 217 I/Os after at least 7.00s timeout
    2011/11/15 09:39:42 kid2| WARNING: communication with disker may be too slow or disrupted for about 7.00s; rescued ...

当您的操作系统文件系统缓存大量磁盘写请求到 RAM,然后进入写狂热状态时,很可能会出现类似的问题,通常会阻止所有执行 I/O 的进程,包括 Squid diskers。通过仔细调整文件系统参数以防止写入请求过度聚合,可以避免或最小化这些问题。通常,仅调整文件系统不足以解决问题,您的磁盘仍然会落后于工作进程。

当您的磁盘无法跟上提供的负载时,您应该在 Rock cache_dir 行中添加 max-swap-rateswap-timeout 选项。在大多数情况下,您需要这两个选项,或者都不需要。第一个选项告诉 Squid 调整 Rock cache_dir 的流量(在必要时人为延迟 I/O 以防止交通堵塞),第二个选项告诉 Squid 何时应避免磁盘 I/O,因为这需要“太长时间”。

最佳值取决于您的负载、硬件和命中延迟容差,因此无法为所有情况提供单一公式,但有一个算法您可以作为起点。

  1. 设置 max-swap-rate 以限制每秒平均 I/O 次数。如果您使用专用的普通现代磁盘,请使用 200/秒。如果您的磁盘非常快且寻道时间优于平均水平,请使用 300/秒。如果您的磁盘不太好,请使用 100/秒。
  2. 设置 swap-timeout 以限制 I/O 等待时间。超时值越低,您获得的磁盘命中次数就越少,因为存储和加载的对象将越少。另一方面,过高的值可能会导致命中比未命中更慢。请记住,配置的超时值是与预期的 swap 等待时间(包括排队延迟)进行比较的。它 *不是* 您的磁盘执行单个 I/O 所需的时间(如果一切都平衡,平均单个 I/O 将需要 *1/max-swap-rate* 秒)。如果您不知道从哪里开始,请从 300 毫秒开始。
  3. 尝试配置的值,但 *不要被* 最初的出色性能所迷惑。在许多环境中,您将获得出色的结果,直到操作系统开始将缓存的 I/O 请求写入磁盘。使用 iostat 或类似的性能监控工具来观察写入 *是否* 已写入磁盘。使用 iostat 或类似的工具来测量磁盘负载,通常报告为“利用率”百分比。归档您的测量结果。
  4. 如果您的测量磁盘利用率经常超过 90%,则降低 max-swap-rate。如果命中感觉太慢,则降低 swap-timeout。如果 Squid 警告队列溢出,则降低其中一个或两者都降低。您可以使用 extreme 值,例如 max-swap-rate=1/sec,来检查问题是否可以通过此方法解决。每次更改后重复测试。
  5. 如果您的测量磁盘利用率从未高于 80%,则增加 max-swap-rate。如果您可以容忍较慢的命中,则增加 swap-timeout。您可以完全删除限制以检查它们是否真的有必要。每次更改后重复测试。

一如既往,一次只更改一件事通常是个坏主意:耐心是一种美德。不幸的是,大多数 Rock cache_dir 参数在不停止 Squid 的情况下是无法重新配置的,这使得一次更改变得痛苦,尤其是在实时部署环境中。请考虑首先在现实的实验室环境中进行基准测试和调优 Squid。

理想情况下,您应该构建一个数学模型,解释为什么您的磁盘性能是这样的,考虑到您的磁盘参数、cache_dir 设置和提供的负载。准确的模型消除了盲目实验的需要。

上述过程在某些情况下有效,但并非全部。您的体验可能会有所不同。

🔗 限制

🔗 附录:设计选择

该项目必须回答几个关键的设计问题。下表提供了问题和我们的决定。这些信息作为历史参考保留,可能已过时。

类别:功能

导航:站点搜索站点页面类别🔼 向上