🔗 特性:磁盘守护进程 (diskd) 辅助程序
- 状态:已完成。
- 版本: 2.4
🔗 什么是 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 个请求。
在现代 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 的消息队列参数。消息队列实现通常有以下参数:
- MSGMNB:每个消息队列的最大字节数。
- MSGMNI:消息队列标识符的最大数量(系统范围)。
- MSGSEG:每个队列的最大消息段数。
- MSGSSZ:消息段的大小。
- MSGTQL:消息的最大数量(系统范围)。
- MSGMAX:整个消息的最大大小。在某些系统上,您可能需要增加此限制。在其他系统上,您可能无法更改它。
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 千字节。您可能需要修改系统的共享内存参数。
- SHMSEG:每个进程的最大共享内存段数。
- SHMMNI:整个系统的最大共享内存段数。
- SHMMAX:允许的最大共享内存段大小。
- SHMALL:可用的共享内存总量。
对于 Squid 和 DISKD,SHMSEG 和 SHMMNI 必须大于或等于您拥有的 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 命令“手动”清除资源。将此命令添加到您的 RunCache 或 squid_start 脚本中。
ipcs | awk '/squid/ {printf "ipcrm -%s %s\n", $1, $2}' | /bin/sh
🔗 Q1 和 Q2 参数是什么?
在源代码中,它们被称为 magic1 和 magic2。这些数字指的是消息队列上未完成的请求数量。它们在 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。
类别:功能
导航:站点搜索,站点页面,类别,🔼 向上