Yellow Leaf

Yellow Leaf


Поиск по сайту


Вход
Правила портала
Регистрация
Забыли пароль?
О команде проекта
Справка по оформлению постов


Последние комментарии к новостям и статьям
Re: Использование нескольких интернет-каналов для повышения надёжности соединения
Re: Доступн для загрузки пакет с играми для Ubuntu Linux - GamePack 9.10.2
Re: Вышла новая версия библиотеки QRemoteSignal
Re: Организация трансляции потока с веб-камеры с помощью ffserver
Re: Общий принтер в локальной сети на Linux
Ещё комментарии >>>


 


Новые файлы
Debian: cue2tracks_0.2.11_all (Дополнение для CUE 2 Tracks v0.2.11)
Gentoo: cue2tracks-0.2.11 (Дополнение для CUE 2 Tracks v0.2.11)
CUE 2 Tracks v0.2.11
Jabber-Shell 20090303
EasySoft AutoRun 0.4.1


Новое на форуме
Движок сайта. версия 2.0
Не получаеться поднять VPN сервер на Ubuntu server 10.04
Нужен логопед, срочно
Словить процесс
проблемы с разделом жесткого диска


Проекты
Jabber-Shell
Qmmp
QStarDict
PHPSAAdmin


Друзья сайта
 Open Kazan - Казанское сообщество пользователей OpenSource 


Посетителей с 08.09.2006

4736740


Внешний вид портала


RSS-Ленты
Новости
Файлы


 

   
  Яндекс цитирования  

«Жёлтый Лист» - cайт о мире юникс
Новости Форум Статьи Файлы Пользователи
   

Нужна ли Linux дефрагментация?

MooSE 2007-12-11 12:24:27

Программист Сандер Маречал (Sander Marechal) в своём блоге задался вопросом - нужна ли дефрагментация в Linux? Результаты достаточно интересные. Но обо всём по порядку.

Во-первых он предложил воспользоваться простым скриптом, для определения количества фрагментированных файлов и их фрагментов:

#!/usr/bin/perl -w 

#this script search for frag on a fs 
use strict; 

#number of files 
my $files = 0; 
#number of fragment 
my $fragments = 0; 
#number of fragmented files 
my $fragfiles = 0; 

#search fs for all file 
open (FILES, "find " . $ARGV[0] . " -xdev -type f -print0 |"); 

$/ = "\0"; 

while (defined (my $file = <FILES>)) { 
         open (FRAG, "-|", "filefrag", $file); 
         my $res = <FRAG>; 
         if ($res =~ m/.*:\s+(\d+) extents? found/) { 
                 my $fragment = $1; 
                 $fragments += $fragment; 
                 if ($fragment > 1) { 
                         $fragfiles++; 
                 } 
                 $files++; 
         } else { 
                 print ("$res : not understand for $file.\n"); 
         } 
         close (FRAG); 
 } 
close (FILES); 

print ( $fragfiles / $files * 100 . "% non contiguous files, " . $fragments / $files . " average fragments.\n"); 


Этот скрипт нужно сохранить как frag.pl, сделать его исполняемым:

#chmod +x frag.pl

И дальше запускать таким образом:

#./frag.pl <<argument>>

Пример запуска и полученного результата:

# sudo ./frag.pl /root
 Password:
 3.2258064516129% non contiguous files, 1.04838709677419 average fragments.

Проведённые эксперименты показывают что количество фрагментированных файлов обычно не превышает четырёх процентов, а среднее количество фрагментов на файл - меньше двух. Отсюда вывод - дефрагментация хоть и не очень, но всё же нужна.

В качестве самого простого решения для дефрагментации предлагается скрипт, написанный Коном Коливасом (Con Kolivas) - разработчиком знаменитой ck-ветки ядра.

#!/bin/sh
# defrag v0.06 by Con Kolivas <kernel@kolivas.org>
# Braindead fs-agnostic defrag to rewrite files in order largest to smallest
# Run this in the directory you want all the files and subdirectories to be
# reordered. It will only affect one partition.

trap 'abort' 1 2 15

renice 19 $$ > /dev/null

abort()
{
	echo -e "\nAborting"
	rm -f tmpfile dirlist
	exit 1
}

fail()
{
	echo -e "\nFailed"
	abort
}

declare -i filesize=0
declare -i numfiles=0

#The maximum size of a file we can easily cache in ram
declare -i maxsize=`awk '/MemTotal/ {print $2}' /proc/meminfo`
(( maxsize-= `awk '/Mapped/ {print $2}' /proc/meminfo` ))
(( maxsize/= 2))

if [[ -a tmpfile || -a dirlist  ]] ; then
	echo dirlist or tmpfile exists
	exit 1
fi

# Sort in the following order:
# 1) Depth of directory
# 2) Size of directory descending
# 3) Filesize descending

echo "Creating list of files..."

#stupid script to find max directory depth
find -xdev -type d -printf "%d\n" | sort -n | uniq > dirlist

#sort directories in descending size order
cat dirlist | while read d;
do
	find -xdev -type d -mindepth $d -maxdepth $d -printf "\"%p\"\n" | \
		xargs du -bS --max-depth=0 | \
		sort -k 1,1nr -k 2 |\
		cut -f2 >> tmpfile
	if (( $? )) ; then
		fail
	fi

done

rm -f dirlist

#sort files in descending size order
cat tmpfile | while read d;
do
	find "$d" -xdev -type f -maxdepth 1 -printf "%s\t%p\n" | \
		sort -k 1,1nr | \
		cut -f2 >> dirlist
	if (( $? )) ; then
		fail
	fi
done

rm -f tmpfile

numfiles=`wc -l dirlist | awk '{print $1}'`

echo -e "$numfiles files will be reordered\n"

#copy to temp file, check the file hasn't changed and then overwrite original
cat dirlist | while read i;
do
	(( --numfiles ))
	if [[ ! -f $i ]]; then
		continue
	fi

	#We could be this paranoid but it would slow it down 1000 times
	#if [[ `lsof -f -- "$i"` ]]; then
	#	echo -e "\n File $i open! Skipping"
	#	continue
	#fi

	filesize=`find "$i" -printf "%s"`
	# read the file first to cache it in ram if possible
	if (( filesize < maxsize ))
	then
		echo -e "\r $numfiles files left                                                            \c"
		cat "$i" > /dev/null
	else
		echo -e "\r $numfiles files left - Reordering large file sized $filesize ...                \c"
	fi

	datestamp=`find "$i" -printf "%s"`
	cp -a -f "$i" tmpfile
	if (( $? )) ; then
		fail
	fi
	# check the file hasn't been altered since we copied it
	if [[ `find "$i" -printf "%s"` != $datestamp ]] ; then
		continue
	fi

	mv -f tmpfile "$i"
	if (( $? )) ; then
		fail
	fi
done

echo -e "\nSucceeded"

rm -f dirlist

Автор скрипта сразу предупреждает что если вы в качестве загрузчика используете lilo и дефрагментируете раздел, на котором лежит ядро - вам может понадобиться переустановить загрузчик.

Источник

Ключевые слова:linux, дефрагментация

Версия для печати


Комментарии:

ladm 2007-12-11 12:57:49 (*)

# sudo ./frag.pl /root -- Это ты сам делал или из источника взял? просто одно дело офисная машина, а другое - файловый сервер...

[Ответить]


Alex 2007-12-11 12:59:47 (*)

Я бы еще добавил заключение автор статьи. Проведя некоторое количество экспериментов, он выяснил, что фрагментированы в основном большие файлы, а такие каталоги, как /usr и /var (в которых в Gentoo хранится дерево портежей и происходит компиляция) оказались фрагментированы очень незначительно. Поэтому мне кажется, что заявление о необходимости дефрагментации весьма спорно

[Ответить]


MooSE 2007-12-11 14:09:27 (*)

Тут всё взято из источника. Просто там всё больше ссылки, а тут я всё собрал в одну заметку.

[Ответить]


sungreen 2007-12-12 00:53:01 (*)

... а как оно (скриптко) определяет, что его (файло) уже пора того - дефрагментнуть? ...

[Ответить]


MooSE 2007-12-12 11:05:35 (*)

Я вот думаю что всё дело здесь:

open (FRAG, "-|", "filefrag", $file);
my $res = <FRAG>;
if ($res =~ m/.*:\s+(\d+) extents? found/) {
my $fragment = $1;
$fragments += $fragment;
if ($fragment > 1) {
$fragfiles++;
}

Хотя я и не очень сильно знаю перл:)

[Ответить]


geekkoo 2007-12-28 07:18:15 (*)

На мой взгляд, дефрагментация не нужна.
http://lj.rossia.org/users/geekkoo/8612.html

[Ответить]


Анонимный посетитель 2009-07-27 05:31:47 (*)

Может для кого - то дефрагментация и не нужна, но мне пришлось дефрагментировать XFS тк при уровне фрагментации более 87 % у меня на ноуте скорость чтение запись упала до 2 м/с, после дефрагментации вернулась на уровень 20-22 м/с.

[Ответить]


MooSE 2009-07-27 08:37:16 (*)

А как проводил дефрагментацию?

[Ответить]


Содержание*:
=

При копировании материалов с этого сайта ссылка на источник обязательна! Уважайте труд авторов!


Если материалы с этого сайта оказались вам полезны - Вы можете поддержать этот проект переведя на его счёт любую сумму, какую сочтёте нужным.

рублей


Обратная связь


© 2006-2010 Вадим Калинников aka MooSE
Сайт размещён на VPS от Агава