Удаление большого файла с EXT3 раздела без остановки системы

Удаление большого файла или файлов на 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. В некоторых случаях требуется урезать файл, в который продолжается запись.

Добавить комментарий

Ваш e-mail не будет опубликован.