Squid Web Cache Wiki

Squid Web Cache 文档

🔗 特性:磁盘守护进程 (diskd) 辅助程序

🔗 什么是 DISKD?

DISKD 指的是 Squid-2.4 及更高版本中用于提高磁盘 I/O 性能的一些功能。基本思想是每个 cache_dir 都有自己的 diskd 子进程。diskd 进程执行 cache_dir 的所有磁盘 I/O 操作(打开、关闭、读取、写入、删除)。消息队列用于在 Squid 和 diskd 进程之间发送请求和响应。共享内存用于读取和写入数据块。

🔗 性能是否更好?

是的。我们在“第二次 IRCache Bake-Off”活动中对支持 DISKD 的 Squid-2.4 进行了基准测试。在测试中,我们使用 diskd 达到了每秒 160 个请求。如果没有 diskd,我们大约只能达到每秒 40 个请求。

:warning: 在现代 Linux 系统上,磁盘守护进程已被极其快速的 AUFS 取代。diskd 仍然推荐用于 BSD 变体。然而,我们可能在 squid 中发现了一个实现错误,该错误在 BSD 上拖慢了 AUFS 的性能。

🔗 如何使用它?

您需要运行 Squid 版本 2.4 或更高版本。您的操作系统必须支持消息队列和共享内存。

要为 DISKD 配置 Squid,请使用 –enable-storeio 选项。

% ./configure --enable-storeio=diskd,ufs

🔗 FATAL:未知 cache_dir 类型 ‘diskd’

您没有按照上面的说明将 diskd 添加到 storeio 模块列表中。您需要运行 configure 并重新编译 Squid。

🔗 如果我使用 DISKD,是否必须清除我当前的缓存?

不需要。Diskd 使用与标准“UFS”类型相同的存储方案。它只改变 I/O 的执行方式。

🔗 如何配置消息队列?

大多数 Unix 操作系统默认都支持消息队列。一种检查方法是查看您是否具有 ipcs 命令。

但是,您很可能需要增加 Squid 的消息队列参数。消息队列实现通常有以下参数:

Squid 和 diskd 之间的消息对于 32 位 CPU 是 32 字节,对于 64 位 CPU 是 40 字节。因此,MSGSSZ 应为 32 或更大。为安全起见,您可能希望将其设置为更大的值。

每个 cache_dir 我们将有两个队列——每个方向一个。因此,MSGMNI 需要至少是 cache_dir 数量的两倍。我发现每个队列 75 条消息大约是性能良好的极限。如果每个 diskd 消息仅包含一个段(取决于您的 MSGSSZ 值),则 MSGSEG 应大于 75。MSGMNB 和 MSGTQL 影响队列中一次可以有多少条消息。Diskd 消息不应超过 40 字节,但为安全起见,我们使用 64 字节。MSGMNB 应至少为 64*75。我建议向上舍入到最接近的 2 的幂,或 8192。MSGTQL 应至少是您将拥有的 cache_dir 数量的 75 倍。

🔗 FreeBSD

您的内核必须具有:

options         SYSVMSG

您可以在内核中按如下方式设置参数。这只是一个示例。请确保值适合您的系统。

options         MSGMNB=8192     # max # of bytes in a queue
options         MSGMNI=40       # number of message queue identifiers
options         MSGSEG=512      # number of message segments per queue
options         MSGSSZ=64       # size of a message segment
options         MSGTQL=2048     # max messages in system

🔗 OpenBSD

您可以在内核中按如下方式设置参数。这只是一个示例。请确保值适合您的系统。

option          MSGMNB=16384    # max characters per message queue
option          MSGMNI=40       # max number of message queue identifiers
option          MSGSEG=2048     # max number of message segments in the system
option          MSGSSZ=64       # size of a message segment (Must be 2^N)
option          MSGTQL=1024     # max amount of messages in the system

🔗 如何配置共享内存?

共享内存使用与消息队列类似的参数集。Squid DISKD 实现为每个 cache_dir 使用一个共享内存区域。每个共享内存区域大约为 800 千字节。您可能需要修改系统的共享内存参数。

对于 Squid 和 DISKD,SHMSEGSHMMNI 必须大于或等于您拥有的 cache_dir 数量。SHMMAX 必须至少为 800 千字节。SHMALL 必须至少为 800 千字节乘以 cache_dir 的数量。

请注意,某些操作系统以页为单位而不是字节为单位表示 SHMALL,因此如果需要,请务必将字节数除以页大小。使用 pagesize 命令确定系统的页大小,或者使用 4096 作为合理的猜测值。

🔗 FreeBSD

您的内核必须具有:

options         SYSVSHM

您可以在内核中按如下方式设置参数。这只是一个示例。请确保值适合您的系统。

options         SHMSEG=16       # max shared mem id's per process
options         SHMMNI=32       # max shared mem id's per system
options         SHMMAX=2097152  # max shared memory segment size (bytes)
options         SHMALL=4096     # max amount of shared memory (pages)

🔗 OpenBSD

OpenBSD 与 FreeBSD 类似,只是您必须使用 option 而不是 options,并且 SHMMAX 以页为单位而不是字节。

option         SHMSEG=16        # max shared mem id's per process
option         SHMMNI=32        # max shared mem id's per system
option         SHMMAX=2048      # max shared memory segment size (pages)
option         SHMALL=4096      # max amount of shared memory (pages)

🔗 有时共享内存和消息队列在 Squid 退出时不会被释放。

是的,这有时是个小问题。似乎操作系统在进程退出时,尤其是在异常退出时,会变得混乱,并不总是释放共享内存和消息队列资源。要解决此问题,您可以使用 ipcs 命令“手动”清除资源。将此命令添加到您的 RunCachesquid_start 脚本中。

ipcs | awk '/squid/ {printf "ipcrm -%s %s\n", $1, $2}' | /bin/sh

🔗 Q1 和 Q2 参数是什么?

在源代码中,它们被称为 magic1magic2。这些数字指的是消息队列上未完成的请求数量。它们在 cache_dir 选项行中指定,位于 L1 和 L2 目录之后。

cache_dir diskd /cache1 1024 16 256 Q1=72 Q2=64

如果未完成的消息数量超过 Q1,则 Squid 将故意使磁盘文件的读写操作失败。这是一种负载卸载机制。如果您的缓存非常繁忙且磁盘无法跟上,Squid 将绕过磁盘,直到负载再次下降。

如果未完成的消息数量超过 Q2,则主 Squid 进程会“阻塞”一小段时间,直到 diskd 进程处理部分消息并返回一些回复。

合理的 Q1 和 Q2 值为 64 和 72。如果您希望命中率高但响应时间差,请设置 Q1 > Q2。否则,如果您希望响应时间快但命中率差,请设置 Q1 < Q2。

类别:功能

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