我已经使用默认选项安装了ext3文件系统。在上面,我有一些〜100GB的文件。
删除任何此类文件都需要很长时间(8分钟),并且会导致大量io流量,这会增加服务器上的负载。
有什么方法可以使公司不那么混乱?
我已经使用默认选项安装了ext3文件系统。在上面,我有一些〜100GB的文件。
删除任何此类文件都需要很长时间(8分钟),并且会导致大量io流量,这会增加服务器上的负载。
有什么方法可以使公司不那么混乱?
Answers:
最有趣的答案最初埋在对该问题的评论中。这是使它更加可见的一流答案:
基本上,这里没有方法可行,因此我们开发了自己的方法。在此处进行了描述:http : //www.depesz.com/index.php/2010/04/04/how-to-remove-backups/ – depesz 2010年4月6日15:15
该链接是对探索和发现可行解决方案的难以置信的全面分析。
另请注意:
文章说:
如您所见,我
-c2 -n7
对ionice 使用了选项,这似乎很理智。
的确如此,但用户TafT表示,如果您不希望受到干扰,那么-c3
“空转”将比-c2
“尽力而为” 更好。他曾经-c3
在后台进行构建,并且发现它可以很好地工作而不会导致构建一直等待。如果您确实有100%的io使用率,-c3
则不会让删除操作完全完成,但是他不希望这是您根据实际测试得出的结果。
您可以尝试一下ionice。它不会使速度更快,但可能会减少破坏力。
就效率而言,每个文件使用一个rm并不是最佳选择,因为每个rm都需要fork和exec。
假设您有一个list.txt包含要删除的文件,这样做会更有效,但是仍然很慢:
xargs -i rm {} < list.txt
另一种方法是:(
nice -20 xargs -i rm {} < list.txt
这将花费更少的时间,但是会大大影响您的系统:)
要么
我不知道这有多快,但是:
mv <file-name> /dev/null
要么
使用快速文件系统(使用循环设备?)创建一个特殊的挂载点,并使用该挂载点存储和删除庞大的文件。
(也许在删除文件之前将文件移到那里,也许速度更快,或者当您希望文件消失时只是将其卸载)
要么
cat /dev/null > /file/to/be/deleted
(现在大小为零),如果您希望它rm -rf <file>
现在消失
或者甚至更好
放下猫,然后做 # > /file/to/be/emptied
我在以合理的速度删除目录时遇到了问题,结果是进程锁定了磁盘并创建了尝试访问磁盘的大量进程。ionice不能正常工作,它只是继续使用99%的磁盘IO并将所有其他进程锁定。
这是对我有用的Python代码。它一次删除500个文件,然后休息2秒钟让其他进程执行其工作,然后继续。效果很好。
import os, os.path
import time
for root, dirs, files in os.walk('/dir/to/delete/files'):
file_num = 0
for f in files:
fullpath = os.path.join(root, f)
os.remove(fullpath)
if file_num%500 == 1:
time.sleep(2)
print "Deleted %i files" % file_num
file_num = file_num + 1
我的两分钱。
我已经有这个问题了。“在必须快速运行的顺序脚本中,该过程确实删除了很多文件” ..因此,“ rm”将使该脚本速度接近IO等待/执行时间。
为了使事情更快,我添加了每个cron启动的另一个进程(bash脚本)。像垃圾收集器一样,它删除特定目录中的所有文件。
然后,我通过用mv将“ rm”替换为“垃圾文件夹”来更新了原始脚本(通过在文件名的末尾添加一个计数器来重命名文件以避免冲突)。
这对我有用,脚本运行至少快3倍。但是仅当垃圾文件夹和原始文件位于同一安装点(同一设备)下以避免文件复制时,该方法才有效。(同一设备上的mv消耗的IO低于rm)
希望有帮助。
您可以尝试创建一个循环文件系统来存储备份。
# dd if=/dev/zero of=/path/to/virtualfs bs=100M count=1024 # 100 MB * 1024 = 100 GB
# mke2fs /path/to/virtualfs
# mount -t ext2 /path/to/virtualfs /mnt/backups -o loop
然后,当您要清除备份时:
# umount /mnt/backups
# mke2fs /path/to/virtualfs
# mount -t ext2 /path/to/virtualfs /mnt/backups -o loop
快点!整个虚拟文件系统很快就会被清除。
/ dev / null是文件而不是目录。无法将文件移到文件中,否则可能会覆盖它。
实际上,这是一种设备,写入其中的所有数据都会被丢弃,因此mv <file> /dev/null
很有意义
在类似Unix的操作系统中,免费百科全书来自Wikipedia,/ dev / null或null设备是一个特殊文件,该文件会丢弃所有写入其中的数据(但报告写操作成功),并且不向任何进程提供任何数据从中读取(立即产生EOF)。[1]