Ubuntu 设置了一个 cron 作业,用于查找和删除旧的 PHP 会话:
# Look for and purge old sessions every 30 minutes
09,39 * * * * root [ -x /usr/lib/php5/maxlifetime ] \
&& [ -d /var/lib/php5 ] && find /var/lib/php5/ -depth -mindepth 1 \
-maxdepth 1 -type f -cmin +$(/usr/lib/php5/maxlifetime) ! -execdir \
fuser -s {} 2> /dev/null \; -delete
我的问题是这个过程需要很长时间才能运行,并且有很多磁盘 IO。这是我的 CPU 使用率图表:
清理运行由蓝绿色尖峰表示。在此期间开始时,PHP 的清理作业被安排在默认的 09 和 39 分钟时间。在 15:00,我从 cron 中删除了 39 分钟的时间,因此两倍大小的清理作业运行频率减半(您可以看到峰值宽度加倍,频率减半)。
以下是 IO 时间的相应图表:
和磁盘操作:
在大约有 14,000 个活动会话的高峰期,可以看到清理运行了整整 25 分钟,显然在整个期间使用了 100% 的 CPU 核心和似乎 100% 的磁盘 IO。为什么它如此占用资源?一个ls
会话目录/var/lib/php5
只需要几分之一秒。那么为什么修剪旧会话需要整整 25 分钟?我能做些什么来加快速度吗?
该设备的文件系统目前是 ext4,在 Ubuntu Precise 12.04 64 位上运行。
编辑:我怀疑负载是由于不寻常的过程“fuser”造成的(因为我希望一个简单rm
的东西比我看到的性能更快)。我将删除 fuser 的使用,看看会发生什么。