LINUX.ORG.RU

Сильная фрагментация раздела? Или что?


0

0

Предыстория. Есть у меня старый жесткий диск и на наем раздел на 27 Гб. Купил я новый и создал на нем раздел на 200 Гб и решил со старого на новый скопировать. Копировал примитивно и тупо cp -R /old/mount/point /new/device/path. И копировались у меня эти жалкие 27 Гб часа полтора (а то и больше, точно не засекал). Конечно, меня это сильно удивило и я решил маленько потестить скорость дисков. Тут и начинается история.

Первым делом померил скорость hdparm'ом


wieker@localhost:~$ sudo hdparm -tT /dev/sda

/dev/sda:  #старый жесткий диск
 Timing cached reads:   2044 MB in  2.00 seconds = 1022.35 MB/sec
 Timing buffered disk reads:  170 MB in  3.02 seconds =  56.22 MB/sec
wieker@localhost:~$ sudo hdparm -tT /dev/sdb

/dev/sdb:  #новый жесткий диск
 Timing cached reads:   2100 MB in  2.00 seconds = 1049.61 MB/sec
 Timing buffered disk reads:  314 MB in  3.01 seconds = 104.46 MB/sec

Видно, что скорость очень приличная. После я измерил скорость чтения радела с помощью dd:

wieker@localhost:~$ time sudo dd if=/dev/sda1 > /dev/null
57014622+0 записей считано
57014622+0 записей написано
 скопировано 29191486464 байта (29 GB), 521,91 c, 55,9 MB/c

real	8m41.983s
user	0m21.181s
sys	1m6.608s
wieker@localhost:~$ 

Как видно, эта операция показала скорость абсолютно идентичную hdparm. То есть скорость самого диска, действительно, высока. Затем я измерил скорость чтения одного файла с этого раздела. И посчитал, какова скорость в Мб/сек

wieker@localhost:~$ time cat /old/mount/point/big_file > /dev/null

real	5m6.579s
user	0m0.012s
sys	0m1.496s
wieker@localhost:~$ ls -l /old/mount/point/big_file
-rw-r--r-- 1 wieker wieker 1462684041 Апр  1 05:14 /old/mount/point/big_file
wieker@localhost:~$ calc
1462684041/306.579/1024/1024;
4.549966  #скорость в МБ/сек
wieker@localhost:~$

Контрольно, определил скорость чтения с нового жесткого диска.

wieker@localhost:~$ time cat /new/device/path/big_file > /dev/null

real	0m13.478s
user	0m0.000s
sys	0m0.808s
wieker@localhost:~$calc
1462684041/13.478/1024/1024;
103.496381  #скорость в МБ/сек
wieker@localhost:~$ 

Как видно скорость чтения файла с вновь созданного раздела равна скорости диска, скорость же чтения файла со старого раздела почти в 14 раз меньше скорости диска. Старому разделу уже около 5 лет, файлы на нем постоянно удалялись, перезаписывались, создавались. Видимо, это приводило к сильной фрагментации, из-за чего и упала скорость.

Или есть другие объяснения этому странному поведению?

★★

Последнее исправление: wieker (всего исправлений: 2)

Ответ на: комментарий от megabaks

ext3. торренты во время экспериментов запущены не были, но да, разделы в основном заполнялись ими.

wieker ★★
() автор топика
Ответ на: комментарий от megabaks

А чем посмотреть фрагментацию? Помню под ядро 2.4 была тулза (даже с GUIней) с названием DAV что-то там, но нагуглить никак не могу...

wieker ★★
() автор топика
Ответ на: комментарий от wieker

она и под 2.6 есть - правда завести не удалось )))
а вообще
filefrag путь/до/файла

megabaks ★★★★
()
Ответ на: комментарий от wieker

а вот хз )
можно попробовать скрипт типа этого

#!/bin/sh
# defrag v0.07 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.
# Are you really crazy enough to be using this? It might blow your data
# into tiny little useless chunks.

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`*1024))
(( 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
# I made this crap up. I'ts completely unvalidated.

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

megabaks ★★★★
()
Ответ на: комментарий от sdio

сам факт перехода на любую фс убирает фрагментацию..вместе с файлами %)
нужно же реанимировать имеющуюся - мимо!

megabaks ★★★★
()
Ответ на: комментарий от megabaks

Ну дык на будущее, раз уж все-равно делать бэкап/рестор

sdio ★★★★★
()
Ответ на: комментарий от megabaks

Этот скрипт бесполезен на разделе убитом торрентами, т.к. на нем, с вероятностью стремящейся к 1, все свободное пространство фрагментированно на мелкие куски.

sdio ★★★★★
()
Ответ на: комментарий от megabaks

А можно и самому написать что-нибудь на Си - нашел занятие на выходные. Только вот непонятно оптимальное расположение файлов на дефрагментированном диске. Если их просто упаковать, то малейшие изменения приведут быстро к еще более сильной фрагментации. Короче попробую погуглить статьи на scholar.google.com, может кто-то из CS'ников этим занимался.

wieker ★★
() автор топика
Ответ на: комментарий от megabaks

Может скопировать нужное, забить нулями и удалить ненужные файлы командой shred -n1 -zu

anonymous
()

лучше научится не фрагментировать до такой степени, найти торрент клиент умеющий правильно резервировать место или хотя бы не создающий 100500 фрагментов на 1 большой файл

theurs ★★
()
Ответ на: комментарий от megabaks

Quote:

а без упса не?

Неа. Консистентность при внезапном отключении она сохранит, но все открытые на запись файлы забьёт нулями.

GotF ★★★★★
()
Ответ на: комментарий от Lumi

на корне reiserfs - пока устраивает
подожду пока её оттестят :)

megabaks ★★★★
()
Ответ на: комментарий от iZEN

Судя по выхлопу e4defrag, запущенному «на лету», он таки реализован.

Lumi ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.