Squid cache_dir
指令¶
cache_dir
¶
在 /etc/squid.conf
中,你可能会看到以下配置:
# Uncomment and adjust the following to add a disk cache directory.
cache_dir ufs /var/cache/squid 100 16 256
配置语法:
cache_dir Type Directory-Name Fs-specific-data [options]
上述简单配置中 100 16 256
分别代表:
100MB 缓存空间,也就是
/var/cache/squid
目录下的磁盘空间限制。注意,不要将整个磁盘空间都分配给squid缓存目录,通常只使用磁盘空间80%(也即是减去20%)
16
表示一级缓存子目录数量,默认是 16 ,此时你会看到在/var/cache/squid
目录下有16个子目录,分别是00 到 0F
256
表示二级缓存子目录数量,默认是 256,此时会看到每个一级缓存目录下有256个子目录用来真正存储缓存数据
上述配置表明设置了一个 /var/cache/squid
磁盘缓存目录。实际上,Squid支持更多的缓存目录,例如,存储服务器通常会有多块本地磁盘,可以充分发挥本地磁盘作为缓存目录:
cache_dir ufs /cache0 7000 16 256
cache_dir ufs /cache1 7000 16 256
cache_dir ufs /cache2 7000 16 256
cache_dir ufs /cache3 7000 16 256
cache_dir ufs /cache4 7000 16 256
备注
对于文件系统,不仅要考虑容量(capacity)还需要考虑inode。
我的实践案例¶
我在部署 私有云架构 使用 Squid 来作为局域网内部服务器的代理,希望能够解决多个相同系统的更新反复下载相同包浪费带宽的问题。不过,我也发现,对于非常大的包,例如 linux-firmware
(200+MB),squid代理缓存显然没有生效(每个服务器都在缓慢下载,明显不是代理缓存加速)。
简单找了一下配置案例,以及一些文档参考,综合如下:
...
# Squid normally listens to port 3128
http_port 3128
# Uncomment and adjust the following to add a disk cache directory.
#cache_dir ufs /var/cache/squid 10240 16 256
cache_dir aufs /var/cache/squid 10240 16 256
# cache object
cache_mem 800 MB
maximum_object_size 500 MB
maximum_object_size_in_memory 4 MB
# Leave coredumps in the first cache dir
coredump_dir /var/cache/squid
...
参数解析¶
cache_dir
指定缓存存放的磁盘目录,通常可以看到的存储格式有ufs
,aufs
,diskd
,coss
和null
。其中ufs
是默认格式,其他格式支持需要在编译./configure
指定--enable-storeio
选项。
aufs
适合多线程方式
在 cache_dir
配置行中 数值参数 10240 16 256
分别表示:
10240MB
的缓存 Quota一级缓存目录有
16个
二级缓存目录有
256个
注意,缓存大小不要超过磁盘可用空间的 80%
cache_mem
指定squid用于热点响应的内存使用量。默认cache_mem
是8MB
显然过小(这个值不是squid实际使用的内存值,下面有计算公式)
内存使用的最大空间大致是: 每 1GB
硬盘空间对应要求 14MB
内存,所以当 cache_mem
设置为 800MB
且磁盘缓存设置为 10GB
(上文配置为 10240
)时候,最大内存使用量大约为:
Tocal = (800MB * 3)+(14MB * 10) = 2400MB+140MB = 2540MB
maximum_object_size
是磁盘缓存最大对象文件,maximum_object_size_in_memory
是内存缓存最大对象文件
备注
我在实践中遇到 linux-firmware
大于200MB没有成功缓存,所以我这里修订为 500MB
的 maximum_object_size
看看下次更新时能否正确缓存。
磁盘缓存大小和进程大小关系¶
Squid磁盘空间使用直接和内存使用量相关: 每个磁盘缓存对象都会需要一小块内存。Squid使用内存来索引磁盘上的数据。当添加新的缓存目录或者增加磁盘缓存大小,都需要确保系统有足够的内存,否则会导致Squid性能急剧下降(当超出物理内存)。
根据所用系统不同,每个在Squid缓存目录中的对象消耗76或112字节内存。内存分配举例: StoreEntry, MD5摘要, LRU策略节点结构。对于小指针(如32位)系统,消耗76字节;对于64位指针的CPU,则消耗112字节。
L1和L2缓存¶
对于ufs, aufs 和 diskd schemes,Squid创建两层目录结构来构建缓存目录。配置中L1和L2参数指定了第一层和第二层目录的数量,默认是 16
和 256
:
对于L1和L2的目录参数配置主要考虑缓存目录总大小和主要缓存文件大小:
Linux文件系统单个目录下存储文件数量有上限限制,特别是单个目录下文件达到极大数量会影响性能
通常我们会确保L2单个目录下文件不至于过多
可选参数¶
Squid的 ufs
存储scheme 可选 cache_dir
参数有2个:
read-only
: 配置cache_dir
是否停止存储新对象(例如存储空间过满)mac-size
: 指定缓存目录中存储对象的最大大小(字节)
备注
其他存储类型可选参数还有其他选项,具体参考 Squid configuration directive cache_dir