Автоматическая дефрагментация раздела xfs в Debian

Как то раз я решил сделать копию данных с домашнего компьютера на сервер и столкнулся с жуткими тормозами. Как показало исследование диск был очень сильно фрагментирован (судя по выводу xfs_db аж на 98%), с такой фрагментацией теряют скорость исполнения все дисковые операции (даже удаление файла может затянуться на несколько минут). Естественно, в этом нет ничего хорошего, поэтому был определен следующий план действий: во-первых, определить программу, которая создает фрагментацию, во-вторых, найти решение проблемы.

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

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

Скрипт прописывается в cron и при выполнении пишет лог в /var/log/defrag.log, а также отсылает сообщения на e-mail.

#!/bin/bash
LOGLOCATION="/var/log/defrag.log"
LOGDATE=`date +"%d-%m-%y"`
ACTIONTIME=`date +"%H:%M:%S"`
mail -s "Defragmentation started" root@localhost
echo "--------------------------------------------" >> $LOGLOCATION
echo "Defragmentation started at $LOGDATE" >> $LOGLOCATION
echo "--------------------------------------------" >> $LOGLOCATION
ACTIONTIME=`date +"%H:%M:%S"`
echo "[$ACTIONTIME] Stop deluged" >> $LOGLOCATION
/etc/init.d/deluge-daemon stop >> $LOGLOCATION
ACTIONTIME=`date +"%H:%M:%S"`
echo "[$ACTIONTIME] Start analysing hdd" >> $LOGLOCATION
/usr/sbin/xfs_db -r -c frag /dev/sda6 >> $LOGLOCATION
ACTIONTIME=`date +"%H:%M:%S"`
echo "[$ACTIONTIME] Start defragmentation" >> $LOGLOCATION
/usr/sbin/xfs_fsr -v /dev/sda6 >> $LOGLOCATION
ACTIONTIME=`date +"%H:%M:%S"`
echo "[$ACTIONTIME] Start analysing after defragmentation" >> $LOGLOCATION
/usr/sbin/xfs_db -r -c frag /dev/sda6 >> $LOGLOCATION
ACTIONTIME=`date +"%H:%M:%S"`
echo "[$ACTIONTIME] Start deluged" >> $LOGLOCATION
/etc/init.d/deluge-daemon start >> $LOGLOCATION
ACTIONTIME=`date +"%H:%M:%S"`
echo "[$ACTIONTIME] Will done." >> $LOGLOCATION

Соответствующая строка в cron будет выглядеть так:

1 8 * * 0 bash /etc/cron.d/defrag

Или просто можно кинуть файлик в папку /etc/cron.weekly.

Запись опубликована в рубрике Debian, Linux с метками , , , . Добавьте в закладки постоянную ссылку.

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *