Apache 的 htcacheclean 无法扩展:如何驯服巨大的 Apache disk_cache?

fli*_*ght 7 performance ext3 cache apache2

我们有一个带有巨大 disk_cache(> 500.000 个条目,> 50 GB 磁盘空间使用)的 Apache 设置。缓存每天增长 16 GB。

我的问题是缓存的增长速度几乎与从缓存文件系统中删除文件和目录的速度一样快

缓存分区是 iSCSI 存储上的 ext3 文件系统(100GB,“-t news”)。Apache 服务器(充当缓存代理)是一个 VM。disk_cache 配置为 CacheDirLevels=2 和 CacheDirLength=1,并包括变体。典型的文件路径是“/htcache/B/x/i_iGfmmHhxJRheg8NHcQ.header.vary/A/W/oGX3MAV3q0bWl30YmA_A.header”。

当我尝试调用htcacheclean来驯服缓存(非守护进程模式,“htcacheclean-t -p/htcache -l15G”)时,IOwait 正在经历几个小时。没有任何可见的动作。只有在几个小时后,htcacheclean 才开始从缓存分区中删除文件,这需要几个小时。(2009年Apache邮件列表中提出了类似的问题,没有解决:http : //www.mail-archive.com/dev@httpd.apache.org/msg42683.html

高 IOwait 会导致 Web 服务器的稳定性出现问题(连接到 Tomcat 后端服务器的桥有时会停止)。

我想出了我自己的修剪脚本,它从缓存的随机子目录中删除文件和目录。才发现脚本删除率只是略高于缓存增长率。该脚本需要大约 10 秒来读取 a 子目录(例如 /htcache/B/x)并释放大约 5 MB的磁盘空间。在这 10 秒内,缓存又增加了 2 MB。与 htcacheclean 一样,当连续运行修剪脚本时,IOwait 上升到 25%

任何的想法?

  • 这是特定于(相当慢的)iSCSI 存储的问题吗?

  • 我应该为巨大的 disk_cache 选择不同的文件系统吗?分机2?ext4?

  • 这种场景有没有内核参数优化?(我已经尝试了截止日期调度程序和较小的 read_ahead_kb,但没有效果)。

Ale*_*vic 2

10 秒读取 dir 听起来好像您可能没有使用 dir_index

检查与

/sbin/tune2fs /dev/wherever | grep dir_index
Run Code Online (Sandbox Code Playgroud)

如何开启

tune2fs -O dir_index /dev/wherever
Run Code Online (Sandbox Code Playgroud)

但这只会影响新创建的目录,以重新索引所有运行的内容

e2fsck -D -f /dev/wherever
Run Code Online (Sandbox Code Playgroud)