Удаление большого файла или файлов на EXT3 разделе может превратиться в сущий ад на работающей системе. Проблема заключается в том, что при удалении даже не используемых больших файлов, файловый раздел с EXT3 сильно деградирует по производительности и другие дисковые операции серьезно проседают (если не сказать большего — они просто останавливаются). Детально проблема описана в документе HOW TO REMOVE BACKUPS?. Ситуация никак не меняется при использовании CFQ и принудительного выставления приоритета дисковой операции через ionice
.
Указанной проблеме не подвержены разделы с файловой системой EXT4 и XFS. Однако существует приличное количество машин с предустановленными EXT3. В качестве обходного решения предлагается использовать truncate для последовательного сведения размера файла до нулевого размера и последующее его удаление.
К сожалению, в некоторых мамонтах (CentOS5 и RHEL5, например) нет программы truncate
. Пришлось набросать простой PERL скрипт, который каждую четверть секунды урезает требуемый файл до размера в 1GB. После чего его можно безопасно удалить.
#!/usr/bin/env perl # lazy-shrink.pl use strict; use Time::HiRes qw( usleep ); use constant { USLEEP => 250000, # microseconds }; my $filename = shift; if( !defined( $filename ) ) { print STDERR sprintf( "Usage: %s filename", $0 ), "\n"; exit 1; } my $filesize = -s $filename; while( $filesize > 1 * 1024 * 1024 * 1024 ) { $filesize -= 100 * 1024 * 1024; truncate $filename, $filesize; usleep( USLEEP ); }
В конце скрипта целенаправленно не добавлена команда unlink
. В некоторых случаях требуется урезать файл, в который продолжается запись.