Удаление большого файла или файлов на 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
. В некоторых случаях требуется урезать файл, в который продолжается запись.
http://blog.unixstyle.ru/200/udalenie-bolshogo-fayla-s-ext3-razdela-bez-ostanovki-sistemyi/