2

我的一台服务器显然有一个错误的会话垃圾收集例程。结果是会话目录包含数百万个文件。删除这些将需要数周时间,但似乎会话文件夹的增长速度快于文件的删除速度。

我正在分批删除 50000 个文件,这看起来非常有效 - 大约需要 5 分钟。

ls -U -1 | 头-n 50000 | xargs rm -f

尽管如此,当我做一个目录列表(ls -l)时,会话目录似乎在不断增长。

drwx-wx-wt 2 root root 843493376 3 月 6 日 15:36 会话

drwx-wx-wt 2 root root 843530240 3 月 6 日 15:41 会话

所以我的问题是:目录实际上是在增长(尽管在同一时间跨度内从中删除了 50000 个文件)还是 ls 命令从另一个源输出数据?

更新

正如评论中所建议的那样,我移动了无法控制的会话目录。有了一个新的空会话目录和对会话清理脚本的一些更改,现在看起来它工作得很好。

删除旧的会话目录仍然是一项任务,因为我不知道目录中有多少文件,所以很难说它什么时候会是空的。

我意识到删除大量文件会影响服务器的性能,因此我减小了批处理大小并为它编写了一个小脚本。

#!/bin/bash

cleanSession(){
    nice -n 19 ls /var/lib/php/session_old -U -1 | head -n 1000 | xargs -I '{}' rm -f /var/lib/php/session_old/'{}'
    sleep 1
    cleanSession
}

cleanSession

运行此命令会清空 1000 个文件批次中的目录。使用“df .”,它看起来工作缓慢。

文件系统 1K-blocks Used 可用 Use% Mounted on

/dev/sda3 236764896 47035860 177702004 21% /

...

/dev/sda3 236764896 47019528 177718336 21% /

尽管如此,当我列出会话文件夹时,旧会话目录的文件夹大小没有区别。就好像文件夹大小只扩展到最大值。

由于看起来情况已经解决,答案不太重要,但出于好奇,我想知道文件夹大小是如何计算的,以及为什么它没有减少。

4

1 回答 1

0

您可以使用“rm -rf dirName”来删除该目录中的所有文件,但这会对您已经注意到的性能产生影响。

因此,一旦您的目录为空,只需将其删除。它使用的空间将被回收。

您应该了解目录只是一个特殊文件。随着您添加文件,它会增长,如果您删除一些文件,它们的位置将被标记为空并使用我新添加的文件,直到没有更多的空点。所以现在你所做的就是将所有这些数百万个点标记为“空”。在您删除目录之前,它们永远不会被删除。一旦目录为空,它对性能的影响很小。没有比删除单个大文件更大的影响。

于 2013-03-14T20:37:14.813 回答